Code einer UserForm in Unterprogramme/Module aufteilen

  • Word

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von TA1503.

    Code einer UserForm in Unterprogramme/Module aufteilen

    Hallöchen,

    ich hoffe dass mir diesmal jemand helfen kann: Ich habe eine UserForm und einen Code dahinter wo die meisten Sachen bei Confirm_Click() ausgeführt werden. Es Sind inzwischen schon sehr viele Teile, also wollte ich es in Unterprogramme stecken. Google hat mir gesagt dass ich Module erstellen kann und die dann mit einer Call-Methode aufrufen kann.

    Das klappt nun aber leider nicht. Ich habe im Confirm_Click()-Teil verschiedene Teile, aber es wird immer auf Dinge der UserForm referenziert (also Value True, wenn was angeklickt ist oder so) oder bei Pflichtangaben habe ich mit GoTo gearbeitet, wobei dann gleich ans Ende gesprungen wird. Wenn ich versuche mein Modul mit der Call-Methode aufzurufen meckert er bei beidem Ruf. Ich stehe da irgendwie auf dem Schlauch wie ich das alles übersichtlicher machen kann.

    Vielen Dank.
    meinst du sowas?

    Visual Basic-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. bannane()
    4. End Sub
    5. End Class
    6. Public Module Fisch
    7. Sub bannane()
    8. MsgBox("bannanen-fisch")
    9. End Sub
    10. End Module
    Ja, genau. Nur dass eben nicht alles hintereinander weg geschrieben werden soll, weil dann würde es ja keinen Sinn machen. Ich würde gerne den ganzen Code der auf Confirm_Click() abläuft splitten dass ich mich nicht tod-scrolle. Dachte ich könnte den Code eventuell in einzelne Module packen und nur bei Confirm_Click() die einzelnen Programmteile aufrufen.

    Ich muss da also Werte übergeben? Könntest du das eventuell näher erlautern? Oder wo finde ich da mehr dazu?

    Das Problem ist eben dass der Inhalt z.B. im Modul trotzdem auf die Steuerelemente der UserForm zugreifen muss und gut wäre auch wenn die GoTo Methode übergreifend funktionieren würde. Ich also das ziel zum ende der confirm_click() habe, die goto anweisung selbst aber in einem teil, welches ja dann ausgelagert wäre...
    Danke für deine Antwort FloFuchs.

    Ich habe versucht deinen Code auszuführen um ihn zu verstehen - dies funktioniert leider nicht. (Fehler beim Kompilieren - Mehrdeutiger Name). Bin mir also nicht sicher welcher Text in der Msg Box angezeigt wird, aber so oder so sieht es aus als würde ich alles so umständlicher, als leichter machen.

    Ich hatte gehofft dass ich die einzelnen Teile "einfach" auslagern kann (jeder Teil ein eigenes "Fenster") und dann die einzelnen Teile nur noch mit einer Programmzeile (Call oder so) ansprechen/aufrufen kann...

    Anbei mal einen Ausschnitt von meinem Code:

    Visual Basic-Quellcode

    1. Private Sub Confirm_Click()
    2. '------Fußzeile entsprechend ausfüllen------
    3. With ActiveSheet
    4. If Berlin.Value = True Then
    5. ...
    6. If ActiveDocument.Bookmarks.Exists("Adresse1_Stadt") Then
    7. Set Marke1 = ActiveDocument.Bookmarks("Adresse1_Stadt").Range
    8. Marke1.Font.Bold = True 'Fett
    9. Marke1.Font.Underline = wdUnderlineSingle 'Unterstrichen
    10. Marke1.Text = b_city
    11. ActiveDocument.Bookmarks.Add Name:="Adresse1_Stadt", Range:=Marke1
    12. End If
    13. If ActiveDocument.Bookmarks.Exists("Adresse1") Then
    14. Set Marke2 = ActiveDocument.Bookmarks("Adresse1").Range
    15. Marke2.Font.Bold = False 'Nicht Fett
    16. Marke2.Text = b_straße & Chr(10) & b_plz
    17. ActiveDocument.Bookmarks.Add Name:="Adresse1", Range:=Marke2
    18. End If
    19. If ActiveDocument.Bookmarks.Exists("Adresse2_Stadt") Then
    20. Set Marke3 = ActiveDocument.Bookmarks("Adresse2_Stadt").Range
    21. Marke3.Font.Bold = True 'Fett
    22. Marke3.Font.Underline = wdUnderlineSingle
    23. Marke3.Text = d_city
    24. ActiveDocument.Bookmarks.Add Name:="Adresse2_Stadt", Range:=Marke3
    25. End If
    26. If ActiveDocument.Bookmarks.Exists("Adresse2") Then
    27. Set Marke4 = ActiveDocument.Bookmarks("Adresse2").Range
    28. Marke4.Font.Bold = False 'Nicht Fett
    29. Marke4.Text = d_straße & Chr(10) & d_plz
    30. ActiveDocument.Bookmarks.Add Name:="Adresse2", Range:=Marke4
    31. End If
    32. End If
    33. ...
    34. If Düsseldorf.Value = False And Berlin.Value = False Then
    35. MsgBox "Die Angabe eines Ortes ist Pflicht!"
    36. GoTo ende
    37. End If
    38. firm = SelectionBox.Text
    39. Select Case firm
    40. Case "XX"
    41. company = "XX"
    42. vorstand = "XX"
    43. sitz = "XX"
    44. gericht = "XX"
    45. Case "XX"
    46. ...
    47. Case ""
    48. MsgBox "Die Angabe einer Gesellschaft ist Pflicht!"
    49. GoTo ende
    50. End Select
    51. If ActiveDocument.Bookmarks.Exists("fußzeile_company") Then
    52. Set Marke5 = ActiveDocument.Bookmarks("fußzeile_company").Range
    53. Marke5.Font.Bold = True 'Fett
    54. Marke5.Text = company
    55. ActiveDocument.Bookmarks.Add Name:="fußzeile_company", Range:=Marke5
    56. End If
    57. ...
    58. End With
    59. '------Referenzen entsprechend ein-/ausblenden------
    60. If Referenz1.Value = True Then
    61. If ActiveDocument.Bookmarks.Exists("referenz") Then
    62. Set Marke1 = ActiveDocument.Bookmarks("referenz").Range
    63. Marke1.Font.Bold = True
    64. Marke1.Text = Chr(10) & "Bereich Gesundheit und Soziales:" & Chr(10)
    65. Marke1.Style = ActiveDocument.Styles("Kein Leerraum")
    66. Marke1.Style = ActiveDocument.Styles("Fett")
    67. ActiveDocument.Bookmarks.Add Name:="referenz", Range:=Marke1
    68. If ActiveDocument.Bookmarks.Exists("referenz3") Then
    69. Set Marke3 = ActiveDocument.Bookmarks("referenz3").Range
    70. Marke3.Style = ActiveDocument.Styles("Punktierung")
    71. ActiveDocument.Bookmarks.Add Name:="referenz3", Range:=Marke3
    72. End If
    73. End If
    74. If ActiveDocument.Bookmarks.Exists("referenz2") Then
    75. Set Marke2 = ActiveDocument.Bookmarks("referenz2").Range
    76. Marke2.Font.Bold = False
    77. Marke2.Text = XX
    78. Marke2.Style = ActiveDocument.Styles("Punktierung")
    79. ActiveDocument.Bookmarks.Add Name:="referenz2", Range:=Marke2
    80. End If
    81. Else
    82. If ActiveDocument.Bookmarks.Exists("referenz") Then
    83. Set Marke1 = ActiveDocument.Bookmarks("referenz").Range
    84. Marke1.Text = ""
    85. ActiveDocument.Bookmarks.Add Name:="referenz", Range:=Marke1
    86. End If
    87. If ActiveDocument.Bookmarks.Exists("referenz2") Then
    88. Set Marke2 = ActiveDocument.Bookmarks("referenz2").Range
    89. Marke2.Text = ""
    90. ActiveDocument.Bookmarks.Add Name:="referenz2", Range:=Marke2
    91. End If
    92. End If
    93. '------Hinweis bzgl. Prüfung/Zertifizierung entsprechend ein-/ausblenden------
    94. If PuZ1.Value = True Then
    95. If ActiveDocument.Bookmarks.Exists("PuZ1") Then
    96. Set Marke1 = ActiveDocument.Bookmarks("PuZ1").Range
    97. Marke1.Text = XX
    98. ActiveDocument.Bookmarks.Add Name:="PuZ1", Range:=Marke1
    99. End If
    100. Else
    101. If ActiveDocument.Bookmarks.Exists("PuZ1") Then
    102. Set Marke1 = ActiveDocument.Bookmarks("PuZ1").Range
    103. Marke1.Text = ""
    104. ActiveDocument.Bookmarks.Add Name:="PuZ1", Range:=Marke1
    105. End If
    106. End If
    107. ...
    108. '------Ende------
    109. Unload Me
    110. ende:
    111. Selection.HomeKey Unit:=wdStory, Extend:=wdMove
    112. End Sub
    Ja das geht ja auch....
    Einzelnen Programmteile auslagern... dazu musste Module anlegen. Functions oder Module, die dort als public deklariert sind, auf die kannste aus deinem gesamten Projekt zugreifen.
    Meine Mappe is übrigends aus Excel ;) dort sollte sie aber problemlos funktionierren.
    Danke für die Antwort.

    Ich tue mich allerdings immer noch etwas schwer :(

    Ich hatte jetzt versucht den vorhigeren geposteten Referenz-Teil in ein Modul auszulagern. Dazu hab ich in einem Modul Sub ABC () angelegt [später auch mit Public Sub probiert, hat aber auch nicht geändert] - dann ist das Problem dass er Referenz1 als Variable sieht, welche nicht definiert ist. [Referenz1 ist ein Optionsfeld der UserForm]. Also habe ich versucht Referenz1 zu übergeben mit Sub ABC (Referenz1) oder Sub ABC (ByVal Referenz1 As Boolean) - funktioniert allerdings auch nicht. Also dachte ich mir, ich übergehe das erstmal für Übungszwecke und lagere erstmal nur den ersten Teil innerhalb des Codes aus (siehe unten). Dann kommt aber das gleiche (Variable nicht definiert) zu Marke1 - und jetzt bin ich total verwirrt :( Die müsste ich ja nun wirklich nicht übergeben, die setze ich ja dann erst?!

    Ich hoffe du kannst mir nochmal helfen. Danke. Der Code ist ja schon fertig und jetzt scheitere ich daran alles übersichtlicher zu gestalten. Vielen Dank.

    Visual Basic-Quellcode

    1. If ActiveDocument.Bookmarks.Exists("referenz") Then
    2. Set Marke1 = ActiveDocument.Bookmarks("referenz").Range
    3. Marke1.Font.Bold = True
    4. Marke1.Text = Chr(10) & "Bereich Gesundheit und Soziales:" & Chr(10)
    5. Marke1.Style = ActiveDocument.Styles("Kein Leerraum")
    6. Marke1.Style = ActiveDocument.Styles("Fett")
    7. ActiveDocument.Bookmarks.Add Name:="referenz", Range:=Marke1
    8. If ActiveDocument.Bookmarks.Exists("referenz3") Then
    9. Set Marke3 = ActiveDocument.Bookmarks("referenz3").Range
    10. Marke3.Style = ActiveDocument.Styles("Punktierung")
    11. ActiveDocument.Bookmarks.Add Name:="referenz3", Range:=Marke3
    12. End If
    13. End If
    hast du denn irgendwo eine deklaration von Marke1?
    hier weist du sie ja nur zu...
    du solltest irgenwo stehen haben

    Visual Basic-Quellcode

    1. Dim Marke1 as Bookmark

    oder

    Visual Basic-Quellcode

    1. Public Marke1 as Bookmark

    Position je nachdem wo du sie nutzt, ich würde fast sagen das geht hier mit DIM lokal in der Sub
    Ich habe sie an dieser Stelle gesetzt und nutze sie dort ja auch (um eine neue Textmarke zu setzen). Deklariert habe ich sie nirgendwo - geht ja auch so?!

    So - heute befinde ich mich auch nicht mehr in meinem Es-ist-Montag-Desolaten Zustand und daher bin ich schon etwas weiter, allerdings noch nicht am Ziel :)

    Ich konnte meinen Code soweit sehr gut aufsplitten. Beispielhaft ->

    Ereignisprozedurcode:

    Visual Basic-Quellcode

    1. Public Sub Confirm_Click()
    2. Call PuZ


    Modulcode:

    Visual Basic-Quellcode

    1. Public Sub PuZ()
    2. If [b]Gesellschaft.[/b]PuZ1.Value = True Then
    3. If ActiveDocument.Bookmarks.Exists("PuZ1") Then
    4. Set Marke1 = ActiveDocument.Bookmarks("PuZ1").Range
    5. Marke1.Text = Chr(10) & "XXX."
    6. ActiveDocument.Bookmarks.Add Name:="PuZ1", Range:=Marke1
    7. End If
    8. Else
    9. If ActiveDocument.Bookmarks.Exists("PuZ1") Then
    10. Set Marke1 = ActiveDocument.Bookmarks("PuZ1").Range
    11. Marke1.Text = ""
    12. ActiveDocument.Bookmarks.Add Name:="PuZ1", Range:=Marke1
    13. End If
    14. End If
    15. End Sub


    Sobald ich Steuerelemente im Modul anspreche, hänge ich vorher das UserForm-Objekt "ran" - in meinem Fall "Gesellschaft"...

    Das Problem ist dass das nicht immer funktioniert. Bei den Abschnitten wo ich etwas deklariere, klappt es leider nicht. Also ich denke dass es daran liegt:

    Ereignisprozedurcode:

    Visual Basic-Quellcode

    1. Public Sub Confirm_Click()
    2. Call Zahlungsziel

    oder

    Visual Basic-Quellcode

    1. Public Sub Confirm_Click()
    2. Call Zahlungsziel(zahlungsziel)


    Modulcode:

    Visual Basic-Quellcode

    1. Public Sub Zahlungsziel()
    2. Dim Zahlungsziel As String
    3. If Gesellschaft.OptionButton1.Value = True Then
    4. Zahlungsziel = "vierzehntägigem"
    5. End If
    6. If Gesellschaft.OptionButton2.Value = True Then
    7. Zahlungsziel = "dreißigtägigem"
    8. End If
    9. End Sub


    Als Fehler kommt: Variable oder Prozedur anstelle eines Moduls erwartet.

    Wie muss ich denn da die Variablen, die ich im Modul deklariere übergeben? Eigentlich muss er es ja nur ausführen und auf die Variablen in der Ereignisprozedur gar nicht mehr zugreifen. Langfristig sollen die Variablen mit Excel- oder Acessdaten gefüllt werden - soweit bin ich allerdings noch nicht. Eventuell hast du einen letzten Tipp für mich?

    P.S. Jetzt bin ich auch auch auf zwei weitere (kleinere) Probleme gestoßen. 1. Meinte Google dass es gut wäre bei Public Option Explicit voran zustellen um den Code wieder "unsichtbar" zu machen, dann kommt aber der beschriebene Fehler mit der Textmarke?! Und zweitens - gibt es eine Möglichkeit dass die ganzen Module und somit Makros, die ich erstelle, nicht als Makro angezeigt werden, wenn man von Word aus manuell ein Makro ausführen möchte? Ich möchte dass da nur das UserForm-Makro angezeigt wird?!

    Vielen vielen Dank. Liebe Grüße.
    Du solltest generell mit Option Explizit arbeiten...
    dann musste Variablen vor dem VErwenden definieren... dann gibts aber auch keinen Ärger mit doppelten Variablen usw...
    dir fehlen da noch einige Basics... unterschiede im Deklarieren, dim - public - private sollteste mal bisle was drüber nachlesen...
    zum Beispiel im bei PEter HAserodt
    Ausserdem nicht überall die gleichen VariablenBezeichnungen verwenden.. wer soll das denn verstehen?
    gugge vielleicht mal folgendes (wenn auch ziemlich sinnfreie) Beispiel zur Verwendung von Variablen an

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. SOption Explicit
    2. Sub main()
    3. Dim eingabe As String
    4. eingabe = InputBox("Schreib halt wat")
    5. MsgBox tralala(eingabe)
    6. eingabe = InputBox("Wie heißt du?")
    7. Call SagHallo(eingabe)
    8. End Sub
    9. Function tralala(ByVal subVariable As String) As String
    10. tralala = subVariable & "tralala"
    11. End Function

    und im Modul

    Visual Basic-Quellcode

    1. Option Explicit
    2. Public Sub SagHallo(ByVal Wem As String)
    3. MsgBox ("Hallo " & Wem)
    4. End Sub

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „FloFuchs“ ()

    Danke für deine Antwort.

    Ja, dass mir einige Basics fehlen ist mir bewusst. Aber Programmieren ist jetzt auch nicht mein Steckenpferd und ich habe eigentlich auch nicht vor mich damit großartig und langfristig zu beschäftigen - mein Kopf will diese Logik einfach nicht verstehen. Aber vielen Dank für deine Hilfe.

    Variablenbezeichnungen verwende ich nicht doppelt.


    Liebe Grüße.