2013-08-04 108 views
4

我有一個自定義的Excel功能區和一個包含一個在打開工作簿時實例化的類的Excel附加組件。根據班級的某些屬性,我需要隱藏自定義功能區中的某些按鈕(全部在同一個標​​籤中)。隱藏個別自定義功能區按鈕

我的自定義功能區是:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="loadCustom"> 
<ribbon> 
<tabs> 
<tab id="tab1" label="customTab" getVisible="GetVisible" tag="myTab"> 
<group id="grp1" label="Group1" imageMso="ViewFullScreenView" getVisible="GetVisible"> 
    <button id="Bt1" size="large" label="Button1" imageMso="AccessListIssues" onAction="runBt1" visible="true"/> 
    <button id="Bt2" size="large" label="Button2" imageMso="AccessListTasks" onAction="runBt2" visible="true"/> 
    <button id="Bt3" size="large" label="Button3" imageMso="ControlLayoutStacked" onAction="runBt3" visible="true"/> 
    <button id="Bt4" size="large" label="Button4" imageMso="ControlLayoutTabular" onAction="runBt4" visible="true"/> 

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

然後我有一個模塊在下面的VBA宏加載自定義功能區和/或禁用:

Public Sub loadCustom(ribbon As IRibbonUI) 

    Set RibUI = ribbon 

    If workbookTitle = "myWorkbook" Then 
     MyTag = "show" 
    Else 
     MyTag = False 
     RefreshRibbon MyTag 
    End If 

End Sub 

Sub GetVisible(control As IRibbonControl, ByRef visible) 

    If MyTag = "show" Then 
     visible = True 
    Else 
     If control.Tag Like MyTag Then 
      visible = True 
     Else 
      visible = False 
     End If 
    End If 
End Sub 

Sub RefreshRibbon(Tag As String) 
    MyTag = Tag 
    If RibUI Is Nothing Then 
     MsgBox "Error, Save/Restart your workbook" 
    Else 
     RibUI.Invalidate 
    End If 
End Sub 

在我具體的工作簿中功能區應加載爲我有一個隱藏的表,從我的類模塊類讀取每個按鈕的值,以確定它是否應該顯示或不。一旦我閱讀了這個值,我該如何隱藏一個單獨的按鈕?我發現的所有例子似乎只能用於製表符。我可以將ribbonUI傳遞給類並通過每個控件循環嗎?我一直無法找到這樣做的方法。謝謝你的幫助!

回答

5

您需要在運行時自定義功能區。

檢查我的問題(和答案)here儘管我的問題是在PPT VBA中,我在Excel中做了我的測試,解決方案與您的問題應該非常相似。

而不是指定一個布爾truefalse每個按鈕的visible財產,你需要另一個回調,這樣,當裝入此選項卡中,過程檢查您的類對象是否已經被實例化,然後設置truefalse作爲必要。

舉例來說,在我的XML我的PPT部分是這樣的:

... 
<tab idMso="TabView"> 
       <group idMso="GroupMasterViews" getVisible="VisibleGroup"/> 
       <group idMso="GroupPresentationViews" getVisible="VisibleGroup"/> 
      </tab> 
      ... 

因此,而不是使用組的Visible財產,我使用自定義屬性getVisible它調用宏VisibleGroup。有一些細微差別,我跑中一樣,我不能使用相同的回調/微距不同類型的控件,因此爲什麼我有兩個回調(EnabledControlVisibleGroup)兩者做同樣的事情 。我不知道爲什麼,不幸的是,這部分開發似乎沒有很好的記錄。

查看我的代碼,查看我在測試時放置斷點的所有位置。我必須做相當多的調試才能使其工作。每隔程序在中放置斷點並逐步執行代碼。這是一個痛苦的屁股,但如果你已經得到這麼多,我相信你將能夠使它的工作。

UPDATE

我做我的PPT外接一個簡短的測試。在功能上,這是相似的,所以比我嘗試重新創建Excel中的所有內容更容易測試。

我的加載項有它自己的菜單組和一些自定義按鈕。相關的按鈕行是這樣的:

<button id="HelpButton" label="Help" getVisible="EnableControl" onAction="HelpFile" /> 

