Excel-VBA:Symbolleiste/aktiviertes Symbol

Hallo,

ich habe ein Makro, dass ein bestimmtes Verhalten mittels boolean-Variable im Wechsel ein- oder ausschaltet.

Schmematisch dargestellt, sieht das so aus:

Dim EA as Boolean
 
Sub EinAus()
EA=Not EA
End Sub

Dieses Makro habe ich an eine Schaltfläche in einer Symbolleiste gebunden.
Mein Ziel ist es, das Symbol so zu gestalten, dass es bei aktivierter Funktion (EA=True) optisch eingedrückt bzw. aktiviert erscheint und bei deaktivierter Funktion (EA=False) wieder im Normalzustand, ähnlich wie die Symbole zur Schriftformatierung in der Format-Symbolleiste.

Wie kann ich das per VBA erreichen?
Wäre schön, wenn ich das Symbol nicht direkt adressieren müsste, so dass jedes Symbol, dass an dieses Makro geknüpft ist auch in verschiedenen Symbolleisten auf die gleiche Weise reagiert (vielleicht kann man die „Caller“-Eigenschaft nutzen??)

Vielen Dank für Eure Vorschläge und viele Grüße, tester

Hi tester,

Mein Ziel ist es, das Symbol so zu gestalten, dass es bei
aktivierter Funktion (EA=True) optisch eingedrückt bzw.
aktiviert erscheint und bei deaktivierter Funktion (EA=False)
wieder im Normalzustand, ähnlich wie die Symbole zur
Schriftformatierung in der Format-Symbolleiste.

Wie an CommandButton(Nr).Picture ersichtlich, ungetestet, 2 Varianten:

Option Explicit
Public AktivAlle(10)

Private Sub CommandButton1\_Click()
Static Aktiv As Boolean
Aktiv = Not Aktiv
If Aktiv Then
 CommandButton1.Picture = LoadPicture("c:\test\AkltiverKnopf1.jpg")
Else
 CommandButton1.Picture = LoadPicture("c:\test\DeaktiverKnopf1.jpg")
End If
End Sub

Private Sub CommandButton2\_Click()
Static Aktiv As Boolean
Aktiv = Not Aktiv
If Aktiv Then
 CommandButton1.Picture = LoadPicture("c:\test\AkltiverKnopf2.jpg")
Else
 CommandButton1.Picture = LoadPicture("c:\test\DeaktiverKnopf2.jpg")
End If
End Sub

Private Sub CommandButton1\_Click()
Call alle(1)
End Sub

Private Sub CommandButton2\_Click()
Call alle(2)
End Sub

Sub alle(Nr)
AktivAlle(Nr) = Not AktivAlle(Nr)
If AktivAlle(Nr) Then
 CommandButton(Nr).Picture = LoadPicture("c:\test\AkltiverKnopf" & Nr & ".jpg")
Else
 CommandButton(Nr).Picture = LoadPicture("c:\test\DeaktiverKnopf" & Nr & ".jpg")
End If
End Sub

Wäre schön, wenn ich das Symbol nicht direkt adressieren
müsste, so dass jedes Symbol, dass an dieses Makro geknüpft
ist auch in verschiedenen Symbolleisten auf die gleiche Weise
reagiert (vielleicht kann man die „Caller“-Eigenschaft
nutzen??)

Geht m.E. nur über Klassenmodul.

Gruß
Reinhard

Hallo Reinhard,

gibt’s dafür nicht ‚Radiobutton‘?

Wenn das nicht passt, dann würde ich das mit Picture- oder Image-Steuerelementen statt Button machen, da gibt es kein vorgegebenes Design. :smile: Einen Button ‚versenkt‘ darzustellen (und dann auch noch so zu lassen) geht IMHO nicht.

Gruß, Rainer

gibt’s dafür nicht ‚Radiobutton‘?

Wenn das nicht passt, dann würde ich das mit Picture- oder
Image-Steuerelementen statt Button machen, da gibt es kein
vorgegebenes Design. :smile: Einen Button ‚versenkt‘ darzustellen
(und dann auch noch so zu lassen) geht IMHO nicht.

Hallo Rainer,
keinen Radiobutton, aber bei erneutem Durchblättern der Steuerelemente stiess ich auf „Microsoft Forms 2.0 Togglebutton“.
Muss man halt noch prüfen ob und wie man den in eine Symbolleiste bekommt.
Im Tabellenblatt selbst zeigt er das gewünschte Verhalten.

