2017-03-02 2 views
0

ich in einer Arbeitsmappe geöffnet Ereignis den folgenden VBA-Code verwende:VBA Automatisches Speichern der Arbeitsmappe alle 10 Sekunden, ohne die Arbeitsmappe zu aktivieren?

Private Sub Workbook_Open() 
On Error GoTo Message 

Application.AskToUpdateLinks = False 
ThisWorkbook.UpdateLinks = xlUpdateLinksNever 
ActiveSheet.DisplayPageBreaks = False 
Application.ScreenUpdating = False 
Application.DisplayAlerts = False 



    Dim currentTime As Date 
    currentTime = DateAdd("s", 10, Now) 
    Call CurUserNames 
    Application.OnTime currentTime, "SaveFile" 

Exit Sub 
Message: 
Application.DisplayAlerts = False 
Exit Sub 

End Sub 

ich diesen Code auch in einem Modul haben:

Public Sub SaveFile() 

On Error GoTo Message 


    ThisWorkbook.Save 

    Dim currentTime As Date 
    currentTime = DateAdd("s", 10, Now) 

    Application.OnTime currentTime, "SaveFile" 

    Exit Sub 
Message: 
Application.DisplayAlerts = False 
Exit Sub 

End Sub 

Was jeder meiner Arbeitsmappe zu tun Ich versuche, automatisch speichern ist 10 Sekunden.

Das funktioniert.

Aber etwas ziemlich ärgerlich ist mir aufgefallen. Wenn ein Benutzer diese Arbeitsmappe im Hintergrund geöffnet hat und an einer anderen Excel-Arbeitsmappe arbeitet, wird diese Arbeitsmappe beim Speichern aktiviert und über der anderen Arbeitsmappe angezeigt.

Dies kann für den Benutzer ziemlich ärgerlich sein. Gibt es eine Möglichkeit, meine Arbeitsmappe zu speichern, ohne die Arbeitsmappe zu aktivieren?

S.S. Aus einem unbekannten Grund verursacht dies auch, dass die Arbeitsmappe erneut geöffnet wird, wenn sie geschlossen wurde.

EDIT:

Liste aktive Benutzer in Arbeitsmappe Code:

Sub CurUserNames() 

Dim str As String 
Dim Val1 As String 

str = "Users currently online:" & Chr(10) 

For i = 1 To UBound(ThisWorkbook.UserStatus) 
    str = str & ThisWorkbook.UserStatus(i, 1) & ", " 
Next 

Val1 = DeDupeString(Mid(str, 1, Len(str) - 2)) 


Worksheets("Delivery Tracking").Range("F4").Value = Val1 


End Sub 


Function DeDupeString(ByVal sInput As String, Optional ByVal sDelimiter As String = ",") As String 

    Dim varSection As Variant 
    Dim sTemp As String 

    For Each varSection In Split(sInput, sDelimiter) 
     If InStr(1, sDelimiter & sTemp & sDelimiter, sDelimiter & varSection & sDelimiter, vbTextCompare) = 0 Then 
      sTemp = sTemp & sDelimiter & varSection 
     End If 
    Next varSection 

    DeDupeString = Mid(sTemp, Len(sDelimiter) + 1) 

End Function 
+0

10 Sekunden ist unglaublich häufig, warum nicht eine Bedingung hinzufügen, um zu sehen, ob die Arbeitsmappe tatsächlich * aktiv * ist, und überspringt das Speichern sonst? Wenn die Arbeitsmappe geändert wird, ist sie aktiv und wird alle 10 Sekunden gespeichert. Aus Interesse, warum so erstaunlich häufig? – Wolfie

+0

@Wolfie Ich brauche es, um häufig zu sein, weil Benutzer auf die Arbeitsmappe zugreifen können, weil es freigegeben ist, und in einer Zelle listet ich alle aktiven Benutzer auf. Dies wird jedoch nur aktualisiert, wenn die Arbeitsmappe häufig gespeichert wird. – user7415328

+1

Re: Unknown Grund: Wenn Sie den Zeitplan 'OnTime' nicht löschen, wenn das Ereignis' Workbook_Close' ausgelöst wird, wird es erneut geöffnet, um den Zeitplan fortzusetzen. Es gibt Hunderte von Beispielen dafür. Anstatt die Datei alle 10 Sekunden blind zu speichern, testen Sie auch, ob sich zuerst alles geändert hat und ob es gespeichert wurde. 'ThisWorkbook.Saved' wird auf' False' gesetzt, wenn sich die Datei geändert hat. – CLR

Antwort

0

Th9is Beispiel von How can I get list of users using specific shared workbook?

kommt Es ist ein wenig übertrieben. Es erstellt eine neue Arbeitsmappe, in die der Name des Benutzers eingefügt werden kann. Sie können sie jedoch ändern, um die Namen in das Blatt und die gewünschten Zellen einzufügen.

In das Blattmodul unter dem Auswahländerungsmodul einfügen. Dann wird es jedes Mal aktualisiert, wenn der Benutzer in eine andere Zelle wechselt. Wenn es offen ist und er nicht an seinem Schreibtisch ist - es tut nichts.

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

End Sub 

An der Unterseite ist der Code aus dem obigen Link, die Sie ändern können Ihre eigenen Bedürfnisse anpassen. Es wird 1000 Mal besser sein als das Speichern einer Arbeitsmappe alle zehn Sekunden. Das kann selbst 3 oder 4 Sekunden dauern.

Wenn Sie keine Auswahländerung im Arbeitsblattmodul verwenden möchten, können Sie Ihren Code in das Arbeitsmappenmodul Private Sub Workbook_Open() einfügen und auf einen Zeitgeber setzen, der alle 10 Sekunden ausgeführt wird. Es dauert nur einen Bruchteil einer Sekunde statt mehrerer Sekunden.

users = ActiveWorkbook.UserStatus 
With Workbooks.Add.Sheets(1) 
    For row = 1 To UBound(users, 1) 
     .Cells(row, 1) = users(row, 1) 
     .Cells(row, 2) = users(row, 2) 
     Select Case users(row, 3) 
      Case 1 
       .Cells(row, 3).Value = "Exclusive" 
      Case 2 
       .Cells(row, 3).Value = "Shared" 
     End Select 
    Next 
End With 
1

Benutzer einer freigegebenen Arbeitsmappe können im Ribbon und klicken Sie auf die Shared Workbook Symbol in der Changes Gruppe sehen Who has this workbook open now: nur auf die Review Registerkarte, indem Sie. Dies öffnet das Dialogfeld Shared Workbook, in dem die Registerkarte Editing' shows * Wer hat diese Arbeitsmappe jetzt geöffnet: `*.Zusätzlich kann der Registerkarte ‚Fortschritt‘ verwendet werden, die Einstellungen mit dem Umgang zu aktualisieren:

  • Änderungen verfolgen
  • Update ändert
  • Widersprüchliche Änderungen zwischen Benutzern
  • Fügen Sie in der persönlichen Ansicht

enter image description here

Verwandte Themen