CommandButton 4 Klicks,4 verschiedene Makros

Hallo allerseits,

rein informativ hätte ich gerne gewusst,ob es möglich ist,mit einem CommandButton mit jedem Klick nen anderes Makro aufzurufen.

Meine Logik als VBA Laie sagt mir ja,dass dies eigentlich nicht geht.Wenn ich aber sehe,was ihr Experten hier so alles bewerkstelligt,möchte ich fast behaupten,dass ihr auch diese Meinung wiederlegt.

Aber mal im konkreten:

Beim ersten Klick wird eine Userform geöffnet und mit Daten aus Spalte W gefüllt.Mit dem zweiten Klick wird selbige Userform mit Daten aus Spalte X gefüllt,mit drittem aus Spalte Y und letztem aus Spalte Z.

ich für mich bin der Meinung,wenn überhaupt,dann könnte das irgendwie über einen eingebauten Zähler funktionieren,der beim Schliessen der Userform wieder auf Null gesetzt wird.

Gibts da irgendeine Möglichkeit sowas zu bewerkstelligen oder ist sowas generell nicht machbar?

LG Frank

Hallo Frank,

hier mal ein Beispiel:
http://www.file-upload.net/download-7448006/UserForm…

Ich denke, du bist inzwischen fit genug in VBA, um den Code zu verstehen.

Gruß, Andreas

Hallo,

möchte mal meine Idee hier kundtun.

Folgender Code:

Private Sub CommandButton1\_Click()
ActiveCell.Activate
 Me.Range("E2").Value = Me.Range("E2").Value + 1
FormFüllen
End Sub

In E2 wird nun gezählt wie oft der Button gedrückt wird und die Userform wird geöffnet. Das Problem ist nur,solange die Userform geöffnet ist,ist kein weiteres betätigen des Buttons möglich.

Code der Userform:

Sub FormFüllen()
 With MeineForm
 .Siegerehrung.Caption = Sheets(1).Cells(10, 120)
 .Infotext.Caption = Sheets(1).Cells(14, 120)
 .Platz4.Caption = Sheets(1).Cells(16, 120)
 .Platz3.Caption = Sheets(1).Cells(19, 120)
 .Platz2.Caption = Sheets(1).Cells(21, 120)
 .Info.Caption = Sheets(1).Cells(24, 120)
 .Platz1.Caption = Sheets(1).Cells(26, 120)
 .Glückwunsch.Caption = Sheets(1).Cells(29, 120)
 .Show
 End With
End Sub

Nehmen wir mal die Zeile mit Platz 4 als Beispiel:
Excel holt sich aus Zeile 16 in Spalte 120 die benötigten Informationen. Sinn würde es machen,wenn ich direkt die Formel dafür irgendwie eingeben könnte.

=" «ø·º°°°º·ø» Platz „&KÜRZEN(KKLEINSTE($DG$13:blush:DG$166;ZEILEN($1:4)))
&“ mit „&INDEX($DH:blush:DH;VERGLEICH(KKLEINSTE($DG$13:blush:DG$166;
ZEILEN($1:4));$DG:blush:DG;0))&“ Punkten ist „&INDEX($DI:blush:DI;VERGLEICH
(KKLEINSTE($DG$13:blush:DG$166;ZEILEN($1:4));$DG:blush:DG;0))&“ «ø·º°°°º·ø» und bekommt 5 Chips dafür"

Wenn das zu umständlich ist,müsste man hergehen können und sagen:

If A1 = 1 Then
.Platz4.Caption = Sheets(1).Cells.Offset(20, 0).Value '20 Zeilen tiefer,selbe Spalte

If A1 = 2 Then
.Platz4.Caption = Sheets(1).Cells.Offset(40, 0).Value '40 Zeilen tiefer,selbe Spalte.

Das ist so mein Gedankengang. Ich weiss,meine Erklärung lässt bestimmt wieder zu wünschen übrig. Dafür im Vorfeld schonmal „Sorry“.

Was noch wichtig wäre,ist,dass ich diese Zeile in der Userform markieren/kopieren kann.Im Moment ist dies nicht möglich.

Hat jemand dazu ne Idee?

LG Frank

Hallo Andreas,

du bist ein Genie. Dein Beispiel,welches du mir geschickt hast,war schon gut.Aber das hier ist sogar super gut.Genau das,was ich gesucht habe.

Eine Frage hätte ich noch.Kann ich irgendwo einstellen,dass ich die einzelnen Zeilen markieren/kopieren kann? Weil dies nicht möglich ist.Ansonsten ist das perfekt.

Vielen vielen Dank dafür.

LG Frank

Welche „Zeilen“ meinst du?

Gruß, Andreas

Hallo Andreas,

