6.4k Aufrufe
Gefragt in Tabellenkalkulation von andreas_3 Mitglied (109 Punkte)
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

[*][sup]
*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.
[/sup]

15 Antworten

0 Punkte
Beantwortet von andreas_3 Mitglied (109 Punkte)
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
0 Punkte
Beantwortet von
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 www.file-upload.net/download-2015179/SN2282650_UserFormBeispiel.xls.html

MfG Charlotte
0 Punkte
Beantwortet von andreas_3 Mitglied (109 Punkte)
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
0 Punkte
Beantwortet von
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 wird

eingefügt, die ich weiter unten
'ZEILE GELÖSCHT: Weiter = "abbrechen" '/1/ falls nicht mit Exit Do gearbeitet wird :ZEILE GELÖSCHT
gelö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
'NÄCHSTE ZEILE EINGEFÜGT:
Weiter = "abbrechen" '/1/ falls nicht mit Exit Do gearbeitet wird


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
'ZEILE GELÖSCHT: Weiter = "abbrechen" '/1/ falls nicht mit Exit Do gearbeitet wird :ZEILE GELÖSCHT
'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
0 Punkte
Beantwortet von andreas_3 Mitglied (109 Punkte)
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
...