VBA Userform Schaltfläche
Guten Tag zusammen,
ich hab mal ein wahrscheinlich ganz einfaches Problem, aber hab zu wenig Hintergrundwissen als Autodidakt.
Ich schreibe ein VBA-Makro, welches eine Userform aufruft, in die der Anwender bestimmte Daten einträgt und die das Makro dann in Ecxel weiterverarbeitet.
Hab das weitgehend von einem alten Makro eines Kollegen kopiert, und es funktioniert auch.
Es sind zwei Schaltflächen da, "OK" und "Abbrechen" aber egal was man anklickt, oder auch die Userform mit dem "x" schliesst, das Makro macht dann mit den eingebenen Daten weiter. Wie kann ich in Abhängigkeit von der angeklickten Schaltfläche dem Makro sagen, wie's weitergeht?
(evtl auch noch mit weiteren Schaltflächen unterschiedliche Aktionen auslösen?)
Vielen Dank schon mal
Gruß aus Stuttgart
Andreas
*Threadedit* 06.11.2009, 12:43:50
Admininfo: Führ bitte Threads nicht fort indem du Weitere eröffnest, und vermeide Mehrfachanfragen. Die Datenbank und User werden es dir danken. Siehe FAQ 2, #3.
Antwort schreiben
Antwort 1 von Gast123 vom 06.11.2021, 12:15 Options
hi,
du must die schaltflächen in dem makro abfragen und auswerten.
gruss
Antwort 2 von andreas_3 vom 06.11.2021, 12:29 Options
.... DASS ich das machen muß, ist ja klar, aber ich sehe doch nicht WIE ...
wie sag ich dem Makro, welche Schaltfläche angeklickt wurde?
in der Vorlage, die ich kopiert habe, sehe ich nichts, was darauf hindeutet, bin auch nicht sicher, ob das dort überhaupt so funktioniert hat.
sorry, wie gesagt, ich hab relativ wenig Hintergrundwissen, nur das, was ich hier nach und nach lerne...
Danke nochmals
und Gruß
Andreas
Antwort 3 von M.O. vom 06.11.2021, 12:48 Options
Hallo Andreas,
öffne deine Userform in der VBA-Umgebung und doppelklicke einfach mal auf die entsprechenden Buttons.
Dann müsste im Codefenster der Cursor in einer Routine mit einer Überschrift wie
Private Sub CommandButton1_Click()
stehen.
Bei deinem Okay-Button schreibst du hier den Code hinein, der die Daten ins Tabellenblatt schreibt.
Bei dem Abbrechen-Button schließt du einfach die Userform.
Schau dir mal am besten diesen
Link an.
Gruß
M.O.
Antwort 4 von andreas_3 vom 06.11.2021, 13:32 Options
Hallo M.O.
vielen Dank für die Antwort, etwas weitergeholfen hat es mir schon, aber noch nicht so ganz....
mein Problem ist, dass die userform ja innerhalb eines großen Makros aufgerufen wird, und das Makro beim Anklicken der Userform auf unterschiedliche Weisen weiterlaufen soll (oder auch nicht)
ich brauche also irgendwie einen Wert, der je nach angeklickter Schaltfläche dem Makro sagt ob, ggf an welcher Stelle oder mit einem bestimmten Wert es weiterlaufen soll. (nur als Beispiel: wenn ich in der Userform 2 Schaltflächen mit "Tabelle1" und "Tabelle2" hätte, dann soll es das Makro beim Anklicken jeweils das Tabellenblatt 1 oder 2 auswählen und die Daten dort eintragen (anschliessend kommt noch mehr im Makro), und bei "Abbrechen" das Makro beenden, ohne die weiteren Schritte auszuführen)
Sorry, wenn ich es nicht so gut erklären kann und/oder auf dem Schlauch stehe...
LG
Andreas
Antwort 5 von fedjo vom 06.11.2021, 15:26 Options
Antwort 6 von andreas_3 vom 06.11.2021, 15:30 Options
.. das ganze Makro ist leider ziemlich kompliziert, deshalb müsste ich das erst umschreiben und aus dem ganz großen Zusammenhang rausnehmen, um es als Demo hochladen zu können..
vielleicht hat ja sonst noch jemand nen Rat, ansonsten werde ich das nächste Woche mal in Angriff nehmen
Danke, fedjo, trotzdem für das Angebot und vielleicht bis nächste Woche.
Schönes WE einstweilen
Andreas
Antwort 7 von Kauz vom 07.11.2021, 22:22 Options
Hallo Andreas...
beim ersten groben drüberlesen, war mein erster Gedanke:
Ich würde statt einer Schaltfläche Optionbutton's nehmen, um zu bestimmen auf welches Tabellenblatt die Daten hinsollen.
Wenn die Userform nicht geschlossen wird, kann man den Zustand der Optionbutton's von überall abfragen.
z.B.:
if userform2.option1.value=true then
Tabelle1
else if userform2.option2.value =true then
TAbelle2
else
Endif
Vielleicht wäre das sinvoller als eine Schaltfläche, weil das Optionfeld selbst als 'Merker' zu verwenden ist.
Soweit meine Anregung dazu...
Gruß
Kauz
Antwort 8 von andreas_3 vom 11.11.2021, 11:36 Options
Hallo Kauz,
danke für die Anregung, aber ist im Moment nicht das, was ich brauche.
Vielleicht hab ich es auch zu kompliziert dargestellt, wie gesagt es kann sein, dass ich das einfachste einfach nicht sehe.
Ich kann auch leider die komplette Datei mit dem Makro nicht hochladen, ist viel zu komplex, und eine kleine Demo-Datei zu basteln, hab ich grad nicht den Nerv.
Ich wollte nur "rasch" mal so eine Userform einbauen, weil das an der Stelle sehr praktisch erscheint.
Also nochmal kurz das ursprüngliche Problem:
Ein Makro mit vielen Schritten lässt an einer Stelle die Userform erscheinen, der Anwender gibt Werte ein, und mit Schaltfläche "OK" läuft das Makro mit diesen Werten weiter. (das funktioniert schon)
Wie erreiche ich, dass mit der Schltfläche "Abbrechen" das Makro an der Stelle abbricht und die restlichen Schritte nicht ausgeführt werden?
Danke nochmals
LG
Andreas
Antwort 9 von Charlotte_S vom 11.11.2021, 14:22 Options
Hallo Andreas,
falls Du an sowas noch nicht gedacht hast, glaube ich, so genannte "globale" Public-Variablen könnten Dir grundsätzlich weiterhelfen. Sie werden in einem VBA-Modul (am besten gleich am Anfang) außerhalb von Sub XXX() ... End Sub deklariert:
Public GlobaleTextVariable As String
Zitat VBA-Hilfe: Auf Variablen, die mit der Public-Anweisung deklariert wurden, kann von allen Prozeduren in allen Modulen aus allen Anwendungen zugegriffen werden. Wenn allerdings Option Private Module aktiviert wurde, sind die Variablen nur innerhalb des zugehörigen Projekts öffentlich.
D. h. alle Deine Makros, Subs und alle Userform-Elemente/ -Ereignisse können diese Variablen gemeinsam benutzen (Werte lesen und zuweisen) und so Informationen austauschen.
MfG Charlotte
Antwort 10 von andreas_3 vom 12.11.2021, 12:20 Options
Hallo Charlotte,
ist es schlimm, dass ich damit gar nix anfangen kann? *seufz* (ich weiß immer mehr, was ich nicht weiß...) So ist das halt, wenn man sich alles selbst beibringt und immer alles irgendwo zusammenkopiert...
Ich glaub, ich muß doch nächste Woche, wenn ich dazu komme, mal eine Musterdatei basteln, damit mir vielleicht jemand konkret helfen kann.
Danke trotzdem einstweilen
LG
Andreas
Antwort 11 von andreas_3 vom 16.11.2021, 12:18 Options
Hallo zusammen
also, ich hab jetzt mal ein einfaches Beispiel gebastelt
http://www.file-upload.net/download-2014888/UserFormBeispiel.xls.html
in dem Beispiel soll das Makro1 alle Zeilen durchlaufen und die Abgänge mit Datum aus der userform in die Tabelle übertragen.
Das funktioniert auch soweit, aber ich möchte mit der Schaltfläche "Abbrechen" das Ganze stoppen können, und mit "Überspringen" soll in die Zeile kein Datum eingetragen werden und die nächste Zeile drankommen.
Mir fehlt einfach, wie ich dem Makro sage, welche Schaltfläche angeklickt wurde.
Nochmal: ich hab relativ wenig Hintergrundwissen, nur was ich so nach und nach mitgekriegt und zusammengebastelt habe. Sorry also, wenn ich mich dumm anstelle.
Dankeschön!
LG
Andreas
Antwort 12 von Charlotte_S vom 16.11.2021, 15:03 Options
Hallo Andreas,
hier mal vorab ein Vorschlag für Dich und zum Mitlesen für alle, bevor ich die geänderte Beispieldatei wieder hochlade:
in der Userform1:Private Sub CommandButton1_Click()
If IsNumeric(UserForm1.TextBox3.Text) Then
Abgang = CInt(UserForm1.TextBox3.Text)
Else 'falls in der TextBox3 Text oder gar nichts
Abgang = 0 'eingegeben und trotzdem OK gedrückt wurde
End If
Weiter = "OK"
UserForm1.Hide
End Sub
Private Sub CommandButton2_Click()
Weiter = "abbrechen"
Unload UserForm1
End Sub
Private Sub CommandButton3_Click()
Weiter = "überspringen"
UserForm1.Hide
End Sub
im Modul1:Public Weiter As String
Public Abgang As Integer
Sub Makro1()
Dim z As Integer
z = 2 'erste zu bearbeitende Zeile
'Die Schleife kann /1/ mit einer zusammengesetzten
' ODER-Bedingung: (Range("A" & z) = 0) Or (Weiter = "abbrechen")
'oder /2/ mit einer einfachen Bedingung: Range("A" & z) = 0
' und zusätzlichen Exit Do-Befehlen gesteuert werden
'Alternative /1/ oder /2/ wählen!
Do Until Range("A" & z) = 0 Or Weiter = "abbrechen" '/1/ entweder mit ODER-Bedingung
'Do Until Range("A" & z) = 0 '/2/ oder mit Exit Do im Case "abbrechen" und im Case Else
UserForm1.TextBox1.Text = Range("A" & z) 'Artikel in UF übernehmen
UserForm1.TextBox2.Text = Range("B" & z) 'Bestand des Artikels in UF übernehmen
UserForm1.Show
'MsgBox "Ausgang: " & Abgang & vbCrLf & "Schaltfläche: " & Weiter, , "letzte UF-Eingabe:"
Select Case Weiter
Case "OK"
'Schaltfläche "OK" wurde gedrückt,
'Abgang und Datum werden in Tabellenzeile z eingetragen
Cells(z, 3) = Abgang
Cells(z, 4).FormulaR1C1 = "=TODAY()"
'wahrscheinlich besser als die Eintragung der Formel "=TODAY()" in der vorigen Zeile:
'Cells(z, 4).FormulaR1C1 = Date 'trägt das aktuelle Datum ein
'Cells(z, 4).FormulaR1C1 = Now ' trägt Datum und Uhrzeit ein
UserForm1.TextBox3.Text = "" 'Eingabe aus TextBox3 löschen
Case "überspringen"
'Schaltfläche "überspringen" wurde gedrückt
UserForm1.TextBox3.Text = "" 'TextBox3 sicherheitshalber leeren
Case "abbrechen"
'Schaltfläche "abbrechen" wurde gedrückt
'Exit Do '/2/ wenn Schleifenbedingung Or Weiter = "abbrechen" nicht verwendet wird
Case Else
'keine Schaltfläche wurde gedrückt, sondern Kreuz zum Schließen der UF
Weiter = "abbrechen" '/1/ falls nicht mit Exit Do gearbeitet wird
'Exit Do '/2/ wenn vorige Zeile und Schleifenbedingung Or Weiter = "abbrechen" nicht verwendet wird
End Select
z = z + 1
Loop
Weiter = ""
End Sub
Siehe
http://www.file-upload.net/download-2015179/SN2282650_UserFormBeisp...MfG Charlotte
Antwort 13 von andreas_3 vom 16.11.2021, 15:14 Options
Hallo Charlotte,
vieeeelen Dank :-)
ich muß mich zwar erst etwas reinvertiefen, aber es sieht so aus, als könnte ich das verstehen, und einiges dazulernen.
Ich geb noch ne Erfolgsmeldung durch, wenn ich das auf mein ursprüngliches Problem übertragen konnte
Schönen Nachmittag noch
LG
Andreas
Antwort 14 von Charlotte_S vom 16.11.2021, 15:44 Options
Hallo!
Ich habe in Modul1 noch eine VBA-Zeile umgestellt, weil es sonst beim Schließen der Userform über das Schließen-X nicht so funktioniert, wie es sollte. D. h. ich habe oben eine Zeile:
'NÄCHSTE ZEILE EINGEFÜGT:
Weiter = "abbrechen" '/1/ falls nicht mit Exit Do gearbeitet wirdeingefügt, die ich weiter unten
'ZEILE GELÖSCHT: Weiter = "abbrechen" '/1/ falls nicht mit Exit Do gearbeitet wird :ZEILE GELÖSCHTgelöscht habe. (Leider funktioniert die Fettschrift innerhalb der Code-Formatierung nicht!)
Sub Makro1()
Dim z As Integer
z = 2 'erste zu bearbeitende Zeile
'Die Schleife kann /1/ mit einer zusammengesetzten
' ODER-Bedingung: (Range("A" & z) = 0) Or (Weiter = "abbrechen")
'oder /2/ mit einer einfachen Bedingung: Range("A" & z) = 0
' und zusätzlichen Exit Do-Befehlen gesteuert werden
'Alternative /1/ oder /2/ wählen!
Do Until Range("A" & z) = 0 Or Weiter = "abbrechen" '/1/ entweder mit ODER-Bedingung
'Do Until Range("A" & z) = 0 '/2/ oder mit Exit Do im Case "abbrechen" und im Case Else
UserForm1.TextBox1.Text = Range("A" & z) 'Artikel in UF übernehmen
UserForm1.TextBox2.Text = Range("B" & z) 'Bestand des Artikels in UF übernehmen
[b]'NÄCHSTE ZEILE EINGEFÜGT:
Weiter = "abbrechen" '/1/ falls nicht mit Exit Do gearbeitet wird[/b]
UserForm1.Show
'MsgBox "Ausgang: " & Abgang & vbCrLf & "Schaltfläche: " & Weiter, , "letzte UF-Eingabe:"
Select Case Weiter
Case "OK"
'Schaltfläche "OK" wurde gedrückt,
'Abgang und Datum werden in Tabellenzeile z eingetragen
Cells(z, 3) = Abgang
Cells(z, 4).FormulaR1C1 = "=TODAY()"
'wahrscheinlich besser als die Eintragung der Formel "=TODAY()" in der vorigen Zeile:
'Cells(z, 4).FormulaR1C1 = Date 'trägt das aktuelle Datum ein
'Cells(z, 4).FormulaR1C1 = Now ' trägt Datum und Uhrzeit ein
UserForm1.TextBox3.Text = "" 'Eingabe aus TextBox3 löschen
Case "überspringen"
'Schaltfläche "überspringen" wurde gedrückt
UserForm1.TextBox3.Text = "" 'TextBox3 sicherheitshalber leeren
Case "abbrechen"
'Schaltfläche "abbrechen" wurde gedrückt
'Exit Do '/2/ wenn Schleifenbedingung Or Weiter = "abbrechen" nicht verwendet wird
Case Else
'keine Schaltfläche wurde gedrückt, sondern Kreuz zum Schließen der UF
[b]'ZEILE GELÖSCHT: Weiter = "abbrechen" '/1/ falls nicht mit Exit Do gearbeitet wird :ZEILE GELÖSCHT[/b]
'Exit Do '/2/ wenn Schleifenbedingung Or Weiter = "abbrechen" nicht verwendet wird
End Select
'MsgBox "z = " & CStr(z) & vbCrLf & "Schaltfläche: " & Weiter, , "Schleifenende"
z = z + 1
Loop
Weiter = ""
End Sub
MfG Charlotte
Antwort 15 von andreas_3 vom 20.11.2021, 17:28 Options
Hallo Charlotte,
ich wollte nur noch rasch Bescheid geben... ich hab den Code verstanden und konnte mein ursprüngliches Makro so damit ausstatten, dass es alles so funktioniert wie ich mir's vorgestellt hab. Und ein bisschen mehr hab ich auch noch gelernt :-)
Vielen Dank für die Hilfe und die ausführliche Beschreibung!
Wünsch Dir ein schönes Wochenende
LG
Andreas