die Zeilen,die mir in der Userform angezeigt werden.Sie werden ja letztendlich nur 1x zum anzeigen,markieren und kopieren benötigt.

LG Frank

Hallo,

Hallo Frank,

möchte mal meine Idee hier kundtun.

Folgender Code:

Private Sub CommandButton1_Click()
ActiveCell.Activate
Me.Range(„E2“).Value = Me.Range(„E2“).Value + 1
FormFüllen
End Sub

In E2 wird nun gezählt wie oft der Button gedrückt wird und
die Userform wird geöffnet. Das Problem ist nur,solange die
Userform geöffnet ist,ist kein weiteres betätigen des Buttons
möglich.

Code der Userform:

Sub FormFüllen()
With MeineForm
.Siegerehrung.Caption = Sheets(1).Cells(10, 120)
.Infotext.Caption = Sheets(1).Cells(14, 120)
.Platz4.Caption = Sheets(1).Cells(16, 120)
.Platz3.Caption = Sheets(1).Cells(19, 120)
.Platz2.Caption = Sheets(1).Cells(21, 120)
.Info.Caption = Sheets(1).Cells(24, 120)
.Platz1.Caption = Sheets(1).Cells(26, 120)
.Glückwunsch.Caption = Sheets(1).Cells(29, 120)
.Show

End With
End Sub

Du hast meinen letzten Code nicht genau gelesen. Da steht

.Show vbModeless

Dann kannst du auch weiter klicken.

Nehmen wir mal die Zeile mit Platz 4 als Beispiel:
Excel holt sich aus Zeile 16 in Spalte 120 die benötigten
Informationen. Sinn würde es machen,wenn ich direkt die Formel
dafür irgendwie eingeben könnte.

=" «ø·º°°°º·ø» Platz
„&KÜRZEN(KKLEINSTE($DG$13:blush:DG$166;ZEILEN($1:4)))
&“ mit „&INDEX($DH:blush:DH;VERGLEICH(KKLEINSTE($DG$13:blush:DG$166;
ZEILEN($1:4));$DG:blush:DG;0))&“ Punkten ist
„&INDEX($DI:blush:DI;VERGLEICH
(KKLEINSTE($DG$13:blush:DG$166;ZEILEN($1:4));$DG:blush:DG;0))&“
«ø·º°°°º·ø» und bekommt 5 Chips dafür"

Wenn das zu umständlich ist,müsste man hergehen können und
sagen:

If A1 = 1 Then
.Platz4.Caption = Sheets(1).Cells.Offset(20, 0).Value '20
Zeilen tiefer,selbe Spalte

If A1 = 2 Then
.Platz4.Caption = Sheets(1).Cells.Offset(40, 0).Value '40
Zeilen tiefer,selbe Spalte.

Das geht imo nicht. In Label-Boxen kannst du nur Text reinschreiben, aber keine Formeln berechnen lassen, so viel ich weiß. Ich lass mich aber gerne von den Experten eines Besseren belehren.

Das ist so mein Gedankengang. Ich weiss,meine Erklärung lässt
bestimmt wieder zu wünschen übrig. Dafür im Vorfeld schonmal
„Sorry“.

Was noch wichtig wäre,ist,dass ich diese Zeile in der Userform
markieren/kopieren kann.Im Moment ist dies nicht möglich.

In meiner UserForm habe ich ja nur mit Label-Boxen gearbeitet. Da geht das nicht. Wenn du die aber durch Textboxen (eigentlich für Eingaben gedacht, man kann sie aber auch sperren) ersetzt, dann kannst du auch markieren/kopieren.

Hat jemand dazu ne Idee?

LG Frank

Gruß, Andreas

Hallo Andreas,

zu diesem Zeitpunkt hatte ich deinen Beitrag noch nicht gesehen.Hat sich wohl überschnitten.

Wenn ich nun eines der Label gegen eine Textbox austausche,dann passt aber der Code > .Infotext.Caption = Sheets(1).Cells(3, lauf + 1) nicht mehr.

In der Hilfe finde ich nichts gescheites darüber und alles was ich im Netz gefunden und ausprobiert habe klappt nicht…grrrrrr

LG Frank

Hallo Frank,

du musst der Textbox den Namen „Infotxt“ geben: Gehe in den VBA Editor, rufe die Userform auf und klicke in die Textbox. Im Eingenschaften-Fenster gibst du im Name-Feld „Infotext“ ein.

Eine Caption-Eigenschaft hat die Textbox nicht. Dafüt gibt’s die Eigenschaft Text. Der Code muss dann heißen:

.Infotext.Text = Sheets(1).Cells(3, lauf + 1)

Gruß, Andreas

Hallo Andreas,

irgendwann werde ich noch wahnsinnig bei Excel.

