2017-02-02 2 views
0

Ich verwende die folgenden Makro, um alle aktiven Benutzer in einer aktiven Arbeitsmappe zur Zeit zu erhalten und in der Liste:VBA erhalten aktive Benutzer von freigegebenen Workbokook, Liste mit Komma und Auto-Update-Zelle?

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 

ich diesen Code leite auf Arbeitsmappe geöffnet und Arbeitsmappe vor dem Schließen.

Auf Arbeitsmappe geöffnet

Private Sub Workbook_Open() 
On Error GoTo Message: 

Application.DisplayAlerts = False 
Worksheets(1).Activate 
Worksheets(1).Rows("6:6").Select 
ActiveWindow.FreezePanes = True 



Call CurUserNames 

Range("F4").Calculate 
ThisWorkbook.Save 
Application.Calculation = xlManual 
Application.CalculateBeforeSave = False 

Application.DisplayAlerts = True 

Exit Sub 

Message: 
Application.DisplayAlerts = False 

Exit Sub 
End Sub 

Vor Schließen

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
On Error GoTo Message: 
Application.DisplayAlerts = False 
Call CurUserNames 
Range("F4").Calculate 
ThisWorkbook.Save 
Application.DisplayAlerts = True 
Exit Sub 
Message: 
Application.DisplayAlerts = False 
Exit Sub 
End Sub 

Ich möchte zwei Dinge erreichen.

Ich möchte meine Zelle F4 automatisch mit allen Benutzern aktualisieren, die derzeit in der Arbeitsmappe an-/abgemeldet sind. Ich möchte, dass dies in Echtzeit geschieht, ohne dass meine Tabelle verlangsamt wird. Im Idealfall bedeutet dies, dass bei Änderungen des Arbeitsblattwechsels nicht ständig ein neues Ereignis auftritt, das ständig überprüft wird.

Im Moment kann der Benutzer das Zellenupdate nur sehen, wenn sie speichern drücken.

Bitte kann jemand mir einen besseren Weg zeigen, dies zu tun, damit es tut, was ich brauche?

bearbeiten 3:

Auch, wie kann ich den Code ändern, bestimmte Benutzer-Namen zu finden,

dh Mark Smith oder Katherine Jones in der Kette und beide Vorkommen dieser Namen zu ändern, um ein Vorkommen von Administrator etwa so:

Mark Smith, Katherine Jones, Linda Harper, John Doe 

zu

Administrator, Linda Harper, John Doe 

Ich würde mich über die Hilfe sehr freuen. Dank

Der Code vorgeschlagen von @ User3598756 zeigt noch wie folgt aus:

Administrator, Administrator, Linda Harfner, John tut

Das ist falsch

+0

für das lat Problem verwenden 'Val1 = Ersetzen (Val1," Mark Smith "," Administrator ")' – user3598756

+0

@ user3598756 Danke, das ist großartig, aber wissen Sie, ob ich zwei Namen ersetzen kann? Mark Smith oder Katherine Jones und haben beide ein Display als Hauptbüro, wenn sie beide eingeloggt sind? Siehe Bearbeiten in Frage – user7415328

+0

fügen Sie eine weitere Aussage hinzu: 'Val1 = Ersetzen (Val1," Katherine Jones "," Administrator ")'. – user3598756

Antwort

0

Ok. Das einzige verbleibende Problem ist, dass Mark und Catherine als "Administrator" erscheinen sollen. Ich würde simly eine andere, wenn Schleife innerhalb des ursprünglichen for-Schleife wie folgt hinzu:

For i = 1 To UBound(ThisWorkbook.UserStatus) 
    if ThisWorkbook.UserStatus(i, 1) = "Mark Smith" or _ 
      ThisWorkbook.UserStatus(i, 1) = "Katherine Jones" then 
      str = str & "Administrator, " 
    else 
      str = str & ThisWorkbook.UserStatus(i, 1) & ", " 
Next 

Denken Sie daran, dass die von Benutzerstatus gemeldet Namen müssen genau übereinstimmen mit dem, was Sie suchen. In dem Namen, den userstatus zurückgibt, kann beispielsweise ein Leerzeichen oder ein Zeilenende-Zeichen oder eine Anomalie vorkommen, die für "Mark Smith" genau das Gegenteil ergibt. Aber ich habe keine Arbeitsmappen, deshalb kann ich das nicht testen.

+0

Dank funktioniert super – user7415328

Verwandte Themen