Supportnet / Forum / Tabellenkalkulation
CommandButton array
Frage
Hallo,
hab folgendes Prob: in einer Userform befinden sich z.B. 9 CommandButtons. Beim Öffnen der Arbeitsmappe sollen die Namen der Sheets den CommandButton-Captions zugewiesen werden. Das ganze soll mit einer Schleife erledigt werden.
for ? = 1 to 10 do
UserForm1.CommandButton?.Caption = Sheets(?).Name
endfor
Nun ist stellt sich mir die Frage, wie man CommandButtons als array ansprechen kann???
Antwort 1 von coros
Hi Sneaky601,
also so ganz verstehe ich nicht, was Du erreichen möchtest. Erkläre doch mal bitte, was passieren soll, wenn auf die Schaltflächen geklickt werden, bzw, was Du erreichen möchtest.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
also so ganz verstehe ich nicht, was Du erreichen möchtest. Erkläre doch mal bitte, was passieren soll, wenn auf die Schaltflächen geklickt werden, bzw, was Du erreichen möchtest.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 2 von Sneaky601
Hi Coros,
danke schon mal vorab für deine Hilfe.
Wenn die Buttons geklickt werden, soll je nach Sheet ein Macro ausgeführt werden. In erster Linie geht es mir aber um die Beschriftung der Knöpfe (Caption). Die Caption für Button 1 soll der Name von Sheet 3 sein zum Beispiel und dann fortlaufend.
Button 1 = Name von Sheet 3
Button 2 = Name von Sheet 4
Button 3 = Name von Sheet 5
usw.
Diese Zuweisung erledige ich beim Event Workbook_open.
Hilft das?
Gruß Sneaky601
danke schon mal vorab für deine Hilfe.
Wenn die Buttons geklickt werden, soll je nach Sheet ein Macro ausgeführt werden. In erster Linie geht es mir aber um die Beschriftung der Knöpfe (Caption). Die Caption für Button 1 soll der Name von Sheet 3 sein zum Beispiel und dann fortlaufend.
Button 1 = Name von Sheet 3
Button 2 = Name von Sheet 4
Button 3 = Name von Sheet 5
usw.
Diese Zuweisung erledige ich beim Event Workbook_open.
Hilft das?
Gruß Sneaky601
Antwort 3 von ProxYa
Da es sich hier um Excel handeln soll, ist das zumindest bis Office 2000 noch nicht möglich.
ommandbutton-Arrays lassen sich nur in VB selbst erstellen.
Steuerelementarrays sind in VBA nicht möglich
Ansprechen würde man sie dann aber mit
cmdAktion(i).Eigenschaft
wobei i für ein integer steht
Greets, ich
ommandbutton-Arrays lassen sich nur in VB selbst erstellen.
Steuerelementarrays sind in VBA nicht möglich
Ansprechen würde man sie dann aber mit
cmdAktion(i).Eigenschaft
wobei i für ein integer steht
Greets, ich
Antwort 4 von coros
Hi,
so auf die schnelle würde mir da nur was mit Hilfszellen, in die die Tabellenblattnamen geschrieben werden und dann den entsprechenden Buttons zugeordnet werden würden, einfallen. Nachfolgende Anweisung kopiere in die UserForm.
Es wird mittels einer Schleife 10 Blattnamen ausgelesen und in Spalte A beginnend ab Zeile 1 ausgegeben. Dannach werden den entsprechenden Buttons die Namen hinterlegt. Wenn die Blattnamen in eine andere Spalte geschrieben werden sollen, dann in der Zeile
Cells(i, 1) = Sheets(i).Name
die 1 gegen eine ander Zahl tauschen. Die 1 steht für Spalte A, eine 2 würde für Spalte B stehen, eine 3 für C usw. Es müssen dann allerdings auch noch die Cells(i, 1) hinter den CommandButtons angepasst werden.
Ich hoffe, das ist ein Lösungsansatz für Dich. Bei Fragen oder Problemen melde Dich noch mal.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
so auf die schnelle würde mir da nur was mit Hilfszellen, in die die Tabellenblattnamen geschrieben werden und dann den entsprechenden Buttons zugeordnet werden würden, einfallen. Nachfolgende Anweisung kopiere in die UserForm.
Private Sub UserForm_Activate()
Dim i As Integer
i = 0
For i = 1 To 10 Step 1
Cells(i, 1) = Sheets(i).Name
Next i
CommandButton10.Caption = Cells(1, 1)
CommandButton9.Caption = Cells(2, 1)
CommandButton8.Caption = Cells(3, 1)
CommandButton7.Caption = Cells(4, 1)
CommandButton6.Caption = Cells(5, 1)
CommandButton5.Caption = Cells(6, 1)
CommandButton4.Caption = Cells(7, 1)
CommandButton1.Caption = Cells(8, 1)
CommandButton2.Caption = Cells(9, 1)
CommandButton3.Caption = Cells(10, 1)
End Sub
Es wird mittels einer Schleife 10 Blattnamen ausgelesen und in Spalte A beginnend ab Zeile 1 ausgegeben. Dannach werden den entsprechenden Buttons die Namen hinterlegt. Wenn die Blattnamen in eine andere Spalte geschrieben werden sollen, dann in der Zeile
Cells(i, 1) = Sheets(i).Name
die 1 gegen eine ander Zahl tauschen. Die 1 steht für Spalte A, eine 2 würde für Spalte B stehen, eine 3 für C usw. Es müssen dann allerdings auch noch die Cells(i, 1) hinter den CommandButtons angepasst werden.
Ich hoffe, das ist ein Lösungsansatz für Dich. Bei Fragen oder Problemen melde Dich noch mal.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 5 von nighty
hi alle :)
eine variante ueber den weg eines globalen arrays
gruss nighty
nur ein beispiel
einzufuegen allgemeines modul
rem hier zwei checkboxen,gegen commandbutton auszutauschen ist.
rem reagiert auf zellenwechsel,einzufuegen altf11(vbeditor)/projektexplorer/DeineTabelle
eine variante ueber den weg eines globalen arrays
gruss nighty
nur ein beispiel
einzufuegen allgemeines modul
Public festhalt(10) As Integer
rem hier zwei checkboxen,gegen commandbutton auszutauschen ist.
Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
festhalt(1) = 1
Else
festhalt(1) = 0
End If
End Sub
Private Sub CheckBox2_Click()
If CheckBox2.Value = True Then
festhalt(2) = 1
Else
festhalt(2) = 0
End If
End Sub
rem reagiert auf zellenwechsel,einzufuegen altf11(vbeditor)/projektexplorer/DeineTabelle
Private Sub Worksheet_Change(ByVal Target As Range)For t1 = 1 To 2
If festhalt(t1) = 1 Then
Cells(t1, 1) = "" & t1 & "checkbox gesetzt"
Else
Cells(t1, 1) = "" & t1 & "checkbox nicht gesetzt"
End If
Next t1
End Sub
Antwort 6 von Sneaky601
@coros
So hab ich das auch, nur direkt zugewiesen.
Wobei Sheets(x) ja ein (einfaches) array ist.
Kann man denn soetwas nicht auch für Commandbuttons machen (àla commandbutton(x).caption)? Hat den Hintergrund, dass es ja nicht in jedem Workbook 10 Sheets sein müssen, sondern auch nur 3 sein können.
@ProxYa
Hab ein 2003er Office.
Was meinst du mit "cmdAktion(i).Eigenschaft"?
Thanks an den Rest für die Mühe!
Gruß Sneaky601
So hab ich das auch, nur direkt zugewiesen.
UserForm1.CommandButton1.Caption = Sheets(3).Name
UserForm1.CommandButton2.Caption = Sheets(4).Name
Wobei Sheets(x) ja ein (einfaches) array ist.
Kann man denn soetwas nicht auch für Commandbuttons machen (àla commandbutton(x).caption)? Hat den Hintergrund, dass es ja nicht in jedem Workbook 10 Sheets sein müssen, sondern auch nur 3 sein können.
@ProxYa
Hab ein 2003er Office.
Was meinst du mit "cmdAktion(i).Eigenschaft"?
Thanks an den Rest für die Mühe!
Gruß Sneaky601
Antwort 7 von ProxYa
ich hab nur den commandButton1 mit cmdAktion abgekürzt.
also eigentlich hätte ich schreiben müssen:
CommandButton(i)
das ".Eigenschaft" ist dann erstmal nicht so wichtig, ich dachte das du dich in den Grundzügen mit VBA auskennst.
Kurz dazu: Jedes Steuerelement, also auch der Commandbutton hat Eigenschaft wie zum Beispiel Schriftfarbe, Höhe, Breite usw.
Diese spricht man bei der Programmierung dann mit Steuerelement.Eigenschaft an.
So zum Beispiel:
Im 2003er Office kannst du folgendes versuchen:
Wenn du dir einen Commandbutton erstellst, diesen markierst, kopierst, dann irgendwo einfügst, kannst du feststellen ob Button-Arrays gehen.
Heißt der zweite automatisch Button2, dann gehen die arrays nicht.
Wenn du gefragt wirst, ob du eine Steuerelementenarray anlegen willst, dann geht es.
Greets, ich
also eigentlich hätte ich schreiben müssen:
CommandButton(i)
das ".Eigenschaft" ist dann erstmal nicht so wichtig, ich dachte das du dich in den Grundzügen mit VBA auskennst.
Kurz dazu: Jedes Steuerelement, also auch der Commandbutton hat Eigenschaft wie zum Beispiel Schriftfarbe, Höhe, Breite usw.
Diese spricht man bei der Programmierung dann mit Steuerelement.Eigenschaft an.
So zum Beispiel:
commandbutton1.height = 40 ' Setzt die Höhe des Cmd-Buttons auf 40
Im 2003er Office kannst du folgendes versuchen:
Wenn du dir einen Commandbutton erstellst, diesen markierst, kopierst, dann irgendwo einfügst, kannst du feststellen ob Button-Arrays gehen.
Heißt der zweite automatisch Button2, dann gehen die arrays nicht.
Wenn du gefragt wirst, ob du eine Steuerelementenarray anlegen willst, dann geht es.
Greets, ich
Antwort 8 von Sneaky601
Achso, dann hatte ich wohl ein Brett vorm Kopf... ;-) Ein bißchen VBA kann ich, jep.
Mit CommandButton(i) hab ich es schon versucht, meckert er aber :-(
Mit Copy&Paste heißt der zweite automatisch Button2, ALLERDINGS ist das bei den Sheets ja auch so und die kannste halt als array ansprechen...
Danke für die Aufklärung der .Eigenschaft *g*
Gruß Sneaky601
Mit CommandButton(i) hab ich es schon versucht, meckert er aber :-(
Mit Copy&Paste heißt der zweite automatisch Button2, ALLERDINGS ist das bei den Sheets ja auch so und die kannste halt als array ansprechen...
Danke für die Aufklärung der .Eigenschaft *g*
Gruß Sneaky601
Antwort 9 von coros
Hi,
hier noch eine Variante, in der zuerst die Anzahl der Tabellenblätter ermittelt wird und dieses dann für die Anzahl der Schleifendurchläufe verwendet wird. Somit ist dann die Anzahl der Tabellenbläter egal. Allerdings müssen entsprechend viele Schaltflächen vorhanden sein. Einzufügen wieder in der UserForm.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
hier noch eine Variante, in der zuerst die Anzahl der Tabellenblätter ermittelt wird und dieses dann für die Anzahl der Schleifendurchläufe verwendet wird. Somit ist dann die Anzahl der Tabellenbläter egal. Allerdings müssen entsprechend viele Schaltflächen vorhanden sein. Einzufügen wieder in der UserForm.
Private Sub UserForm_Activate()
Dim i As Integer, AnzahlBlaetter As Integer
AnzahlBlaetter = ThisWorkbook.Worksheets.Count
i = 0
For i = 1 To AnzahlBlaetter Step 1
Cells(i, 1) = Sheets(i).Name
Next i
CommandButton1.Caption = Cells(1, 1)
CommandButton2.Caption = Cells(2, 1)
CommandButton3.Caption = Cells(3, 1)
CommandButton4.Caption = Cells(4, 1)
CommandButton5.Caption = Cells(5, 1)
CommandButton6.Caption = Cells(6, 1)
CommandButton7.Caption = Cells(7, 1)
CommandButton8.Caption = Cells(8, 1)
CommandButton9.Caption = Cells(9, 1)
CommandButton10.Caption = Cells(10, 1)
End Sub
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 10 von Sneaky601
Hi coros,
kannste denn das
auch mit ner Schleife abfackeln???
Mal angenommen es gibt 100 Sheets und genauso viele Buttons: soll die .caption Zuweisung 100x kopiert werden?
Versteh mich bitte nicht falsch, aber es kommt mir einzig und allein auf die Buttons und die Zuweisung auf diese an, DAS würde ich gern per Schleife erledigen...
kannste denn das
CommandButton1.Caption = Cells(1, 1)
CommandButton2.Caption = Cells(2, 1)
CommandButton3.Caption = Cells(3, 1)
CommandButton4.Caption = Cells(4, 1)
CommandButton5.Caption = Cells(5, 1)
CommandButton6.Caption = Cells(6, 1)
CommandButton7.Caption = Cells(7, 1)
CommandButton8.Caption = Cells(8, 1)
CommandButton9.Caption = Cells(9, 1)
CommandButton10.Caption = Cells(10, 1)
auch mit ner Schleife abfackeln???
Mal angenommen es gibt 100 Sheets und genauso viele Buttons: soll die .caption Zuweisung 100x kopiert werden?
Versteh mich bitte nicht falsch, aber es kommt mir einzig und allein auf die Buttons und die Zuweisung auf diese an, DAS würde ich gern per Schleife erledigen...
Antwort 11 von coros
Hi,
ich wieder. Probier mal folgenden Code. Der sollte das machen, was Du möchtest.
Ich hoffe, das ist so, wie Du es Dir vorgestellt hast. Wenn nicht, melde Dich wieder.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
ich wieder. Probier mal folgenden Code. Der sollte das machen, was Du möchtest.
Private Sub UserForm_Activate()
Dim i As Integer, AnzahlBlaetter As Integer
AnzahlBlaetter = ThisWorkbook.Worksheets.Count
i = 0
For i = 1 To AnzahlBlaetter Step 1
Cells(i, 1) = Sheets(i).Name
Controls("CommandButton" & i).Caption = Sheets(i).Name
Next i
End Sub
Ich hoffe, das ist so, wie Du es Dir vorgestellt hast. Wenn nicht, melde Dich wieder.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 12 von Sneaky601
Hi coros,
das sieht schon verdammt gut aus!
Leider funzt das nicht: Bei
Haste da noch ne Idee? Hab schon rumprobiert, aber leider nix passendes gefunden...
Achso: Zeile 4 von unten kannste noch löschen ;-)
das sieht schon verdammt gut aus!
Leider funzt das nicht: Bei
Controls ("CommandButton" & i).Caption = Sheets(i).Name
bringt er eine Fehlermeldung (Sub or function not defined).Haste da noch ne Idee? Hab schon rumprobiert, aber leider nix passendes gefunden...
Achso: Zeile 4 von unten kannste noch löschen ;-)
Antwort 13 von coros
Hi,
sorry, aber da habe ich leider keine Idee. Bei mir funktioniert der obige Code in Excel2000 und Excel2003. Warum er bei Dir nicht funktioniert, kann ich leider nicht beurteilen. Ich hoffe mal, Du hast den obigen Code 1:1 übernommen. Oder hast Du etwas an dem Code geändert? Wenn ja, dann poste doch mal Deinen Code, damit man ihn auf Fehler untersuchen kann. Hast Du den Code in Deine UserForm hinterlegt. Sprich in der VBA Umgebung die UserForm mit der rechten Maustaste angewählt und in dem Menü "Code anzeigen" ausgewählt und dann den Code in das Fenster eingefügt? Wenn nicht, ist dass der Fehler. Der Code gehört in die UserForm, nicht in eine Schaltfläche in Deiner Tabelle oder so.
Ich hoffe, eventuell doch den nagel auf den Kopf getroffen zu haben.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
sorry, aber da habe ich leider keine Idee. Bei mir funktioniert der obige Code in Excel2000 und Excel2003. Warum er bei Dir nicht funktioniert, kann ich leider nicht beurteilen. Ich hoffe mal, Du hast den obigen Code 1:1 übernommen. Oder hast Du etwas an dem Code geändert? Wenn ja, dann poste doch mal Deinen Code, damit man ihn auf Fehler untersuchen kann. Hast Du den Code in Deine UserForm hinterlegt. Sprich in der VBA Umgebung die UserForm mit der rechten Maustaste angewählt und in dem Menü "Code anzeigen" ausgewählt und dann den Code in das Fenster eingefügt? Wenn nicht, ist dass der Fehler. Der Code gehört in die UserForm, nicht in eine Schaltfläche in Deiner Tabelle oder so.
Ich hoffe, eventuell doch den nagel auf den Kopf getroffen zu haben.
MfG,
coros
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 14 von nighty
hi ihr beiden :)
schon stringumwandlung probiert :)
Controls ("CommandButton" & str(i)).Caption = Sheets(i).Name
gruss nighty
schon stringumwandlung probiert :)
Controls ("CommandButton" & str(i)).Caption = Sheets(i).Name
gruss nighty
Antwort 15 von Sneaky601
Moin coros,
hatte den Code 1:1 in eine Userform übernommen - lief nicht. Hab mich dann 2 Stunden später nochmal davor gesetzt, ihn etwas angepasst und eine Kleinigkeit hinzugefügt, so dass folgendes dabei raus kam:
Damit macht er genau das, was ich haben wollte - Vielen Dank!
Auf das "controls" wär ich allein nicht gekommen und auf die Stringumwandlung wohl auch nicht...
hatte den Code 1:1 in eine Userform übernommen - lief nicht. Hab mich dann 2 Stunden später nochmal davor gesetzt, ihn etwas angepasst und eine Kleinigkeit hinzugefügt, so dass folgendes dabei raus kam:
Sub UserForm_Activate()
For i = 1 To ThisWorkbook.Worksheets.Count
UserForm1.Controls("CommandButton" & i).Caption = Sheets(i).Name
Next i
End Sub
Damit macht er genau das, was ich haben wollte - Vielen Dank!
Auf das "controls" wär ich allein nicht gekommen und auf die Stringumwandlung wohl auch nicht...
Antwort 16 von coros
Moin,
na bitte, freut mich, dass jetzt alles funktioniert. Wobei ich mir beim besten Willen nicht vorstellen kann, dass es an den zwei Änderungen liegen soll, dass der Fehler nicht mehr auftaucht. Das eine ist, Du arbeitest jetzt ohne die Variable "AnzahlBlaetter". Das ist aber nicht von Bedeutung. Das zweite, Du hast vor Controls UserForm1 geschrieben. Wenn Du wirklich den obigen Code in das VBA Projekt der UserForm1 kopiert hast, benötigst Du diesen Teil eigentlich nicht, da alles was in dem VBA Projekt der UserForm steht, sich auf diese UserForm bezieht. Aber egal, hauptsache es funktioniert. Danke auch für die Rückmeldung.
MfG,
coros
Jeder macht was er will, keiner macht was er soll, aber alle machen mit.
na bitte, freut mich, dass jetzt alles funktioniert. Wobei ich mir beim besten Willen nicht vorstellen kann, dass es an den zwei Änderungen liegen soll, dass der Fehler nicht mehr auftaucht. Das eine ist, Du arbeitest jetzt ohne die Variable "AnzahlBlaetter". Das ist aber nicht von Bedeutung. Das zweite, Du hast vor Controls UserForm1 geschrieben. Wenn Du wirklich den obigen Code in das VBA Projekt der UserForm1 kopiert hast, benötigst Du diesen Teil eigentlich nicht, da alles was in dem VBA Projekt der UserForm steht, sich auf diese UserForm bezieht. Aber egal, hauptsache es funktioniert. Danke auch für die Rückmeldung.
MfG,
coros
Jeder macht was er will, keiner macht was er soll, aber alle machen mit.
Antwort 17 von Sneaky601
Die Variable hab ich nur der Einfachheit halber "gekürzt" ;-)
Mein Excel wollte das ohne Userform davor nicht (trotzdem ich copy&paste mit deinem gepostetem Code gemacht hab - ehrlich!). Er hat zwar den Code abgearbeitet, aber halt mit der Fehlermeldung. Und die Namen der Blätter standen dann auch in dem aktiven Sheet in Spalte A, OBWOHL die Userform im Vordergrund war.
Naja, jedenfalls funktioniert dein (minimal modifizierter) Code jetzt sehr gut - Danke!
Gruß
Sneaky601
Mein Excel wollte das ohne Userform davor nicht (trotzdem ich copy&paste mit deinem gepostetem Code gemacht hab - ehrlich!). Er hat zwar den Code abgearbeitet, aber halt mit der Fehlermeldung. Und die Namen der Blätter standen dann auch in dem aktiven Sheet in Spalte A, OBWOHL die Userform im Vordergrund war.
Naja, jedenfalls funktioniert dein (minimal modifizierter) Code jetzt sehr gut - Danke!
Gruß
Sneaky601