ps: die mail kam an, danke. Rückmeldung kann dauern, suche immer noch die mistige CD von VB6, muss aber zugeben, nicht sehr angestrengt da ich davon ausgehe dass es eh nur die Light version ist.

Gruß
Reinhard

Hallo Reinhard,

keinen Radiobutton, aber bei erneutem Durchblättern der
Steuerelemente stiess ich auf „Microsoft Forms 2.0
Togglebutton“.

ahhh, gibt’s in VB6 nicht. :smile: Ja, das wär’s doch!

Muss man halt noch prüfen ob und wie man den in eine
Symbolleiste bekommt.
Im Tabellenblatt selbst zeigt er das gewünschte Verhalten.

ps: die mail kam an, danke. Rückmeldung kann dauern, suche
immer noch die mistige CD von VB6, muss aber zugeben, nicht
sehr angestrengt da ich davon ausgehe dass es eh nur die Light
version ist.

Dann verwende das Modul doch einfach in VBA. Wenn Du dann einfach 'Barcode ’ tippst, sagt Dir VB schon, welche Parameter verlangt werden. Die sind so bezeichnet, daß keine Fragen entstehen. :smile: … falls doch, kannst Du die Fragen ja stellen. Ob hier oder per Mail ist egal.

Ich poste einfach mal den gigantischen Code der Form:

Option Explicit

Private Sub Command1\_Click()
 If Option1(0).Value = True Then
 Picture1.ScaleMode = 3 'Pixel
 Picture1.Cls
 Barcode Picture1, "\*" + Text1.Text + "\*", 10, 10, 40, 3, True
 Else
 Printer.ScaleMode = 3 'Pixel
 Barcode Printer, "\*" + Text1.Text + "\*", 10, 10, 200, 6, True
 Printer.EndDoc
 End If
End Sub

Die Parameter:
1.) Das Steuerelement, auf das der Barcode ausgegeben werden soll.
2.) Der Text, der übersetzt werden soll
3.) x-Koordinate
4.) y-Koordinate
5.) Höhe des Barcodes
6.) Faktor. Der Barcode ist scalierbar, fest ist nur das Verhältnis, die Scanner können das lesen. Ist der Platz knapp, kann man sehr fein drucken, dann passen viele Informationen in einen Balken, ist das Papier schlecht oder wird oft beschädigt, verschmutzt, dann sind breite Balken sinnvoll, der Code bleibt dann trotzdem lesbar.
7.) True heißt, den Klartext unter den Balken drucken.

Gruß, Rainer

Hallo,

entschuldigt aber wahrscheinlich habt ihr mich mißverstanden.
Ich meine kein Schaltfläche in einem Tabellenblatt sondern eine ganz normale Symbolschaltfläche in einer benutzerdefinierten Symbolleiste.
Diese wurde eingefügt über: Symbolleiste->Rechtsklick->Anpassen->Register „Befehle“->Kategorie: „Makros“ -> Befehle: „Schaltfläche anpassen“.

Habe auch schon herausgefunden, dass man mit „state=msoButtonDown“ die Schaltfläche als ausgewählt darstellen kann und dies mit „state=msoButtonUp“ wieder aufheben kann.

Nur wie kann ich die Symbollschaltfläche adressieren, ohne sie genau benennen zu müssen? (analog „ActiveControl“ für Formulare).

Vielleicht schafft das etwas Klarheit und ihr könnt mir noch ein paar Tips geben.

Gruß, tester

Hallo Rainer.

ahhh, gibt’s in VB6 nicht. :smile: Ja, das wär’s doch!

Nimm’ Dir doch mal eine CheckBox auf ein Formuar in VB6 und spiel’ mal mit der Style-Eigenschaft.

Viele Grüße
Carsten

1 Like

Hallo tester.

Wäre schön, wenn ich das Symbol nicht direkt adressieren
müsste, so dass jedes Symbol, dass an dieses Makro geknüpft
ist auch in verschiedenen Symbolleisten auf die gleiche Weise
reagiert (vielleicht kann man die „Caller“-Eigenschaft
nutzen??)

So ganz verstehe ich nicht, was Du mit „verschiedene Symbolleisten“ meinst. Hast Du mehrere benutzerdefinierte Symbolleisten in einer Exceldatei oder willst Du in mehreren gleichartigen Exceldateien immer dieselbe benutzerdefinierte Symbolleiste anzeigen?

Viele Grüße
Carsten

