315 Aufrufe
Gefragt in Tabellenkalkulation von revanchist Mitglied (210 Punkte)

Hallo in die Runde der Experten

ist es möglich in Excel entweder im Menüband oder in der Symbolleiste einen zusätzlichen Icon zu platzieren. 

Iconaufgabe: (Zell-) Füllfarben (CellFillColorPicker). Die Betonung liegt auf zusätzlich.
Jeweils einen zusätzlichen Icon Füllfarben habe ich sowohl im Menüband als auch einen in der Schnellzugriffsliste schon generiert.
Leider bedienen alle 3 Icons immer den gleichen Farbton. Das heißt, wenn ich bei einem die Füllfarbe auswähle/ändere, haben die anderen beiden auch immer diese Farbe.  
2 reichen mir vollkommen, sofern ich bei dem einen Icon z.B. gelb als Füllfarbe und bei dem anderen Icon z.B. grün einstellen kann.
System: MS-Office Professional Plus 2010 in der 32-Bit-Version.
Hat jemand eine Tipp - geht so etwas überhaupt?
Alternativ könnte ich mir auch einen CommandButton vorstellen, welche nach Click auf diesen, die gerade aktive Zelle mit einer festdefinierten Farbe füllt.
Wie müsste der VBA-Befehl aussehen?

Danke vorab fürs Nachdenken

Ciao der Revanchist

5 Antworten

0 Punkte
Beantwortet von xlking Experte (1.7k Punkte)
Hi Revanchist,

so wie du dir das vorstellst, geht das leider nicht. Zumindest nicht mit dem Standard-Colorpicker. Man könnte nun ein einen eigenen Colorpicker generieren. Direkt im Menüband wird das schwierig, da braucht man Ahnung von RibbonX, die ich (noch) nicht habe. Früher war das einfacher, da hatte man noch Symbolleisten, die man per VBA anpassen konnte.

Aber zurück zum Thema. Ich hätte da drei Ideen:

Die einfachste: Zeichne ein neues Makro mit dem Makrorekorder in die Persönliche Arbeitsmappe auf. Zur Erinnerung: Persönliche Arbeitsmappe bedeutet, dass du das Makro später in verschiedenen Excel-Dateien anwenden kannst. Während der Aufzeichnung füllst du eine beliebige Zelle mit einer Farbe deiner Wahl. Im Code ersetzt du dann das Range-Objekt durch Selection und fertig (Makro stoppen). Wähle nun Menüband anpassen und suche aus der Kategorie Makros dein Makro raus. Über den Button umbenennen kannst du auch ein neues Symbol hinterlegen. Wenn du nun im Menüband auf das Makroicon drückst wird die aktuelle Markierung immer mit derselben Farbe gefüllt die du damals aufgezeichnet hast. Für weitere Farben, erstellst du einfach weitere Icons.

Zweite Idee: Man könnte nur zwei oder drei Icons erstellen, die ein Makro aufrufen, welches beim ersten Aufruf nach einer Farbe verlangt. Anschließend wird diese Farbe solange bei weiteren Klicks für das Füllen verwendet, bis eine neue Farbe definiert wird. Die neue Definition würde nur dann erscheinen, wenn man eine Zelle mit der Farbe füllt, welche dieselbe Farbe bereits besitzt.

Dritte Idee: Erstelle einen eigenen Colorpicker über ein Userform. Einfach ein paar Labels mit entsprechender Hintergrundfarbe füllen. Das Icon im Menüband ruft dann das Makro auf welches wiederum das Userform startet. Im Ereignis Label1_Click wird dann der Code Selection.Interior.Color = Label1.BackColor ausgeführt.

Welche der drei Varianten darfs sein? Versuch dich mal an der ersten und danach an der dritten Variante selbst. Ist eigentlich ganz einfach.

Gruß Mr. K.
0 Punkte
Beantwortet von xlking Experte (1.7k Punkte)

Nochmal Hi,

Zu Variante 2 hab ich mal was gebastelt. Wenn ich dich recht verstehe willst du zwei Symbole die eine von dir zuvor festgelegte Farbe wählen und die Zelle damit einfärben. Da ich mich mit RibbonX noch nicht auskenne, und daher nicht weiß, ob es möglich ist dem Symbol sichtbar eine andere Farbe zu geben, bleibt vorerst nur das Standardsymbol. So siehts jetzt bei mir aus:

Farbsymbole

Wenn man z.B. Farbe1 wählt öffnet sich beim ersten Ausführen nach dem Öffnen von Excel der ColorPicker-Dialog und speichert die gewählte Farbe. Bei jedem weiteren Klick auf das Symbol wird die gespeicherte Farbe direkt in die Zelle gemalt. Man kann jederzeit mit gedrückt gehaltener STRG-Taste auf das Symbol klicken. Dann öffnet sich der Dialog erneut und man kann eine andere Farbe auswählen. Man muss sich halt nur merken dass z.B. Farbe1 grade grün und Farbe 2 grade blau ist.

Für den Code habe ich mich zum Teil beim VBA-Tutorial bedient. Der Code für das Öffnen des ColorPickers stammt von dort. Der Code gehört in ein allgemeines Modul in der persönlichen Arbeitsmappe Personal.xlsb

Private Declare PtrSafe Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Integer 'Wichtig Welche Taste wurde gedrückt

Private Declare PtrSafe Function ChooseColorA Lib "comdlg32" (lpcc As CHOOSECOLOR_TYPE) As Boolean

