Abfrage ob im VBA-Skript was geändert wurde

  • Excel

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

    Abfrage ob im VBA-Skript was geändert wurde

    Hallo Zusammen,
    ich bin relativ neu im Bereich VBA-Programmierung. Daher kenn ich mich bisher noch nicht so sehr mit der VBA-Syntax aus.

    Habe aber gleich eine Frage:

    Ist es möglich eine Abfrage zu gestalten, welche eine Änderung nur im VBA-Skript erkennt.
    Also diese Abfrage sollte nur eine Änderung im VBA-Editor erkennen. Jegliche Änderung im allgemeinen EXCEL-Sheet sollte nicht protokolliert werden.

    Des Weiteren bräuchte ich auch genau die gegenteilige Aufgabe: Eine Abfrage die die Veränderung im EXCEL-Sheet ermittelt ohne dabei auf das VBA-Skript zu achten.

    Bei beiden Aufgaben möchte ich das Änderungsdatum und der angemeldete Windows-Benutzer erfassen.

    Hoffe ihr könnt mir Helfen.
    Vielen Dank.

    Liebe Grüße,
    OebmOek
    1)
    Warum schützt du dein VBA-Projekt nicht einfach mit einem Passwort, wenn da keiner ran soll?

    2)
    Du kannst Veränderungen im VBA-Code nicht protokollieren.
    Was du machen kannst: Einen Hash, über alle Code-Module machen und den regelmässig abfragen.
    Oder den Code mit einem ausserhalb Excel gespeicherten Referenzcode vergleichen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod,

    Danke für deine schnelle Rückmeldung und Entschuldige meine späte Antwort.
    Die Überwachungsfunktion soll nur für eine Protokollierung dienen. Daher würde der Ansatz mit dem Passwort nicht klappen.

    Aber was ist ein Hash?

    Dankeschön
    Wenn dein Code sowieso von allen Leuten geändert werden darf, brauchst du auch nicht protokollieren.
    Das gibt früher oder später sowieso ein unüberwindbares Chaos.

    Ich schütze meinen Code üblicherweise mit einem Passwort, das alle Entwickler kennen.
    Die sind aber auch so geeicht, dass sie die Release Notes pflegen.
    "Normale" Benutzer kennen das Passwort nicht und können auch nichts ändern, das wollen die aber auch gar nicht.
    Denen genügt es, wenn sie das Excel bearbeiten können, da sie von VBA eh nichts verstehen.

    Du kannst dir auch regelmässig deine VB-Komponenten exportieren und auf Änderungen gegenüber früheren Versionen überprüfen.
    Ein Ansatz dazu ist hier beschrieben.

    Ein Hash ist so eine Art "Quersumme" über einen String.
    Du kannst dir für jedes Modul so einen Hash bilden und abspeichern, z.B. in einem (hidden) Worksheet.
    Wenn sich der Hash ändert, weißt du, dass das entsprechende Codemodule modifiziert wurde.

    Zur Berechnung des Hash wirst du alle möglichen Ansätze im Netz finden, aber der eleganteste Weg ist wohl die Verwendung der Cryptography-Library aus dem .Net-Framework:

    Visual Basic-Quellcode

    1. ​Sub HashComponents()
    2. Dim Component As VBComponent, Hash As String
    3. For Each Component In ThisWorkbook.VBProject.VBComponents
    4. Hash = SHA1Hash(Component.CodeModule.Lines(1, 999999))
    5. Debug.Print Component.Name, Hash
    6. 'hier kannst du abspeichern und/oder vergleichen
    7. Next
    8. End Sub
    9. Function SHA1Hash(s As String) As String
    10. Dim Bytes() As Byte, Encryptor As Object, b As Variant
    11. Set Encryptor = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider")
    12. Bytes = StrConv(s, vbFromUnicode)
    13. Bytes = Encryptor.ComputeHash_2(Bytes)
    14. For Each b In Bytes
    15. SHA1Hash = SHA1Hash & Hex(b)
    16. Next
    17. End Function
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()