2016-03-31 12 views
6

Ich verwende den folgenden XML-Code, um eine benutzerdefinierte Multifunktionsleiste für ein Excel-Add-In zu erstellen.Ändert die Beschriftung der Multifunktionsleiste dynamisch Excel

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> 
    <ribbon startFromScratch="false"> 
     <tabs> 
      <tab id="ComdinheiroTab" label="COMDINHEIRO"> 
       <group id="ComdinheiroButtons" label="Comdinheiro"> 

        <button id="Login" getLabel="getLabelLogin" image="Login" size="large" onAction="OnActionLogin"/> 

       </group> 
      </tab> 
     </tabs> 
    </ribbon> 
</customUI> 

Ich bin mit dem folgenden VBA-Code eine Bezeichnung für die Schaltfläche Login einzustellen:

Sub getLabelLogin(control As IRibbonControl, ByRef returnedVal) 
if loggedIn = true then 
    returnedVal = "Logged" 
else 
    returnedVal = "Disconected" 
end if 
End Sub 

Der Name des Labels erfolgreich ändert sich entsprechend der variablen LoggedIn Wert, wenn das Band geladen wird. Ich wünschte jedoch, ich könnte die Werte des Etiketts während der Ausführung meines Programms ändern. Ist es möglich, getLabel-Ereignis mit einem VB-Code aufzurufen? Gibt es sowieso eine Aktualisierung meines Ribbons, damit dieses Event erneut aufgerufen wird?

Antwort

9

Ja, es ist möglich, "get" Rückrufe später auszuführen. Um dies zu tun, müssen Sie eine Variable auf Modul- oder globaler Ebene erstellen, die das Objekt "Multifunktionsleisten-UI" enthält. Dieses Objekt verfügt über zwei nützliche Methoden: Invalidate und InvalidateControl. Der erste löst alle die "Get" -Rückrufe in der Ribbon-XML. Die zweite löst die Rückrufe nur für das angegebene Steuerelement aus.

Ihr Farbband muss diesem Objekt zugewiesen werden, wenn das Farbband geladen wird. Damit dies geschieht, benötigen Sie das Attribut onLoad im customUI-Tag Ihres Ribbon-XML und dessen Callback in Ihrem VBA.

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="ribbonLoaded"> 
    <ribbon startFromScratch="false"> 
     <tabs> 
      <tab id="ComdinheiroTab" label="COMDINHEIRO"> 
       <group id="ComdinheiroButtons" label="Comdinheiro"> 

        <button id="Login" getLabel="getLabelLogin" image="Login" size="large" onAction="OnActionLogin"/> 

       </group> 
      </tab> 
     </tabs> 
    </ribbon> 
</customUI> 

Die VBA:

Dim ribbonUI as IRibbonUI 

Sub ribbonLoaded(ribbon as IRibbonUI) 
    Set ribbonUI = ribbon 
End Sub 

Sub UpdateTheLabel 
    ribbonUI.InvalidateControl("Login") 
End Sub 

Sub getLabelLogin(control As IRibbonControl, ByRef returnedVal) 
if loggedIn = true then 
    returnedVal = "Logged" 
else 
    returnedVal = "Disconected" 
end if 
End Sub 

Es spielt keine Rolle, welches Verfahren InvalidateControl solange die Prozedur Zugriff auf das Objekt ribbonUI hat aufruft. Weitere Informationen hierzu finden Sie im MSDN-Artikel https://msdn.microsoft.com/en-us/library/aa338202(v=office.12)#OfficeCustomizingRibbonUIforDevelopers_Dynamically