Wie verhindern Sie die Beschädigung freigegebener Excel-Dateien?

1

Ich habe 10 oder so Shared Macro Enabled Excel-Dateien, die etwa 30-50 Benutzer täglich mehrmals ändern. Im Laufe der Zeit geraten die Dateien ins Stocken und sind aufgebläht von dem Gedanken, dass Benutzer sie immer noch verwenden, obwohl dies nicht der Fall ist. Wenn ich die Dateien gelegentlich nicht freigebe und erneut freigebe, werden sie schließlich beschädigt.

Meine Frage ist, wie dies am besten verhindert werden kann.

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

Nachdem ich eine Weile darüber nachgedacht hatte, kam ich auf 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 bitte wissen.

Matthew Lozoya
quelle
Wie wird es geteilt? Verwenden Sie Sharepoint und lassen Sie den Benutzer die Dokumente ein- und auschecken.
Raystafarian
Sie wird mithilfe der Option Arbeitsmappe freigeben auf der Registerkarte Überprüfung freigegeben. Wenn wir Excel verwenden, um die Datei in Share Point zu öffnen, wird die Datei für einen Benutzer gesperrt. Daher können wir diese Funktion nicht verwenden.
Matthew Lozoya

Antworten:

3

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.

Matthew Lozoya
quelle
1
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) To 1 Schritt -1
smirkingman
Wow, das geht definitiv an die Grenzen von Excel oder sogar Access. Freut mich zu hören, dass es für Sie funktioniert. Wir möchten einige Arbeitsmappen freigeben, aber die meisten Berichte darüber sind nicht so positiv. Die meisten Leute sagen nur, dass das Teilen "kaputt" ist, aber wenn Microsoft so etwas einfügt (möglicherweise mit einer Eingabeaufforderung, die den Benutzer fragt, ob er weiterarbeiten und das ausführen möchte, wenn es nicht beantwortet wird), könnte es tatsächlich eine nützliche Funktion sein!
GlennFromIowa
Ja, es funktioniert tatsächlich recht gut, jetzt, da unser Unternehmen auf SharePoint umsteigen wollte, die Funktionen von SharePoint jedoch nicht einmal mit der Freigabe in Excel verglichen werden, bleiben wir bei meiner Lösung
Matthew Lozoya
@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