完整的XML,供大家參考:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <customUI onLoad="RibbonOnLoad" xmlns="http://schemas.microsoft.com/office/2009/07/customui"> 
     <commands> 
      <command idMso="ViewSlideSorterView" getEnabled="EnableControl"/> 
      <command idMso="ViewNotesPageView" getEnabled="EnableControl"/> 
      <command idMso="ViewSlideShowReadingView" getEnabled="EnableControl"/> 
      <command idMso="ViewSlideMasterView" getEnabled="EnableControl"/> 
      <command idMso="ViewHandoutMasterView" getEnabled="EnableControl"/> 
      <command idMso="ViewNotesMasterView" getEnabled="EnableControl"/> 
      <command idMso="WindowNew" getEnabled="EnableControl"/> 
     </commands> 
     <ribbon startFromScratch="false"> 
      <tabs> 
       <tab idMso="TabView"> 
        <group idMso="GroupMasterViews" getVisible="VisibleGroup"/> 
        <group idMso="GroupPresentationViews" getVisible="VisibleGroup"/> 
       </tab> 
       <tab id="TabTiger" label="Chart Builder" insertAfterMso="TabDeveloper"> 
        <group id="GroupTigerMain" label="XXXX Chart Builder"> 
         <menu id="TigerMenu" image="XXXXLogo" size="large"> 
          <button id="LaunchButton" label="Launch Chart Builder" onAction="ShowChart_Form" /> 
          <button id="InfoButton" label="Info" onAction="Credit_Inf" /> 
          <button id="VersionButton" label="Version" onAction="VersionNum" /> 
          <button id="HelpButton" label="Help" getVisible="EnableControl" onAction="HelpFile" /> 
         </menu> 
        </group> 
       </tab> 
      </tabs> 
     </ribbon> 
    </customUI> 

EnableControl程序看起來像這樣(我故意取消對MsgBox,這樣我可以打破&輸入代碼,你可能想這樣做只是爲了調試並確保正確的布爾值被傳遞給控件):

Sub EnableControl(control As IRibbonControl, ByRef returnedVal) 
    returnedVal = Not TrapFlag 'TrapFlag = True indicates the Application is running. 
    MsgBox ("GetEnabled for " & control.Id) 
    'Debug.Print control.Id & " enabled = " & CStr(returnedVal) 
    Call RefreshRibbon(control.Id) 
End Sub 

您需要修改分配returnedVal以符合您的目的的邏輯。但基本上這個宏應該在每次時觸發這個按鈕即將被顯示,所以在我的情況下,每當我打開包含它的菜單時它就會觸發。

只要returnedVal的值爲False之前的Call RefreshRibbon(control.Id)那麼該過程就起作用,並且該按鈕在我的菜單欄中不再可見。

+1

,我打算給getVisible回調添加到我的XML,像這樣: <按鈕ID =「BT1」 getVisible =「ButtonVisible」 但我的色帶停止顯示,如果是畸形XML的。你不能在button標籤中使用這個屬性嗎? – db579

+0

@ db579是否還在工作簿的VBProject中添加了「getVisible」子例程? (有點愚蠢的問題,但只是想確保你沒有忽視明顯的)另外,我注意到你在Group控件上使用了相同的'getVisible'自定義屬性。在我的應用程序中,**我不能在不同類型的控件上使用相同的回調/宏** - 如果您在組控件(「group1」)上使用'getVisible',請嘗試使用不同的回調(即使它是重複的代碼)在按鈕上。讓我知道,我可以嘗試在今晚晚些時候用一個按鈕進行測試。 –

+1

是的,我沒有添加相應的宏到項目中,我從組中刪除了回調,所以不應該有任何衝突。我確實使用了獲取可見回調的選項卡,但是我給這個宏指定了一些不同的東西(我認爲getVisible =''位必須被調用才能工作? – db579

0

在Excel中我注意到,當如果(不開最小化窗口)工作簿可見您在WB嵌入絲帶纔會出現。 我玩過各種可見和不可見的選項,但是如果包含它的工作簿的窗口最小化,我無法讓功能區保持不變。 解決方法是使用包含功能區的.xlam Addin。然後功能區在這裏,無論您在Excel中打開的工作簿的狀態如何。

+0

這是設計完成的:CustomUI功能區對於包含Ribbon XML標記的文件是本地的;這樣,您的自定義功能區僅適用於特定文件。如您所見,如果將RibbonUI保存在XLAM文件中,它將對所有打開的工作簿都可見(或者,您可以添加條件邏輯以僅在符合用戶定義的標準的工作簿中顯示它)等。 –

相關問題