Entwickler-Ecke

Alle Sprachen - Alle Plattformen - VBA - Nach Buttonklick stimmt was nicht


Kirk1701A - Di 12.11.19 20:30
Titel: VBA - Nach Buttonklick stimmt was nicht
Hallo zusammen,
nach einiger Zeit, bin ich wieder aktiv hier (YAY :dance2: :beer:). Ich bin gerade dabei, für meine Präsentation, die ich in der Schule halten werde, ein Testprogramm zu schreiben, um das vorführen zu können. Das Thema ist VBA.

Ich habe es so geregelt, dass das Dokument einen Button besitzt, der beim Klick den UserForm öffnet. Es ist nur was ganz simples. Wenn ich das UserForm schließe, stürzt mir mein ganzes Makro ab und gibt mir folgende Fehlermeldung:

"Laufzeitfehler '-2147352573 (80020003)':
Das angegebene Makro kann nicht ausgeführt werden."


Das passiert aber nur, wenn ich das Makro via Button starte. Hier das ClickEvent des Buttons, das im Dokument sitzt:


Quelltext
1:
2:
3:
Private Sub cmdStartMacro_Click()
    Application.Run MacroName:=StartMakro
End Sub


Dieses "StartMakro" ist eine Function, die sich in einem extra Modul befindet. Ich habe so etwas schon eimal gemacht, ist aber erstens zu lange her (Alzheimer lässt grüßen :gruebel: :gruebel: :gruebel:) und ich habe das Projekt auch nicht mehr. Hier ist das "StartMakro":


Quelltext
1:
2:
3:
Public Function StartMakro()
    Form.Show
End Function


Hier ist dann auch noch der gesamte restliche Code, der sich im Form befindet:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
Public name As String
Public age As Integer
Public town As String
Public class As String
Public school As String
Public ageCorrect As Boolean

Private Sub cmdTransfer_Click()
    ageCorrect = False

    'Werte der Textfelder in Variablen übergeben
    name = Me.tbName.Text
    town = Me.tbTown.Text
    class = Me.tbClass.Text
    school = Me.tbSchool.Text
    
    'Errorhandling
    On Error GoTo NumberError
    age = CInt(Me.tbAge.Text)
    
    ageCorrect = True
    
    'Abfangen von möglichen Fehleingaben
    If age < 0 Then
        Call MsgBox("Es wurde eine negative Zahl eingegeben!" & vbCrLf & "Es sind lediglich positive, ganze Zahlen erlaubt.", vbCritical + vbOKOnly, "Error - Negative number")
        Exit Sub
    ElseIf age > 116 Then
        Call MsgBox("Die Möglichkeit, dass Ihr Alter wirklich " & age & " beträgt, ist zu gering. Dies wird als ungültige Eingabe gewertet!", vbCritical + vbOKOnly, "Error - Too high number")
        Exit Sub
    End If
    
    ActiveDocument.Bookmarks("Name").Range.InsertAfter name
    ActiveDocument.Bookmarks("Age").Range.InsertAfter CStr(age)
    ActiveDocument.Bookmarks("Town").Range.InsertAfter town
    ActiveDocument.Bookmarks("Class").Range.InsertAfter class
    ActiveDocument.Bookmarks("NameOfSchool").Range.InsertAfter school
    
    Call MsgBox("Die Daten wurden erfolgreich in das Dokument geschrieben.", vbInformation, "Success - Write into document")
    
    Unload (Form)
NumberError: 'Entweder wurde nichts oder ungültige Zeichen eingegeben
    If ageCorrect = False Then
        Call MsgBox("Es wurde eine ungültige Eingabe festgestellt! Bitte versuchen Sie es erneut." & vbCrLf & "Es sind lediglich positive, ganze Zahlen erlaubt.", vbCritical + vbOKOnly, "Error - Invalid input")
        Exit Sub
    End If
End Sub


Im Anhang ist dann auch noch ein Screenshot meines Forms zu sehen. Was genau mach ich falsch, oder stehe ich bloß auf dem Schlauch? :gruebel: :gruebel: :autsch: :autsch: :lupe: :lupe:

Hier ist mein Form zu sehen, welches ich verwende. Mehr Code oder Bilder gibt es nicht... Das ist alles :-) (PNG, 4.18 KB)

Danke jetzt schonmal :) :)

LLAP
Euer Kirk

P.S.
Ich weiß, das ist nicht gerade das schönste ExceptionHandling, aber es wird nur einmal von mir vor der Klasse benutzt für 3 Minuten und das war's auch schon. Danach könnte man es echt wegwerfen :lol:


doublecross - Do 14.11.19 15:24

Hallo,

ich habe zwar keine große Ahnung von VBA, aber wenn ich mir die Beispiele hier [https://docs.microsoft.com/en-us/office/vba/api/word.application.run] einmal ansehe, dann sind die Makronamen immer bedeutend länger als in deinem Beispiel. Kann es sein, dass du noch so eine Art Pfad zu deinem Makro mit in den Makronamen aufnehmen musst?


Kirk1701A - Di 19.11.19 21:02

Hallo zusammen,

ich habe die Lösung letztendlich doch selbst gefunden.
Ich hätte das "StartMakro" in Anführungszeichen setzen sollen. Jetzt funktioniert es fehlerfrei. Trotzdem danke an @doublecross.


LLAP
Euer Kirk