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 sie dann ausschaltet, wenn sie das Zeitlimit überschreiten. Ich starte Clean_Up, 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 So ist es eine Woche oder so ohne irgendwelche Probleme gewesen, ich habe jedoch bemerkt, dass einige der Akten begonnen haben, ein wenig größer zu werden.
Ich glaube, das liegt daran, dass die Änderungshistorie 30 Tage lang aufbewahrt wird. Ich habe dies auf 1 Tag reduziert, um die Dateigröße niedrig zu halten.
Die Liste der freigegebenen Benutzer enthält keine zusätzlichen Benutzer mehr, und die Dateien funktionieren einwandfrei.
Update: 17.09.15 Die Dateien behalten die gleiche Größe, von der die Benutzer keine Leistungseinbußen bemerkt haben. Ich habe keine Arbeit an den Dateien zu tun, um aufblähen zu bereinigen. Dies scheint die Probleme behoben zu haben.
Update: 27.03.17 Die ursprüngliche Antwort oben hat gut funktioniert, bis wir wirklich begonnen haben, diese Arbeitsmappen voranzutreiben. Wir haben jetzt ungefähr 150 Benutzer, die jede Woche Tausende von Änderungen an diesen Arbeitsmappen vornehmen. Zu diesem Zeitpunkt hatten wir wieder Probleme.
Deshalb habe ich wöchentlich zusätzlichen Code hinzugefügt, um die Freigabe der Arbeitsmappen aufzuheben, und dann die Arbeitsmappe erneut freizugeben, wenn sie am Sonntag zum ersten Mal geöffnet werden. Dies behebt alle anderen Probleme, die dazu führen können, dass die Arbeitsmappe beschädigt wird.
Ich habe den letzten Teil vor ungefähr einem Jahr hinzugefügt und da wir überhaupt keine Probleme hatten. Hier ist der letzte Teil meines Codes mit Kommentaren, um es zu erklären. Fügen Sie dies einfach einem Modul hinzu und rufen Sie die Routine SundayMaintenance im 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 Zu dieser Antwort habe ich die kleine Änderung von Smirkingman 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 immer noch nicht mit den Funktionen einer freigegebenen Arbeitsmappe übereinstimmt.