Tipp 0359 Symbolleiste - eigene Grafiken integrieren -2-
Autor/Einsender:
Datum:
  Angie
29.01.2006 (Update)
Entwicklungsumgebung:   Excel 2000
Möchte man einer Symbolleisten-Schaltfläche (CommandBarButton) zur Laufzeit eine eigene Grafik zuweisen, so kann man wie in Tipp Symbolleiste - eigene Grafiken integrieren - 1 - gezeigt, verfahren. Allerdings hat der Tipp den Nachteil, dass eine Grafik-Datei "mitgeliefert" werden muss.
In Excel bietet es sich direkt an, die Grafiken für die Schaltflächen bereits zur Entwurfszeit als Shape auf einem Tabellenblatt zu platzieren. Damit der Anwender das Tabellenblatt nicht so ohne Weiteres einsehen und/oder verändern kann, wird anschließend die Visible-Eigenschaft des Tabellenblatts im VB-Editor manuell auf xlSheetVeryHidden gesetzt.
Nachdem die von Excel standardmäßig vergebenen Namen für Shapes nicht sehr aussagekräftig sind, wurden den Shapes aber vor dem Ausblenden des Tabellenblatts zunächst per VBA ein sinnvoller Name gegeben. Dazu wird einfach nacheinander das entsprechende Shape ausgewählt und z. B. mit dem Aufruf
 
      Selection.Name = "picSmily"
 
der neue Name vergeben.
Aber auch in diesem Beispiel lässt es sich nicht vermeiden, dass die Grafik zunächst in die Zwischenablage kopiert und dann mit PasteFace-Methode auf die entsprechende Schaltfläche eingefügt werden muss.
Anmerkung: Im Download befindet sich als Beispiel eine *.xls-Datei, obige Vorgehensweise kann aber auch in einem AddIn (*.xla) angewandt werden, wobei dann die Visible-Eigenschaft des Tabellenblatts nicht verändert werden muss, da die Tabellenblätter in einem AddIn für den Anwender eh nicht sichtbar sind.
Code im Codebereich von DieseArbeitsmappe
 
Option Explicit

Private Const mc_CBAR_NAME      As String = "VB-fun-Symbolleiste_2"
Private Const mc_ICON_SHEETNAME As String = "CBarPictures"

Private Sub Workbook_Open()
  Call CreateCommandBar
  ThisWorkbook.Saved = True
End Sub

Private Sub CreateCommandBar()
  Dim objCBar     As Office.CommandBar
  Dim objCBBtn    As Office.CommandBarButton

  Dim i           As Integer
  Dim objWks      As Worksheet

  Call DeleteCommandBar

  On Error GoTo err_CreateCommandBar
  Set objCBar = Application.CommandBars.Add( _
        Name:=mc_CBAR_NAME, Temporary:=True)

  With objCBar
   .Visible = True
   .Position = msoBarTop
   .Protection = msoBarNoCustomize
  End With

  For i = 1 To 3
    objCBar.Controls.Add Type:=msoControlButton
    With objCBar.Controls(i)
      .Style = msoButtonIcon
      .Tag = gc_CBARBTN_TAG & CStr(i)
      .OnAction = "MyOnActionMacro"
    End With
  Next

  Set objWks = ThisWorkbook.Worksheets(mc_ICON_SHEETNAME)

  objWks.Shapes("picSmilyHappy").CopyPicture
  objCBar.Controls(1).PasteFace

  objWks.Shapes("picSmilyWink").CopyPicture
  objCBar.Controls(2).PasteFace

  objWks.Shapes("picThumbUp").CopyPicture
  With objCBar.Controls(3)
    .Style = msoButtonIconAndCaption
    .Caption = "Geschafft !"
    .PasteFace
    .BeginGroup = True
  End With

exit_Sub:
  On Error Resume Next
  Set objWks = Nothing
  Set objCBBtn = Nothing
  Set objCBar = Nothing

  On Error GoTo 0
  Exit Sub

err_CreateCommandBar:
  MsgBox "Es ist ein Fehler bei der Erstellung der neuen" & _
        vbCrLf & "Symbolleiste aufgetreten !", vbExclamation, _
        Title:="Fehler beim Erstellen der Symbolleiste"
  Call DeleteCommandBar
  Resume exit_Sub
End Sub

Private Sub DeleteCommandBar()
  On Error Resume Next
  Application.CommandBars(mc_CBAR_NAME).Delete
  On Error GoTo 0
End Sub
 
Soll die Symbolleiste nur dann sichtbar sein, wenn die Arbeitsmappe aktiviert ist, mit der die Symbolleiste erstellt wurde, ist weiterer Code im Codebereich von DieseArbeitsmappe notwendig. Mit den Ereignissen Workbook_WindowActivate und Workbook_WindowDeActivate wird das Ein- und Ausblenden der Symbolleiste "gesteuert".
 
Private Sub Workbook_WindowActivate(ByVal Wn As Excel.Window)
  Call EnableCommandBar(True)
End Sub

Private Sub Workbook_WindowDeactivate(ByVal Wn As Excel.Window)
  Call EnableCommandBar(False)
End Sub

Private Sub EnableCommandBar(ByVal Enabled As Boolean)
  On Error Resume Next
  Application.CommandBars(mc_CBAR_NAME).Enabled = Enabled
  On Error GoTo 0
End Sub
 
Code im Codebereich eines Moduls
Beim Hinzufügen der Schaltfläche zur Symbolleiste wird die OnAction-Eigenschaft zugewiesen, also der Name des Makros, das ausgeführt wird, wenn der Benutzer auf das Symbolleisten-Steuerelement klickt. In diesem Beispiel wird im OnAction-Makro für die jeweilige Schaltfläche lediglich eine MsgBox angezeigt.
 
Option Explicit
Public Const gc_CBARBTN_TAG As String = "MyButton"

Public Sub MyOnActionMacro()
  If Not Application.CommandBars.ActionControl Is Nothing Then
    Select Case Application.CommandBars.ActionControl.Tag
      Case gc_CBARBTN_TAG & "1"
        MsgBox "Du hast die 1. neue Schaltfläche geklickt!", _
                vbOKOnly + vbInformation, Title:="VB-fun-Demo"

      Case gc_CBARBTN_TAG & "2"
        MsgBox "Du hast die 2. neue Schaltfläche geklickt!", _
                vbOKOnly + vbInformation, Title:="VB-fun-Demo"

      Case gc_CBARBTN_TAG & "3"
        MsgBox "Du hast die 3. neue Schaltfläche geklickt!", _
                vbOKOnly + vbInformation, Title:="VB-fun-Demo"

      Case Else
    End Select
  End If
End Sub
 
Weitere Links zum Thema
Symbolleiste - eigene Grafiken integrieren -1-

Windows-Version
95
98/SE
ME
NT
2000
XP
Vista
Win 7
Excel-Version
95
97
2000
2002 (XP)
2003
2007
2010


Download  (18,3 kB) Downloads bisher: [ 1269 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Sonntag, 31. Juli 2011