Private Type CHOOSECOLOR_TYPE 'Quelle: https://www.vba-tutorial.de/apireferenz/dialogboxen.htm
    lStructSize As Long        'Strukturgröße
    hwndOwner As LongPtr
    hInstance As LongPtr
    rgbResult As Long          'Rückgabewert
    lpCustColors As LongPtr    'Zeiger auf benutzerdefinierte Farben
    Flags As eFlags
    lCustData As LongPtr
    lpfnHook As LongPtr
    lpTemplateName As String
End Type

Private Enum eFlags
    CC_ANYCOLOR = &H100            'Anwender kann alle Farben wählen
    CC_ENABLEHOOK = &H10           'Nachrichten abfangen. Für Templates
    CC_ENABLETEMPLATE = &H20       'Dialogbox Template
    CC_ENABLETEMPLATEHANDLE = &H40 'Benutzt Template, ignoriert Templatenamen
    CC_FULLOPEN = &H2              'Öffnen mit Vollauswahl aller Farben
    CC_PREVENTFULLOPEN = &H4       'Deaktiviert den Button zur Vollauswahl
    CC_RGBINIT = &H1               'Vorgabe eines Rückgabewertes in rgbResult
    CC_SHOWHELP = &H8              'Hilfe-Button anzeigen
    CC_SOLIDCOLOR = &H80           'nur Grundfarben (kein Dithering)
End Enum

Dim Farbe1 As Long, Farbe2 As Long

Public Sub Farbe1_Setzen()

Dim Farbe As Long

Keypressed = GetAsyncKeyState(vbKeyControl)

If Keypressed Or Farbe1 = 0 Then
  Farbe = apiChooseColor
  If Farbe >= 0 Then Farbe1 = Farbe
End If

If Farbe >= 0 Then Selection.Interior.Color = Farbe1

End Sub

Public Sub Farbe2_Setzen()

Dim Farbe As Long

Keypressed = GetAsyncKeyState(vbKeyControl)

If Keypressed Or Farbe2 = 0 Then
  Farbe = apiChooseColor
  If Farbe >= 0 Then Farbe2 = Farbe
End If

If Farbe >= 0 Then Selection.Interior.Color = Farbe2

End Sub

Public Function apiChooseColor() As Long
'Quelle: https://www.vba-tutorial.de/apireferenz/dialogboxen.htm
Dim CC As CHOOSECOLOR_TYPE
Static lngFarben(15) As Long       'Static: benutzerdefinierte Farben halten

'Einige benutzerdefinierte Farben
lngFarben(0) = RGB(255, 100, 100)
lngFarben(1) = RGB(100, 255, 100)
lngFarben(2) = RGB(100, 100, 255)

#If Win64 Then
    CC.lStructSize = LenB(CC)
#Else
    CC.lStructSize = Len(CC)
#End If

With CC
    .Flags = CC_RGBINIT Or CC_FULLOPEN
    .rgbResult = RGB(255, 0, 0)     'Standardfarbe die beim Öffnen des ColorPickers aktiv ist.
    .lpCustColors = VarPtr(lngFarben(0))
End With

If ChooseColorA(CC) Then
    apiChooseColor = CC.rgbResult  'gewählte Farbe zurückgeben
Else
    apiChooseColor = -1            'falls 'Abbrechen' gewählt wurde
End If

End Function

Probier aber trotzdem noch die Varianten 1 und 3 aus. Die kriegst du selber hin.

Gruß Mr. K.
0 Punkte
Beantwortet von revanchist Mitglied (210 Punkte)
Hallo Mr. K.
vielen Dank für die große Mühe, welche du dir mit meiner Anfrage gemacht hast.
Das bewegt sich zumindest was den Code und die Methode für das allgemeine Modul in der persönlichen Arbeitsmappe Personal.xlsb angeht, in eine VBA-Welt, die sich mir auch in vielen Jahren nicht erschließen wird - sorry.

Deinen Vorschlag mit der Makroaufzeichnung habe ich versucht. Bekomme aber (nachdem ich den erhaltene Code) auf einen CB gelegt habe nur die Meldung "Fehler beim Kompilieren".
"Unzulässige Verwendung einer Eigenschaft"

vermutlich fehlt nur eine Kleinigkeit um das Ziel zu erreichen, aber wie sage ich Excel, dass es nur die Zelle einfärben soll, welche gerade aktiv ausgewählt ist (Activecell)

mit dieser Prozedur kommt es zur Fehlermeldung:

Private Sub CommandButton118_Click()
Selection
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent5
        .TintAndShade = -0.249977111117893
        .PatternTintAndShade = 0
    End With
    Range("W23").Select
End Sub

noch eine Kleinigkeit: die letzte Anweisung | Range("W23").Select | würde ich gerne dahin ändern, dass der Cursor in Spalte B springt und zwar in der Zeile, wo vorher die Farbmarkierung mittels obigen Befehl erfolgte.

Gruß der Revanchist
0 Punkte
Beantwortet von beverly_ Experte (3.4k Punkte)

Hi,

ungetestet:

Private Sub CommandButton118_Click()
    With ActiveCell.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent5
        .TintAndShade = -0.249977111117893
        .PatternTintAndShade = 0
    End With
    Cells(ActiveCell.Row, 2).Select
End Sub

Bis später, Karin

0 Punkte
Beantwortet von revanchist Mitglied (210 Punkte)
Vielen Danke Karin
und auch auch noch einmal herzlichen Dank Mr. K
für Eure Unterstützung resp. Hilfestellungen

Funktioniert über den Umweg mit dem Commandbutton super !

Ciao der Revanchist
...