2016-03-31 11 views
6

Korzystam z poniższego fragmentu kodu XML, aby utworzyć niestandardową wstążkę dla dodatku Excel.Dynamicznie zmienia etykietę przycisku wstążki 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> 

Używam następujący kod VBA, aby ustawić etykietę przycisku logowania:

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

nazwa etykieta zmienia powodzeniem według wartości zmiennej loggedin, gdy taśma jest załadowany. Jednak chciałbym zmienić wartości etykiety podczas wykonywania mojego programu. Czy można wywołać zdarzenie getLabel za pomocą kodu VB? Czy mimo to odświeżam wstążkę, aby to wydarzenie zostało ponownie wywołane?

Odpowiedz

9

Tak, później można uruchomić wywołania zwrotne "get". Aby to zrobić, musisz utworzyć zmienną na poziomie modułu lub globu, aby zatrzymać obiekt "wstążki interfejsu użytkownika". Ten obiekt ma dwie przydatne metody: Invalidate i InvalidateControl. Pierwszy wyzwala wywołania zwrotne "get" w pliku XML wstążki. Drugi wyzwala wywołania zwrotne tylko dla określonej kontroli.

Ta wstążka ui musi zostać przypisana do tego obiektu podczas ładowania wstążki. Aby tak się stało, potrzebujesz atrybutu onLoad w tagu customUI Twojego Ribbon XML i jego wywołania zwrotnego w 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 

To nie ma znaczenia, co procedura nazywa InvalidateControl dopóki procedura ma dostęp do obiektu ribbonUI.

Więcej informacji na ten temat można znaleźć w artykule MSDN https://msdn.microsoft.com/en-us/library/aa338202(v=office.12)#OfficeCustomizingRibbonUIforDevelopers_Dynamically

Powiązane problemy