Für meine Lösung habe ich ein Makro erstellt, das alle benutzerdefinierten Ansichten löscht und vergleicht, wie lange ein Benutzer inaktiv war, und kickt ihn dann heraus, wenn er die Zeit überschreitet. Ich führe Clean_Up aus, wenn die Dateien geöffnet werden.
Sub Clean_Up() 'Clean up Extra Data to prevent file from being sluggish Dim cv As CustomView For Each cv In ActiveWorkbook.CustomViews cv.Delete Next cv SharedUserCheck End Sub Sub SharedUserCheck() 'Remove old users to speed up shared workbook Dim TimeStart As Date Dim TimeLimit As Date Dim SharedDuration As Date Dim Users As Variant Dim UserCount As Integer 'Set time limit here in "HH:MM:SS" TimeLimit = TimeValue("02:00:00") Users = ActiveWorkbook.UserStatus For UserCount = UBound(Users) To 1 Step -1 TimeStart = Users(UserCount, 2) SharedDuration = Now - TimeStart If SharedDuration > TimeLimit Then 'MsgBox (Users(UserCount, 1) & " has been inactive for " & Application.Text(SharedDuration, "[hh]:mm") & " and will now be removed from the workbook.") ThisWorkbook.RemoveUser (UserCount) End If Next End Sub
Update: 01.09.15 Es war also ungefähr eine Woche ohne Probleme. Ich habe jedoch bemerkt, dass einige Dateien etwas größer geworden sind.
Ich glaube, das liegt daran, dass es 30 Tage lang eine Änderungshistorie hat. Ich habe dies auf 1 Tag reduziert, um die Dateigröße gering zu halten.
Es gibt keine zusätzlichen Benutzer mehr in der Liste der gemeinsam genutzten Benutzer und die Dateien funktionieren einwandfrei.
Update: 17.09.15 Die Dateien haben die gleiche Größe, dass die Benutzer keine Leistungseinbußen bemerkt haben. Ich musste nicht an den Dateien arbeiten, um aufgebläht zu werden. Dies scheint die Probleme behoben zu haben.
Update: 27.03.17 Die ursprüngliche Antwort oben hat gut funktioniert, bis wir wirklich angefangen haben, diese Arbeitsmappen zu pushen. Wir haben jetzt ungefähr 150 Benutzer, die jede Woche Tausende von Änderungen an diesen Arbeitsmappen vornehmen. Zu diesem Zeitpunkt hatten wir wieder Probleme.
Also habe ich zusätzlichen Code hinzugefügt, um die Arbeitsmappen wöchentlich freizugeben, und dann die Arbeitsmappe erneut zu veröffentlichen, wenn sie am Sonntag zum ersten Mal geöffnet werden. Dadurch werden alle anderen Probleme behoben, durch die die Arbeitsmappe möglicherweise beschädigt wird.
Ich habe den letzten Teil vor einem Jahr hinzugefügt und seitdem haben wir keine Probleme mehr. Hier ist der letzte Teil meines Codes mit Kommentaren, um es zu erklären. Fügen Sie dies einem Modul hinzu und rufen Sie die SundayMaintenance-Routine für das Workbook_Open-Ereignis auf:
Public Sub RemoveOtherUsers() 'Remove all other users to prevent access violation Dim Users As Variant Dim UserCount As Integer Users = ThisWorkbook.UserStatus For UserCount = UBound(Users) To 1 Step -1 If Users(UserCount, 1) <> Application.UserName Then ThisWorkbook.RemoveUser (UserCount) End If Next End Sub Public Sub SundayMaintenance() Application.ScreenUpdating = False 'On every Sunday the first time the sheet is opened clear out extra data and extra sheets If (WeekdayName(Weekday(Date)) = "Sunday") And (Sheets(1).Cells(3, "AG").Value < Date) Then 'Disconnect other users as a precaution RemoveOtherUsers Application.DisplayAlerts = False 'Unshare to clear extra data out ThisWorkbook.UnprotectSharing ("Whatever Password") Application.DisplayAlerts = True 'Set Change History to 1 day to prevent build up of junk in the file With ThisWorkbook If .KeepChangeHistory Then .ChangeHistoryDuration = 1 End If End With 'Store Last Date Unshared and Cleared to prevent multiple unshare events on sunday. Sheets(1).Cells(3, "AG").Value = Date 'Delete all extra sheets that were added by mistake and have the word sheet in them For Each WS In ThisWorkbook.Worksheets If UCase(WS.Name) Like "Sheet" & "*" Then Application.DisplayAlerts = False WS.Delete Application.DisplayAlerts = True End If Next 'Reshare Application.DisplayAlerts = False ThisWorkbook.ProtectSharing Filename:=ThisWorkbook.FullName, SharingPassword:="Whatever Password" Application.DisplayAlerts = True End If Application.ScreenUpdating = True End Sub
Update: 23.07.18 Ich habe die Antwort von smirkingman zu dieser Antwort hinzugefügt. Wir führen diesen Code weiterhin in unseren freigegebenen Arbeitsmappen aus, und sie stürzen nicht ab und werden wie erwartet ausgeführt. Wir führen auch die neueste SharePoint-Version aus, die noch immer nicht zu den Funktionen einer freigegebenen Arbeitsmappe passt.