entschuldigt aber wahrscheinlich habt ihr mich mißverstanden.
Ich meine kein Schaltfläche in einem Tabellenblatt sondern
eine ganz normale Symbolschaltfläche in einer
benutzerdefinierten Symbolleiste.
Diese wurde eingefügt über:
Symbolleiste->Rechtsklick->Anpassen->Register
„Befehle“->Kategorie: „Makros“ -> Befehle: „Schaltfläche
anpassen“.
Habe auch schon herausgefunden, dass man mit
„state=msoButtonDown“ die Schaltfläche als ausgewählt
darstellen kann und dies mit „state=msoButtonUp“ wieder
aufheben kann.
Nur wie kann ich die Symbollschaltfläche adressieren, ohne sie
genau benennen zu müssen? (analog „ActiveControl“ für
Formulare).

Hi tester,
so kannst du zumindest allen Schaltknöpfen das gleiche Makro zuweisen.
Mit ActiveControl schaffte ich es nicht.

Sub tt()
'MsgBox Application.Caller(1) 'laufende Nummer in der Symbolleiste
'MsgBox Application.Caller(2) 'Format ?
'MsgBox Application.Caller(3) ' Index zu groß
'MsgBox Application.Caller(4) ' Index zu groß
Call Makro(Application.Caller(1))
'Dim AktSteuerelement
'
'Set AktSteuerelement = Application.ActiveControl
'
'AktSteuerelement.State = msoButtonDown
'MsgBox AktSteuerelement.Name
End Sub

Sub Makro(Nr)
Select Case Nr
'...
End Sub

Gruß
Reinhra

Hi Carsten,

ahhh, gibt’s in VB6 nicht. :smile: Ja, das wär’s doch!

Nimm’ Dir doch mal eine CheckBox auf ein Formuar in VB6 und
spiel’ mal mit der Style-Eigenschaft.

*gg* da bastel ich so lange mit VB rum … das ist mir noch nie aufgefallen! Danke!

Gruß, Rainer

Hallo tester.

So ganz verstehe ich nicht, was Du mit „verschiedene
Symbolleisten“ meinst. Hast Du mehrere benutzerdefinierte
Symbolleisten in einer Exceldatei oder willst Du in mehreren
gleichartigen Exceldateien immer dieselbe benutzerdefinierte
Symbolleiste anzeigen?

Hallo,

Das Makro, welches bei Klick auf die Schaltfläche ausgeführt wird, liegt in der personl.xls., ist also für jede Exceldatei zugänglich.

Mein Ziel ist es, dass jede Schaltfläche in den Symbolleisten die an dieses Makro gebunden wird, unabhängig davon in welcher Arbeitsmappe, benutzerdefinierten oder auch original Excelsymbolleiste es liegt, den Statusänderungen unterliegt.

Ein Beispiel, welches mein Ziel genau veranschaulicht:

Füge der Symbolleisten Format nochmals das vordefiniertes Symbol für Fettschrift hinzu (Rechtsklick->Anpassen->Reiter Befehle, Kategorie Format). Dann füge in eine weitere Symbolleiste (z.B. Standard) nochmals dieses Symbol hinzu, so dass Du über drei verschiedene Symbole eine Zelle in Fettschrift formatieren kannst.
Sobald Du eines der Symbole anklickst wird bei allen dreien der Status geändert. Genauso möchte ich das bei meinen benutzerdefinierten Symbolschaltflächen auch haben.

Vereinfachend würde es mir auch genügen, dass nur das einzelne Symbol welches gerade angeklickt wurde den Status ändert.

Mit einer genauen Adressierung für ein einzelnes Symbol habe ich den Statuswechsel auch schon hinbekommen:

Sub StatusÄndern()
Static EA As Boolean
Dim Symb As CommandBarButton
EA = Not EA
Set Symb = CommandBars("Formatting").Controls("Test")
Symb.State = IIf(EA, msoButtonDown, msoButtonUp)
End Sub

Jedoch muss dann das Symbol immer in der Symbolleiste „Format“ liegen und immer „Test“ heißen. Sobald das Symbol in eine andere Symbolleiste verschoben wird oder dort ein neues erzeugt wird, funktioniert das Makro nicht mehr.

Statt „Set Symb = CommandBars(„Formatting“).Controls(„Test“)“, sprich der direkten Adressierung suche ich einen Weg, wie ich alle Symbole die an mein Makro gebunden sind oder wenigsten die aktuell aufrufende Symbolschaltfläche ansprechen kann.
Dachte schon an „FindControls“ (aber welche Suchkriterien, sprich ID) oder an „Caller“, was aber scheinbar nicht zum Erfolg führt.

Gruß, tester