1

いくつかの VB.net コードとカスタム Microsoft Word VBA マクロがあります。マクロからそのオブジェクトに対して関数を実行できるように、VB.net インスタンスをマクロに渡そうとしています。オブジェクトを VB.net コードからマクロに渡すことができないようです。

警告、私は VB と Word のマルコスが初めてです。助けてくれてありがとう!

docという単語を作成してVB.netコードに渡すために使用するC#.netコード

 private void BtnStartWord_Click(object sender, EventArgs e)
    {

        Microsoft.Office.Interop.Word.Application wdApp = new Microsoft.Office.Interop.Word.Application();
        wdApp.Documents.Add(@"C:\template.dotm");
        wdApp.Visible = true;

        VBWord.Word wordVB = new VBWord.Word();

        wordVB.Connect(Handle.ToInt32(), wdApp);
    }

VB.net コード

Public Class Word
    Public Sub Connect(ByVal plWinHandle As Long, _
                       ByVal pobjDocHandle As Object)

        RunMacro(pobjDocHandle, New Object() {"Connect", plWinHandle, Me})
    End Sub
    Private Sub RunMacro(ByVal oApp As Object, ByVal oRunArgs() As Object)
        oApp.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default Or System.Reflection.BindingFlags.InvokeMethod, Nothing, oApp, oRunArgs)
    End Sub
End Class

そして、私の Word テンプレートの中に、いくつかのコードがあります。コードは TemplateProjects -> Microsoft Word Objects -> ThisDocument 内にあり、次のようになります。

Option Explicit

Public Sub Connect(ByVal plWindow As Long, ByRef pobjControl As Object)
    Set goApp.App = Word.Application
    goApp.WindowHandle = plWindow
    goApp.ControlHandle = pobjControl
End Sub

上記の goApp を Modules -> Globals で定義

Option Explicit
Public goApp As New WordApp

現在、VB コードは上記の oApp.GetType().InvokeMember 行でエラーをスローしています。Me が渡されるという引数が気に入らないと思います。しかし、私はそれ自体を渡す方法がわかりません。

スローされるエラーは

Message = "Exception has been thrown by the target of an invocation."
InnerException = {"Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))"}

そして、私が最終的にできるようにしたいのは、VB コードの関数をコールバックする Word のマクロです。次のようなもの。

Sub ApproveButton(ByVal control As IRibbonControl)
    '-----------------------------------------------------------------------------
    ' Description: This procedure sends the Approve action request back to the VB code
    '-----------------------------------------------------------------------------
    goApp.SendAction "Approve"
End Sub
4

1 に答える 1

0

例外を知らなければ、診断は困難です。VBA から .NET コードを呼び出すには、次の標準的な方法のいずれかをお勧めします。

  1. COM 可視の .NET DLL を作成し、VBA で参照を追加してから、VBA から「Word」クラスをインスタンス化します。この質問このブログ投稿を参照してください。
  2. VSTOを使用します。
于 2013-10-17T17:52:11.520 に答える