Supportnet Computer
Planet of Tech

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.

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

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

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.

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


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:

  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


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.

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


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.

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

Antwort 14 von nighty

hi ihr beiden :)

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:

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.

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