Geschützte Excel Datei von Kollegen über Makro schließen

  • Excel

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von 3DFreak77.

    Geschützte Excel Datei von Kollegen über Makro schließen

    Hallo liebe Community,
    sollte dieses Thema bereits schon mal behandelt worden sein - bitte einen Link zum Thread.

    Ich habe folgende Problemsituation:
    Wir haben eine Arbeitsmappe, die einen Blattschutz hat und von mehreren Kollegen geöffnet werden kann. Soweit so gut, wenn ich aber daran etwas ändern möchte, muss ich denjenigen Kollegen, der sie gerade offen hat, anrufen oder im Büro besuchen und um Schließen der Datei zu bitten.
    Es gab bereits Überlegungen und Versuche hinsichtlich "Arbeitsmappe freigeben", aber das funktionierte nicht so, wie wir uns das vorstellten.

    Deshalb würde ich gerne eines machen:
    Mittels Makro die Tastatur- und Mausaktivität eine gewisse Zeitspanne lang beobachten und falls keine positive Rückmeldung kommt (von Tastatur oder Maus) dann die Arbeitsmappe speichern und schließen.

    Besten Dank für eure Inputs gleich mal vorweg. :thumbsup: 8o

    Gruß
    3DFreak
    Moin' moin'

    Grundsätzlich sicherlich möglich. Makros werden in VBA geschrieben.

    Der Code müsste ungefähr folgendes machen.
    1x Timer zur Überprüfung der Mausaktivität und Tastaturaktivität
    1x Timer für die Form IDLE, wenn diese Zeit abgelaufen ist, schliesst sich das Excel.

    Für die Mausaktivität müsstest du die Koordinaten der Maus kontinuierlich mit einem Vorher und Nachher Wert vergleichen.
    Für die Tastatureingabe gibt es sicherlich schon fix fertige Codes. Wahrscheinlich mit einem Keyboard Hook. Is'n Keylogger, wenn ihr Antivirensoftware habt, wird dieser ausschlagen. Nur so zur Info.
    "Die menschliche Vorstellungskraft ist unendlich"
    ->Versuch dir mal 'ne neue Farbe auszudenken!

    Mit Schleifen kann man alles lösen!

    Dim d as Double = 1
    Do until d = 0
    d = (d / 2)
    Loop
    Hallo @3DFreak77
    Ich hab da mal was ähnliches gemacht.
    Nach 9 Minuten Inaktivität kommt eine Meldung, dass das Workbook in einer Minute geschlossen wird.

    Code in Modul

    Visual Basic-Quellcode

    1. Option Explicit
    2. Public dteCloseTime As Date, blnCloseNow As Boolean
    3. Public Sub DoClose()
    4. Dim strMsg As String
    5. If blnCloseNow = False Then
    6. strMsg = "Diese Datei wurde seit 9 Minuten nicht bearbeitet und"
    7. & vbCrLf & "wird bei weiterer Inaktivität in 1 Minute
    8. geschlossen."
    9. CreateObject("WScript.Shell").PopUp strMsg, 10, ThisWorkbook.Name, vbOKOnly + vbInformation + vbSystemModal
    10. blnCloseNow = True
    11. dteCloseTime = Now + TimeSerial(0, 1, 0)
    12. Application.OnTime dteCloseTime, "DoClose"
    13. Else
    14. If Workbooks.Count = 1 Then
    15. Application.DisplayAlerts = False
    16. Application.Quit
    17. Else
    18. ThisWorkbook.Close True
    19. End If
    20. End If
    21. End Sub


    Code in ThisWorkbook

    Visual Basic-Quellcode

    1. Private Sub Workbook_BeforeClose(Cancel As Boolean)
    2. On Error Resume Next
    3. Application.OnTime dteCloseTime, "DoClose", , False
    4. End Sub
    5. Private Sub Workbook_Open()
    6. dteCloseTime = Now + TimeSerial(0, 9, 0)
    7. Application.OnTime dteCloseTime, "DoClose"
    8. End Sub
    9. Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    10. On Error Resume Next
    11. Application.OnTime dteCloseTime, "DoClose", , False
    12. dteCloseTime = Now + TimeSerial(0, 9, 0)
    13. blnCloseNow = False
    14. Application.OnTime dteCloseTime, "DoClose"
    15. End Sub
    16. Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    17. On Error Resume Next
    18. Application.OnTime dteCloseTime, "DoClose", , False
    19. dteCloseTime = Now + TimeSerial(0, 9, 0)
    20. blnCloseNow = False
    21. Application.OnTime dteCloseTime, "DoClose"
    22. End Sub
    23. Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    24. On Error Resume Next
    25. Application.OnTime dteCloseTime, "DoClose", , False
    26. dteCloseTime = Now + TimeSerial(0, 9, 0)
    27. blnCloseNow = False
    28. Application.OnTime dteCloseTime, "DoClose"
    29. End Sub


    Gruss HenryV
    Hallo M-Stef, moin moin ...

    Danke für die prompte Antwort.
    Ist dann eine Überwachung der Mausaktivität auf Excel begrenzt oder betrifft sie das System? Das gleiche würde dann für die Tastatur gelten.
    Denn einerseits möchte ich vermeiden, dass die Arbeitsmappe geschlossen wird, nur weil man auf irgendeinem pdf eine Nummer sucht; andererseits möchte ich vermeiden, dass die Arbeitsmappe geöffnet bleibt, obwohl derjenige gar nichts im Excel macht sondern zB im Outlook ein Mail schreibt.

    Demzufolge bräuchte ich wahrscheinlich sogar 3 Timer ...
    also
    1x Timer für Tastatur (zusätzlich)
    1x Timer für Maus
    1x Timer für IDLE (danach speichern und schließen)

    Aber zu kompliziert möchte ich es auch nicht machen, habe etwas von der Funktion PSKill gehört.
    Wie funktioniert die? Welche Angaben würde ich dafür brauchen?
    Oder geht das mit net file ... auch? Weil ich weiß ja, welcher User die Datei geöffnet hat (aus dem Fenster wegen schreibgeschützt öffnen)

    DANKE!

    LG
    3DFreak

    3DFreak77 schrieb:

    Ist dann eine Überwachung der Mausaktivität auf Excel begrenzt
    Nein.
    Es ist gar keine Überwachung der Mausaktivität, sondern der Excel-Events.
    Und diese Lösung ist meiner Ansicht nach wesentlich eleganter als Maus- und Tastaturüberwachung.

    Allenfalls die Art und Weise der Speicherung würde ich überdenken.
    Vor dem Zwangs-Exit würde ich ein Workbook.SaveAs absetzen, falls das Workbook.Saved Flag nicht gesetzt ist.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @3DFreak77
    Schau dir das an, das ist wahrscheinlich genau was du brauchst. :)
    Ist genau die gleiche Problemstellung.
    Nicht mit Timer gelöst, sondern mit Excel Events.

    office-loesung.de/ftopic442760_0_0_asc.php

    Grüsse
    "Die menschliche Vorstellungskraft ist unendlich"
    ->Versuch dir mal 'ne neue Farbe auszudenken!

    Mit Schleifen kann man alles lösen!

    Dim d as Double = 1
    Do until d = 0
    d = (d / 2)
    Loop
    Hallo zusammen,
    ich bin noch gar nicht dazu gekommen, meinen Hut vor euch zu ziehen ... :thumbsup:
    Danke vielmals für eure prompte Unterstützung.
    Das funktioniert einwandfrei, echt genial.

    Einen letzten kleinen Gimmick hätte ich noch:
    - Kann man überprüfen, ob die Datei schreibgeschützt geöffnet wurde? Denn da macht es ehrlich wenig Sinn, dass die schließt, wenn ich da sowieso nichts eintragen kann
    - Kann man einen "Superuser" definieren, bei dem das Makro anders oder gar nicht läuft?

    Besten Dank.

    LG
    3DFreak77
    Hallo @3DFreak77
    Klar geht das. Hier der abgeänderte Code, mit der Abfrage ReadOnly oder Username = "3DFreak77" = nicht automatisch schliessen.
    Code in ThisWorkbook

    Visual Basic-Quellcode

    1. Public NoAutoClose As Boolean
    2. Private Sub Workbook_BeforeClose(Cancel As Boolean)
    3. If NoAutoClose Then Exit Sub
    4. On Error Resume Next
    5. Application.OnTime dteCloseTime, "DoClose", , False
    6. End Sub
    7. Private Sub Workbook_Open()
    8. NoAutoClose = False
    9. If Application.ActiveProtectedViewWindow Is Nothing Then 'Check Protected View
    10. If ThisWorkbook.ReadOnly Or Environ("USERNAME") = "3DFreak77" Then 'Check Readonly or Username
    11. NoAutoClose = True
    12. Exit Sub
    13. End If
    14. dteCloseTime = Now + TimeSerial(0, 9, 0)
    15. Application.OnTime dteCloseTime, "DoClose"
    16. End If
    17. End Sub
    18. Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    19. If NoAutoClose Then Exit Sub
    20. On Error Resume Next
    21. Application.OnTime dteCloseTime, "DoClose", , False
    22. dteCloseTime = Now + TimeSerial(0, 9, 0)
    23. blnCloseNow = False
    24. Application.OnTime dteCloseTime, "DoClose"
    25. End Sub
    26. Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    27. If NoAutoClose Then Exit Sub
    28. On Error Resume Next
    29. Application.OnTime dteCloseTime, "DoClose", , False
    30. dteCloseTime = Now + TimeSerial(0, 9, 0)
    31. blnCloseNow = False
    32. Application.OnTime dteCloseTime, "DoClose"
    33. End Sub
    34. Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    35. If NoAutoClose Then Exit Sub
    36. On Error Resume Next
    37. Application.OnTime dteCloseTime, "DoClose", , False
    38. dteCloseTime = Now + TimeSerial(0, 9, 0)
    39. blnCloseNow = False
    40. Application.OnTime dteCloseTime, "DoClose"
    41. End Sub