DropDown-Liste mit Tabellennamen füllen (Ribbon)
14.01.2015 11:57:58
Erik Kaubitzsch
Liebe Gemeinde,
ich befasse mich derzeit mit Ribbons bzw. den Multifunktionsleisten. Alles ist super chic, ich bin richtig glücklich mich damit gerade zu befassen, weil die Ribbons einige technische Probleme beheben, mit denen ich mich immer wieder konfrontiert sehe.
Ein kleines Problem habe ich nun trotzdem, bei dessen Lösung euch um Hilfe bitte.
Ich habe eine Dropdown-Liste in einem benutzerdefinierten Ribbon. Ziel ist es, diese Dropdown-Liste mit den Namen der Tabellenblätter zu füllen, die einen bestimmten CodeNamen(!) haben und sichtbar sind.
Leider klappt es mit meinem bisherigen Weg nicht, diese Aufgabe zu lösen.
Die Definition in der customUI.xml sieht folgendermaßen aus:
Code in der XML-Datei
[dropDown label="Sachkonten" id="ddnAccounts" onAction="myNavigation" getItemLabel=" _
get_account_label" getItemID="get_account_ID" getItemCount="count_accounts" sizeString=" _
xxxxxxxxxxxxxxxxxxxx" supertip="Sachkonten enthalten die Rechnungseinträge" screentip="Wählen Sie bitte das Sachkonto, das Sie sehen wollen"/]
(Ich musste die spitzen Klammern durch eckige ersetzen, da der XML-Code nicht in der Vorschau angezeigt wurde)Insgesamt referenziere ich auf vier Prozeduren:
Code im VBA-Projekt/Modul "RibbonCallbacks"
Option Explicit
Private arrAcounts() as string
Public objRibbon As IRibbonUI
Public Sub onLoad_Test(ribbon As IRibbonUI)
Set objRibbon = ribbon
End Sub
'Callback for ddnAccounts onAction
Sub myNavigation(control As IRibbonControl, id As String, index As Integer)
'Die Bedeutung dieser Prozedur ist mir bekannt.
Debug.Print "id: " & id
Debug.Print "index: " & index
End Sub
'Callback for ddnAccounts getItemCount
Sub count_accounts(control As IRibbonControl, ByRef returnedVal)
Dim thisWorksheet As Worksheet
Dim n As Long
n = 0
'Alle Tabellen zählen, die die Bedingungen erfüllen
For Each thisWorksheet In ThisWorkbook.Worksheets
If InStr(1, thisWorksheet.CodeName, "Account") > 0 And thisWorksheet.Visible = _
xlSheetVisible Then
n = n + 1
End If
Next thisWorksheet
'Dann die Tabellennamen in ein Array schreiben, das modulweit verfügbar ist.
ReDim arrAccounts(n - 1)
For Each thisWorksheet In ThisWorkbook.Worksheets
If InStr(1, thisWorksheet.CodeName, "Account") > 0 And thisWorksheet.Visible = _
xlSheetVisible Then
arrAccounts(n) = thisWorksheet.Name
n = n + 1
End If
Next thisWorksheet
'Anzahl der Tabellenblätter zurückgeben
returnedVal = n
End Sub
'Callback for ddnAccounts getItemLabel
Sub get_account_label(control As IRibbonControl, index As Integer, ByRef returnedVal)
'Anhand des Parameters "index" das Array mit den Tabellennamen auslesen
returnedVal = arrAccounts(index)
End Sub
'Callback for ddnAccounts onChange
Public Sub OnChangeCombobox(control As IRibbonControl, text As String)
'Wählt das Tabellenblatt aus
ThisWorkbook.Worksheets(text).Activate
End Sub
Leider funktioniert das Befüllen nicht und ich habe mit mehreren debug.print auch schon geschaut, ob die Prozeduren überhaupt ausgelöst werden. Bisher ohne Erfolg. Da ich wirklich neu in diesem Thema bin, freue ich mich über eine kurze Erläuterung zur Lösung oder zur herangehensweise.
Ich danke euch für eine hilfreiche Rückmeldung.
Gruß
Erik