2016-04-08 41 views
0

私は2日間試してみましたが、何も動作していないようです...VBAのカスタムアドインリボンチェックボックスにアクセスする方法は?

VSTOでVisio用のカスタムリボンアドインをインストールし、ボタンが正常に動作するように作成しました。私は最近、VBAプロジェクト内から読みたい状態のリボンにいくつかのチェックボックスを追加しました。

私はVBAのチェックボックス状態にアクセスする方法を理解できません。私はCommandBarsとToolBarsでたくさんのことを試しましたが、どこにも行きませんでした。そして、VBAではAdd-Inのメソッドを可視にするためのこのウォークスルーを見つけました:https://msdn.microsoft.com/en-us/library/bb608614

VBAコードはアドインを認識します私はアドインオブジェクトを割り当てますが、オブジェクトの関数(チェックボックスの1つの状態を参照するgetIOPressedState)を呼び出そうとすると、「オブジェクトはこのプロパティまたはメソッドをサポートしません」というメッセージが表示されます。

ここに何か不足していますか?

は、これは私が見えるようにしたい私のリボンクラスである

<ComVisible(True)> _ 
Public Interface IAddInUtilities 
    Function getIOPressed() As Boolean 
    Function getDDPressed() As Boolean 
    Sub doNothing() 
End Interface 

<Runtime.InteropServices.ComVisible(True)> _ 
<ClassInterface(ClassInterfaceType.None)> _ 
Public Class StructuredAnalysisRibbon 
Implements Office.IRibbonExtensibility, IAddInUtilities 
    Public ioPressedState As Boolean = False 
    Public ddPressedState As Boolean = False 
    Public ribbon As Office.IRibbonUI 

    Public Function GetCustomUI(ByVal ribbonID As String) As String Implements Office.IRibbonExtensibility.GetCustomUI 
     Return getResourceText("SAVisioAddIn.StructuredAnalysisRibbon.xml") 
    End Function 

    Public Function getIOPressed() As Boolean Implements IAddInUtilities.getIOPressed 
     Return ioPressedState 
    End Function 

    Public Function getDDPressed() As Boolean Implements IAddInUtilities.getDDPressed 
     Return ddPressedState 
    End Function 

    Public Sub doNothing() Implements IAddInUtilities.doNothing 
     'do nothing-added this to see if function As boolean in interface was causing issues 
    End Sub 

ThisAddIn.vb

Public SARibbon As StructuredAnalysisRibbon 
Protected Overrides Function CreateRibbonExtensibilityObject() As Microsoft.Office.Core.IRibbonExtensibility 
    Return SARibbon 
End Function 

Protected Overrides Function RequestComAddInAutomationService() As Object 
    If SARibbon Is Nothing Then 
     SARibbon = New StructuredAnalysisRibbon 
    End If 
    Return SARibbon 
End Function 

VisioのVBAコード

Public Sub bloop() 
    Dim addIn As COMAddIn 
    Dim addInObject As Object 
    Dim ioPressed As Boolean 
    ioPressed = False 
    Set addIn = Application.COMAddIns.Item("SAVisioAddIn") 
    Set addInObject = addIn.Object 

    ioPressed = addInObject.getIOPressed 'fails here bc method not recognized for object 
    'Also tried addIn.Object.doNothing and still didn't work 
    If ioPressed = True Then 
     MsgBox "checked" 
    Else 
     MsgBox "not checked" 
    End If 
End Sub 
+0

このRibbon.XMLやリボンデザイナーですか?これを行う方法は100%明確ではありませんが、リボンを制御するコードは完全にAddin(Ribbon1.vbがデフォルトクラスになる)でなければならず、COMインターフェイスはそれを介して動作する必要があると確信していますリボン自体を制御しようとはしません。 –

答えて

2

私は問題がチェックボックスとは関係がないと思っていますが、ポイントはVBAでデフォルトのオブジェクトインターフェイス(コードではIAddInUtilitiesではありません)を返します。インターフェイスを交換するだけです。 IAddInUtilitiesはデフォルト(最初)である必要があります。それとも:)とにかく、一番簡単なのかもしれ有害とみなされるClassInterface(ClassInterfaceType.None)のような派手なCOMのものと一緒に、まったくIAddInUtilitiesを削除します。

Implements IAddInUtilities, Office.IRibbonExtensibility 
+0

それは簡単だとは信じられません...ありがとう!!あなたが気にしないなら、別の質問。関数呼び出しは機能しますが、常にfalseと読みます。私はチェックボックスのOnActionコールバックを押した状態を設定していますが、それは変更されていないようです... – Samer

+1

onActionは基本的にボタンのためのもので、あなたはgetPressedを持っています。あなたはここで例を見てみることができます:http://www.excelguru.ca/blog/2006/11/29/modifying-the-ribbon-part-6/ – Nikolay

関連する問題