Wie verhindern Sie die Beschädigung gemeinsam genutzter Excel-Dateien?

4651
Matthew Lozoya

Ich habe etwa 10 freigegebene, makroaktivierte Excel-Dateien, die ca. 30-50 Benutzer mehrmals täglich ändern. Im Laufe der Zeit werden die Dateien durch Excel-Dateien aufgebläht und aufgebläht, da sie der Meinung sind, dass Benutzer sie noch verwenden, obwohl sie dies nicht tun. Wenn ich die Dateien gelegentlich nicht freigebe und erneut freigebe, werden sie schließlich beschädigt.

Meine Frage ist, wie man dies am besten verhindern kann.

Meine ursprüngliche Idee war, ein Makro zu schreiben, das alle Dateien freigegeben hat, und dann erneut freigegeben, um den Müll zu beseitigen. Der Nachteil ist, dass es alle aktuellen Benutzer rausschmeißen würde, also habe ich mich dagegen entschieden.

Nachdem ich eine Weile darüber nachgedacht hatte, fand ich eine mögliche Lösung. Bitte kritisieren Sie meine Antwort und helfen Sie mir, sie zu verbessern. Wenn Sie eine bessere Lösung haben, lassen Sie es mich wissen.

1
Wie wird es geteilt? Verwenden Sie sharepoint und lassen Sie die Dokumente einchecken und auschecken. Raystafarian vor 9 Jahren 0
Sie wird über die Option Arbeitsmappe freigeben auf der Registerkarte Überprüfung freigegeben. Wenn wir Excel zum Öffnen der Datei in einem Share Point verwenden, wird die Datei für einen Benutzer gesperrt. Daher können wir diese Funktion nicht verwenden. Matthew Lozoya vor 9 Jahren 0

1 Antwort auf die Frage

3
Matthew Lozoya

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.

In Ihrem Beispiel gibt es einen subtilen Fehler. Wenn Sie einen Benutzer entfernen, ändert sich die Array-Größe, sodass Sie die Benutzer "rückwärts" scannen sollten: Für UserCount = UBound (Benutzer) bis 1 Schritt -1 smirkingman vor 7 Jahren 1
Wow, das ist definitiv die Grenzen von Excel oder sogar Access für diese Angelegenheit. Freut mich zu hören, dass es für Sie funktioniert. Wir sind daran interessiert, einige Arbeitsmappen zu teilen, aber die meisten Berichte darüber sind nicht so positiv. Die meisten Leute sagen einfach, dass das Teilen "defekt" ist, aber wenn Microsoft so etwas einfügt (vielleicht mit einer Eingabeaufforderung, die den Benutzer fragt, ob er weiterarbeiten und das ausführen möchte, wenn er nicht beantwortet wird), ist dies möglicherweise eine nützliche Funktion. GlennFromIowa vor 7 Jahren 0
Ja, es funktioniert eigentlich ganz gut, jetzt, da unser Unternehmen zu SharePoint wechseln wollte, aber die Funktionen von SharePoint können nicht einmal mit der Freigabe in Excel verglichen werden, daher bleiben wir bei meiner Lösung Matthew Lozoya vor 7 Jahren 0
@ smirkingman Ich habe Ihre Korrektur zu der Antwort hinzugefügt, die ich vor einiger Zeit beabsichtigt hatte, aber ich glaube, ich habe es einfach vergessen. Matthew Lozoya vor 6 Jahren 0