2016-03-31 21 views
6

Sto utilizzando il seguente pezzo di codice XML per creare un nastro personalizzato per un componente aggiuntivo di Excel.Modifica dinamicamente l'etichetta del pulsante del nastro 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> 

Sto usando il seguente codice VBA per impostare un'etichetta per il pulsante di accesso:

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

nome dell'etichetta cambia con successo in base al valore della variabile del loggedin quando il nastro viene caricato. Tuttavia, vorrei poter cambiare i valori dell'etichetta durante l'esecuzione del mio programma. È possibile chiamare l'evento getLabel usando un codice VB? C'è comunque la possibilità di aggiornare il mio nastro in modo che questo evento venga chiamato di nuovo?

risposta

9

Sì, è possibile eseguire i callback "get" in seguito. Per fare ciò, è necessario creare una variabile a livello di modulo o globale per contenere l'oggetto "barra multifunzione". Questo oggetto ha due metodi utili: Invalidate e InvalidateControl. I primi attivano tutti i callback "get" nel Ribbon XML. Il secondo attiva i callback solo per il controllo specificato.

Il nastro ui deve essere assegnato a questo oggetto quando il nastro viene caricato. Affinché questo accada, è necessario l'attributo nel tag customUI del tuo Ribbon XML e la sua callback nel tuo 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> 

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 

Non importa quale procedura chiama InvalidateControl fino a quando la procedura ha accesso all'oggetto ribbonUI.

Ulteriori informazioni sono disponibili nell'articolo MSDN https://msdn.microsoft.com/en-us/library/aa338202(v=office.12)#OfficeCustomizingRibbonUIforDevelopers_Dynamically

Problemi correlati