VBA Code durch VBA überprüfen - stimmt Inhalt in Modulzeile X überein?

  • Excel

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

    VBA Code durch VBA überprüfen - stimmt Inhalt in Modulzeile X überein?

    Hallo,

    in dem hier verlinkten Thread habe ich ein Problem gehabt, dass das Löschen eines Moduls nicht beim späteren automatisierten Aufruf von Speichern unter gesichert wurde. Eine Lösung hierzu habe ich gefunden doch leider ergibt sich ein weiteres Problem. Das Problem kann zwar nur auftreten, wenn man am Code spielt, doch auch diesen Fehler möchte verhindern. Hier der ursprüngliche Thread: Ablauf in VBA: Reihenfolge mit Warten bis vorheriger Befehl fertig ist

    Nun zum Problem: Ich möchte in einer Zeile in einem Modul (nicht in einer Tabelle!) den Inhalt überprüfen und falls dieser mit dem zu überprüfenden Inhalt übereinstimmt eine Löschung der Zeile vornimmt. Mit nachfolgendem Code lösche ich die Zeile 3 in Modul 8:

    Visual Basic-Quellcode

    1. With ThisWorkbook.VBProject.VBComponents("Modul8").CodeModule
    2. .DeleteLines 3
    3. End With


    In der Zeile in Modul 8 wird nur der Aufruf zu einer UserForm gestartet. Folgender Inhalt steh in Modul 8:

    Visual Basic-Quellcode

    1. Sub Auto_open()
    2. 'Modul_fuer_automatischen_Start_der_UserForm
    3. UserForm1.Show
    4. End Sub


    Wie kann ich überprüfen, on der Text "UserForm1.Show" in Modul 8 in der dritten Zeile steht? Funktioniert das mit einer If-Abfrage?

    MfG
    Dir ist schon klar, dass Modifikationen im Codemodul von Excel mit speziellen Sicherheitsrichtlinien hinterlegt ist.
    Deswegen könnte es durchaus sein, dass so etwas auf die Schnauze fallen kann, wenn in einer anderen Umgebung ausgeführt wird.

    Ich würde deswegen lieber abprüfen, ob ich mich im initialen Template befinde und nur dann die Userform anzeigen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo,

    die Vorlage mit dem Makro wird nur an CAD-PCs ausgeführt. Von anderen Arbeitsstationen kann die Vorlage garnicht genutzt werden bzw ist nicht vorhanden. Bei der Installation von Excel und der Einrichtung der Vertrauensrichtlinien habe ich darauf "geachtet" alles zuzulassen.

    Mir fällt leider kein anderer Weg ein. Es soll von der CAD Software die Vorlage genutzt werden und nur einmalig beim Erstellen der Liste die UserForm angezeigt werden. Wir speichern die Stücklisten dann ab und wenn man diese später öffnet, darf die UserForm auf keinen Fall erneut angezeigt werden. Wenn es da eine andere Möglichkeit gibt, dann immer her damit 8o

    Momentan läuft das VBA ordentlich durch und entfernt auch die Zeile 3 im Autostart für das Öffnen der UserForm. Ich wollte nur unterbinden, dass später versehentlich der falsche Code-Teil gelöscht wird weil man per Hand in den VBA-Editor geht und einfach mal die UserForm startet...

    MfG
    Hallo, ich würde nicht löschen, sondern auskommentieren:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Sub los()
    3. Dim s As String
    4. Dim l As Long
    5. With ThisWorkbook.VBProject.VBComponents("Modul8").CodeModule
    6. For l = 1 To .CountOfLines
    7. s = .Lines(l, 1)
    8. If InStr(1, s, "UserForm1.Show") > 0 Then
    9. .ReplaceLine l, "'" & s
    10. Exit For
    11. End If
    12. Next
    13. End With
    14. End Sub
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Moin,

    das ist so einfach und genial, ich denke das versuche ich! Im schlimmsten Fall müsste ich nicht einmal nach dem Öffnen der UserForm suchen sondern lase generell die Zeile auskommentieren. Dann sind es halt viele ' die in der Zeile stehen, jucken tut das aber keinen.

    Danke für den Denkanstoß und die Lösung mit dem Suchen des INhalts in einem Modul.

    MfG

    peterfido schrieb:

    Hallo, ich würde nicht löschen, sondern auskommentieren:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Sub los()
    3. Dim s As String
    4. Dim l As Long
    5. With ThisWorkbook.VBProject.VBComponents("Modul8").CodeModule
    6. For l = 1 To .CountOfLines
    7. s = .Lines(l, 1)
    8. If InStr(1, s, "UserForm1.Show") > 0 Then
    9. .ReplaceLine l, "'" & s
    10. Exit For
    11. End If
    12. Next
    13. End With
    14. End Sub
    Nochmal ich,

    also ausprobiert und funktioniert einwandfrei.

    Jetzt habe ich noch eine andere Frage:
    Ich habe in einer der Tabellen ein paar Buttons und ein Steuerelement (auch eine Checkbox) die ich gern über das VBA steuern möchte. Grund ist folgender:
    Es ist üblich, dass Listen als Vorab-Listen ausgegeben werden (um z.B. eine Materialübersicht zu bekommen) und diese dementsprechend gekennzeichnet werden müssen. Ich habe hierzu eine Checkbox angelegt (auf besagter Tabellenoberfläche) die standardmäßig abgehakt ist. Wird die Checkbox angeklickt so wird auf allen Stücklisten ein VORAB eingefügt. Die Checkbox ist dann angehakt. Klicke ich erneut auf die Checkbox wird das Wasserzeichen wieder entfernt.

    Kann ich diese Checkbox irgentwie aus der Userform betätigen oder gar ausführen? Wichtig ist eigentlich nur, dass man im nachhinein die Checkbox wie gewohnt nutzen kann, also wenn ich in der Userform das Wasserzeichen möchte muss die Checkbox angehakt sein, will ich es nicht, so soll diese abgehakt bleiben. Ist das Modul der Userform durchgelaufen und ich öffne eventuell später die Liste erneut, muss ich die Checkbox nutzen können um z.B. das Wasserzeichen zu entfernen oder hinzuzufügen (ich hoffe ihr wisst wie ich es meine).

    MfG

    ______________________________________________________
    EDIT:
    Gefunden! Mit dem Code

    Visual Basic-Quellcode

    1. Sheets("Strukturliste").Shapes("Kontrollkästchen 1").ControlFormat.Value = xlOn
    2. Call VORAB

    kann ich die Checkbox anhaken und den Befehl, welcher auf der Checkbox liegt ausführen. Durch da Setzen auf xlOn wird das Makro nicht ausgeführt, daher der Aufruf im anschluss.

    Damit sollten alle "Problemchen" beseitigt sein. VIELEN DANK für eure Hilfe!

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

    felix_gorgas schrieb:

    VBComponents("Modul8")

    felix_gorgas schrieb:

    UserForm1

    felix_gorgas schrieb:

    Shapes("Kontrollkästchen 1")

    Warum gibst du deinen Objekten nicht einen vernünftigen Namen?
    Bei solch nichtssagender Benennung ist das Projekt nur schwer wartbar.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo,

    danke für den Hinweis. Für einen Außenstehenden der sich gut mit VBA/VBS auskennt ist es sicherlich nicht nachvollziehbar, warum man die originalen Benennungen beläßt. Ich schaue nur ab und zu in die VBA's und wenn ich Namen vergebe, weiß ich später eventuell nicht den Bezug. Wenn ich aber nach Userform suche weiß ich immer, was gemeint ist.

    Ich kommentiere weiterhin immer meine Befehle nach bzw. vor dem eigentlichen Befehl. Weiterhin weiß ich z.B. nicht, wie ich das Kontrollkästchen auf der Stückliste umbenennen soll (in der Userform weiß ich es natürlich, aber wie in der Tabelle? => unter den Eigenschaften ist nichts zu sehen und einen Text einzutragen hilft hier nicht weiter weil darunter eine Clipart liegt die einfach "besser aussieht"). Zum anderen gibt es nur eine Userform und es werden keine weiteren dazu kommen. Was auf welchem Modul zu finden ist (ich könnte es auch teilweise in ein Modul schreiben) habe ich mir auch im ersten Modul hinterlegt.

    Es ist also ein Inhaltsverzeichnis hinterlegt. Für mich ist die chronologie und die Bennnung gut nachvollziehbar und es muss (und sollte ;) ) nicht jeder mit meinen VBA zurecht kommen ^^

    MfG

    felix_gorgas schrieb:

    das Kontrollkästchen
    ist insofern unglücklich, weil du ein Formularsteuerelement gewählt hast.
    Ich nehme grundsätzlich ActiveX-Controls.
    Die sind auch wesentlich einfacher zu handhaben, da hättest du nicht den Umweg über "Sheets("Strukturliste").Shapes("Kontrollkästchen 1").ControlFormat" nehmen müssen, sondern hättest die Value-Eigenschaft direkt setzen können.

    felix_gorgas schrieb:

    Tabelle
    Wenn du in der IDE F4 drückst, öffnet sich das Eigenschaftsfenster, in dem du das gerade aktivierte Objekt beliebig umbenennen kannst.
    Da kannst du jedem Arbeitsblatt einen sprechenden Objektnamen geben.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo,

    wenn Du vor dem auskommentieren noch prüfst, ob das ' schon drin ist, dann einfach nicht auskommentieren. Das hält die Zeile schlank.

    Du könntest auch mit

    Visual Basic-Quellcode

    1. if Trim(s)="UserForm1.Show" then

    prüfen. Dadurch würde er aber nicht abbrechen, wenn die Zeile gefunden wurde, was bei vielen Zeilen Code mehr Zeit braucht.
    Gruß
    Peterfido

    Keine Unterstützung per PN!