插入VB宏会抛出Argument而不是可选错误

Tro*_*ant 0 c# vba ms-word com-interop

我试图从C#应用程序打开一个Word文档,插入一个宏,运行它,然后关闭.我遇到的问题是

编译错误:参数不是可选的

我一直在看这篇文章,但我没有回复任何东西.没看到我在这里缺少什么.

这是调试器:

在此输入图像描述

这是C#代码:

Microsoft.Office.Interop.Word.Application newApp = new Microsoft.Office.Interop.Word.Application();
newApp.Visible = true;
object Unknown = Type.Missing;
var Source = fileName;
var doc = newApp.Documents.Open(Source);

var project = doc.VBProject;
var module = project.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule);

var macro = "Public Sub DoKbTest()\r\n" +
                "MsgBox 'Hello'\r\n" +
            "End Sub\r\n" +
            "Public sub DoKbTestWithParameter(sMsg As String)\r\n" +
                "MsgBox sMsg\r\n" +
            "End Sub";

module.CodeModule.AddFromString(macro);
newApp.Run("DoKbTest");
newApp.Quit(ref Unknown, ref Unknown, ref Unknown);
Run Code Online (Sandbox Code Playgroud)

Mat*_*don 5

VBA中的单引号表示评论.这就是你正在产生的:

Public Sub DoKbTest()
    MsgBox 'Hello'
End Sub
Run Code Online (Sandbox Code Playgroud)

相比于:

Public Sub DoKbTest()
    MsgBox "Hello"
End Sub
Run Code Online (Sandbox Code Playgroud)

请注意语法高亮显示如何使用字符串文字周围的双引号看起来不同.

您收到该错误是因为MsgBox函数的Message参数不是可选的,因此该MsgBox [some comment]指令不是有效的函数调用.

我建议使用逐字字符串,它更清晰IMO - 简单地加倍你的双引号来逃避它们:

    var macro = @"
Public Sub DoKbTest()
    MsgBox ""Hello""
End Sub

Public Sub DoKbTestWithParameter(ByVal msg As String)
    MsgBox msg
End Sub
";
Run Code Online (Sandbox Code Playgroud)