2013-07-15 17 views
5

PowerPointアドインを開発中で、アドインアプリケーションが)の間、リボンコントロールの一部を一時的に無効にしたいとします。実行時にPowerPointリボンをカスタマイズする

私はそれがSlideMaster、SlideSorterのようないくつかの一般的に使用されるコントロールを無効にしますので、私は

など、アドインがを 有効になっているが、これは本当に十分でないときに期待通りに機能するソリューションを開発しましたここではパワーポイント2010

を使用していますことは、よく形成されているサンプルXMLである:ここで

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> 
    <ribbon startFromScratch="false"> 
     <tabs> 
      <tab idMso="TabView"> 
       <group idMso="GroupMasterViews" getVisible="GetVisible"/> 
      </tab> 
     </tabs> 
    </ribbon> 
</customUI> 

this SO answerから取られ、サンプルのコールバックです:

Sub GetVisible(control As IRibbonControl, ByRef returnedVal As Boolean) 
    If TrapFlag Then 
     returnedVal = False ' control is hidden 
    Else: 
     returnedVal = True ' control is not hidden 
    End If 
End Sub 

私はViewリボンに移動すると、アラートがあることを私に知らせる:マクロが見つからないため、またはセキュリティ設定を無効にされている

これはおそらくGetVisibleマクロを参照していますか?私のマクロ設定は次のとおりです。

  • は私がこれまでに発見したものと苦労したが、これまでできなかったVBAプロジェクトオブジェクトモデルへの信頼アクセス

すべてのマクロ(推奨されません)

  • を有効にします提案を実施する。ほとんどの回答はExcel固有のものです。 PowerPointに特有のものは実際には見つかりませんでしたが、VBAの他の多くの機能でこれを行っているので、あるアプリケーションから別のアプリケーションにコードを移植するのは非常に難しいことではないと考えていました。

    私もthis方法を試してみましたが、SetCustomUIは、おそらくそれがユニークまたはVisual Studioにのみ適用され、ApplicationまたはPresentationレベルでPowerPointで利用できないのですか?

  • 答えて

    3

    かなりの試行を経て&エラーが発生しましたが、私は機能的な解決策があると思いますが、私が以下で説明することについては不明な点がいくつかあります。

    パブリックTrapFlag変数を制御するサブルーチンを使用してPPTMファイルでこれをテストしました。この変数は、特定のコントロールを非表示にするか無効にするかを決定します。私はまた、アプリケーションが起動したときにこのフラグが設定されているPPAMでこれをテストしました。ではなく、アドインがロードされたときにがロードされます。

    これにより、実行時にRibbonUIを操作することができます。ここで

    は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> 
         </tabs> 
        </ribbon> 
    

    は私の要件に応じて変更さCustomUI Editorアプリケーションから生成され、VBAのコールバックです。

    Option Explicit 
    Public TrapFlag As Boolean 
    Public Rib As IRibbonUI 
    Public xmlID As String 
    
    Public Sub SetFlag() 
    Dim mbResult As Integer 
        mbResult = MsgBox("Do you want to disable some controls on the Ribbon?", vbYesNo) 
        If mbResult = vbYes Then 
         TrapFlag = True 
        Else: 
         TrapFlag = False 
        End If 
    End Sub 
    
    'Callback for customUI.onLoad 
    Sub RibbonOnLoad(ribbon As IRibbonUI) 
        'MsgBox "onLoad" 
        Set Rib = ribbon 
    End Sub 
    
    'I use this Callback for disabling some Controls: 
    ' ViewSlideSorterView 
    ' ViewNotesPageView 
    ' ViewSlideShowReadingView 
    ' ViewSlideMasterView 
    ' ViewHandoutMasterView 
    ' ViewNotesMasterView 
    ' WindowNew 
    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 
    
    'I use this Callback for disabling/hiding some tab groups: 
    ' GroupMasterViews 
    ' GroupPresentationViews 
    Sub VisibleGroup(control As IRibbonControl, ByRef returnedVal) 
        returnedVal = Not TrapFlag 'TrapFlag = True indicates the Application is running. 
        'MsgBox "GetVisible for " & control.Id 
        'Debug.Print control.Id & " enabled = " & CStr(returnedVal) 
        Call RefreshRibbon(control.Id) 
    End Sub 
    
    Sub RefreshRibbon(Id As String) 
        xmlID = Id 
        'MsgBox "Refreshing ribbon for " & Id, vbInformation 
        If Rib Is Nothing Then 
         MsgBox "Error, Save/Restart your Presentation" 
        Else 
         Rib.Invalidate 
        End If 
    End Sub 
    

    いくつかの不確実性が

    • 私はまだいくつかのロンdeBruinのコードは、(hereを)何をするか全くわからない、またはそれが必要であるかどうか。私はいくつかのテストを行いましたが、この場合はpublic変数xmlIDが必要であることは確かではありません。彼は何とか私が理解できないものを使用します。
    • はまた、私はXMLでcommandに使用 としてタブgroupに同じコールバックを使用することはできませんよ、私は コマンドのタグgetEnabledを使用しますが、私はグループのためにgetVisibleを使用する必要があります。これらの は、コールバック関数EnableControlVisibleGroupにそれぞれ関連付けられています。いずれにしても、VisibleGroupは と思われるので、機能的には同じです。
    • getEnabledタグは、無効にしたコマンドへのホットキーやプログラムによるアクセスを防止するとも考えています。
    関連する問題