Sowohl die Eigenschaft .ControlSource als auch .Text hatte ich im Netz gefunden.Mindestens 10x ausprobiert und nie hats geklappt.JEtzt plötzlich geht es auf einmal. Allerdings nimmt Excel bei mir den Namen „Infotext“ bei mir nicht. Mehrdeutiger Name.Mit „Textbox1“ geht es aber.

Ich bekomme noch graue Haare. Möchte zu gerne wissen,warum Excel nun so oft gestreikt hat.

Problem wäre dann gelöst.

Nochmals vielen Dank für deine Hilfe.

LG Frank

Hallo Andreas,

Hallo Frank,

geklappt.JEtzt plötzlich geht es auf einmal. Allerdings nimmt
Excel bei mir den Namen „Infotext“ bei mir nicht. Mehrdeutiger
Name.Mit „Textbox1“ geht es aber.

Vermutlich hattest du die Label-Box mit gleichem Namen noch auf der UserForm.

Problem wäre dann gelöst.

Nochmals vielen Dank für deine Hilfe.

You’re welcome.

LG Frank

Gruß, Andreas

Guten Morgen.

war ich wohl ein wenig zu voreilig mit „Problem wäre dann gelöst“.

Folgender Code für eine Userform:

Sub FormFüllen()
 Static lauf As Integer

 With MeineForm
 If Not .Visible Then
 lauf = 0
 .Show vbModeless
 End If
 .Ueberschrift.Caption = Sheets(1).Cells(2, lauf + 1)
 .infotext.Text = Sheets(1).Cells(3, lauf + 1)
 .NochNText.Caption = Sheets(1).Cells(4, lauf + 1)
 .UndNochNText.Caption = Sheets(1).Cells(5, lauf + 1)
 End With
 lauf = (lauf + 1) Mod 3
End Sub

Funktioniert auch einwandfrei. Meine Daten stehen aber in einer Spalte. Ich hatte zwar geschrieben,in verschiedenen Spalten,aber ich dachte durch die Angabe über z.B. Cells(5, 5) würde ich das hinbekommen. Leider weit gefehlt.

Warum klappt das nicht mit der Cells-Angabe? Wo ist mein Denkfehler?

LG Frank

Hallo Frank,

dann musst du eben in den Cells nicht die Spalte verändern, sondern die Zeile. Die Spalte muss dann konstant bleiben.
Ob es dann reicht, wie im Beispiel mit jedem Aufruf lauf um 1 zu erhöhen, weiß ich nicht. Das hängt davon ab, in welchen Zeilen deine Daten stehen. Versuch mal die „Regelmäßigkeit“ in der Posistion deiner Daten zu finden. Bei meinem Beispiel war es „Bei jedem Aufruf eine Spalte weiter links“.
Das mit dem „Mod 3“ musst du natürlich verändern. Das hatte ich ja nur drin, um nach dem 4. Klick wieder bei 1 anzufangen.

Gruß, Andreas

Hallo Frank,

Funktioniert auch einwandfrei. Meine Daten stehen aber in
einer Spalte. Ich hatte zwar geschrieben,in verschiedenen
Spalten,aber ich dachte durch die Angabe über z.B. Cells(5, 5)
würde ich das hinbekommen. Leider weit gefehlt.

Option Explicit

' durchläuft erst B2 , C2 , D2 , E2
'dann B3 , C3 , D3 , E3
'usw.

Sub FormFüllen()
Static lauf As Integer
With MeineForm
 If Not .Visible Then .Show vbModeless
 lauf = IIf(lauf = 4, 1, lauf + 1)
 .Ueberschrift.Caption = Sheets(1).Cells(lauf + 1, 2)
 .infotext.Text = Sheets(1).Cells(lauf + 1, 3)
 .NochNText.Caption = Sheets(1).Cells(lauf + 1, 4)
 .UndNochNText.Caption = Sheets(1).Cells(lauf + 1, 5)
End With
End Sub

Warum klappt das nicht mit der Cells-Angabe? Wo ist mein
Denkfehler?

K.A., vieles möglich.

Gruß
Reinhard

Hallo Andreas,

das scheint heute nicht mein Tag zu werden.

Mit „.Siegerehrung.Caption = Sheets(1).Cells(10, 120)“ sage ich Zeile 10 in Spalte 120.

Wenn ich aber nun schreibe „.Infotext.Text = Sheets(1).Cells(10, lauf + 20, 120)“ geht es nicht. Hab nun schon alle Kombinationen durch.

Die Regelmäßigkeit in meinen Daten sind 20 Zeilen.

Aber ich probiere weiter…grrrrrr

LG Frank

ungetestet, hab’s hier von Hand reingetippt:

