online 1
gast (50)

/ Forum / Tabellenkalkulation

TabellenkalkulationTabellenkalkulation

Fragevon andreas_3 vom 06.11.2021, 11:51 Options

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

    Hallo Andreas,
    mit einer Musterdatei ist es bestimmt möglich dir zu helfen.

    http://www.file-upload.net/

    Gruß
    fedjo

    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 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
    [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

    Ähnliche Themen

    Schaltfläche in Excel einbinden?
    Mark_tp  05.06.2008 - 61 Hits - 4 Antworten

    VBA - Löschen UserForm
    Tomschi  10.06.2008 - 73 Hits - 3 Antworten

    Makro / Schaltfläche / Verknüpfung
    Tomschi  07.04.2009 - 204 Hits - 4 Antworten

    Spalten Ein-/Ausblenden über eine Schaltfläche
    Jessi-baby  08.07.2009 - 255 Hits - 4 Antworten

    Excel 2003 - VBA - Userform löschen
    pesi  15.09.2009 - 365 Hits - 2 Antworten

    Hinweis

    Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

    Neue Einträge

    Version: supportware 1.9.150 / 10.06.2022, Startzeit:Mon Jan 26 20:06:00 2026