Sub FormFüllen()
 Static lauf As Integer

 With MeineForm
 If Not .Visible Then
 lauf = 10
 .Show vbModeless
 End If
 .Ueberschrift.Caption = Sheets(1).Cells(lauf, 120)
 .infotext.Text = Sheets(1).Cells(lauf + 1, 120)
 .NochNText.Caption = Sheets(1).Cells(lauf + 2, 120)
 .UndNochNText.Caption = Sheets(1).Cells(lauf + 3, 120)
 End With
 lauf = lauf + 20
End Sub

Gruß, Andreas

Hallo Andreas,

hab den Code jetzt mal angepasst.

Sub FormFüllen()
 Static lauf As Integer

 With MeineForm
 If Not .Visible Then
 lauf = 10
 .Show vbModeless
 End If
 .Siegerehrung.Caption = Sheets(1).Cells(10, 120)
 .Infotext.Text = Sheets(1).Cells(lauf + 4, 120)
 .Platz4.Caption = Sheets(1).Cells(lauf + 6, 120)
 .Platz3.Caption = Sheets(1).Cells(lauf + 9, 120)
 .Platz2.Caption = Sheets(1).Cells(lauf + 11, 120)
 .Info.Caption = Sheets(1).Cells(lauf + 14, 120)
 .Platz1.Caption = Sheets(1).Cells(lauf + 16, 120)
 .Glückwunsch.Caption = Sheets(1).Cells(lauf + 19, 120)

 End With
 lauf = lauf + 20
End Sub

Da hätte ich noch dn ganzen Tag suchen können und hätte den Fehler nicht gefunden. > lauf = (lauf + 1) Mod 3

Aber soweit läuft der Code jetzt.Lediglich dieses Mod 3 fehlt mir,da ich jetzt endlos drücken kann. Aber damit kann ich leben.

Nochmals vielen Dank für die Hilfe

LG Frank

Hallo Frank,

lauf = IIf(lauf \> xxx, 10, lauf + 20)

Für xxx die größte Zeilennummer einsetzen, die lauf werden soll, bevor er wieder nach Zeile 10 springt.

Gruß, Andreas

Hallo Andreas,

habe jetzt de Code dementsprechend angepasst.

Sub FormFüllen()
 Static lauf As Integer

 With MeineForm
 If Not .Visible Then
 lauf = 10
 .Show vbModeless
 End If
 .Siegerehrung.Caption = Sheets(1).Cells(10, 120)
 .Infotext.Text = Sheets(1).Cells(lauf + 4, 120)
 .Platz4.Text = Sheets(1).Cells(lauf + 6, 120)
 .Platz3.Text = Sheets(1).Cells(lauf + 9, 120)
 .Platz2.Text = Sheets(1).Cells(lauf + 11, 120)
 .Info.Text = Sheets(1).Cells(lauf + 14, 120)
 .Platz1.Text = Sheets(1).Cells(lauf + 16, 120)
 .Glückwunsch.Text = Sheets(1).Cells(lauf + 19, 120)
 End With
 lauf = IIf(lauf \> 69, 10, lauf + 20)
End Sub

Nur fürs Verständnis. Ist es normal,dass es einen Durchlauf gibt der leer ist,bevor wieder zurück gesprungen wird?

Ansonsten läuft alles perfekt und entspricht genau meinen Vorstellungen. Den Fehler hätte ich niemals gefunden.Die Zeile > lauf = (lauf + 1) Mod 3 war für mich unantastbar. Alles andere hatte ich probiert.

Vielen vielen Dank.

LG Frank

Hallo Andreas,

Hallo Frank,

habe jetzt de Code dementsprechend angepasst.

Sub FormFüllen()
Static lauf As Integer

With MeineForm
If Not .Visible Then
lauf = 10
.Show vbModeless
End If
.Siegerehrung.Caption = Sheets(1).Cells(10, 120)
.Infotext.Text = Sheets(1).Cells(lauf + 4, 120)
.Platz4.Text = Sheets(1).Cells(lauf + 6, 120)
.Platz3.Text = Sheets(1).Cells(lauf + 9, 120)
.Platz2.Text = Sheets(1).Cells(lauf + 11, 120)
.Info.Text = Sheets(1).Cells(lauf + 14, 120)
.Platz1.Text = Sheets(1).Cells(lauf + 16, 120)
.Glückwunsch.Text = Sheets(1).Cells(lauf + 19, 120)
End With
lauf = IIf(lauf > 69, 10, lauf + 20)
End Sub

Nur fürs Verständnis. Ist es normal,dass es einen Durchlauf
gibt der leer ist,bevor wieder zurück gesprungen wird?

Ich hab mich vermutlich unklar ausgedrückt:
lauf muss 10,30,50 sein und dann wieder auf 10 springen, also:

lauf = IIf(lauf \> 50, 10, lauf + 20)

Dann sollte auch der leere Durchlauf weg sein.

Vielen vielen Dank.

LG Frank

Gruß, Andreas