插入 VB 宏会抛出 Argument not optional 错误

Inserting a VB macro throws Argument not optional error

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

Compile Error: Argument not optional

我一直在查看 this 文章,但我没有返回任何内容。没有看到我在这里错过了什么。

这是调试器:

这是 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);

使用双引号将 Text 引用到 MsgBox。

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";

VBA 中的单引号表示注释。这就是您正在生成的内容:

Public Sub DoKbTest()
    MsgBox 'Hello'
End Sub

比较:

Public Sub DoKbTest()
    MsgBox "Hello"
End Sub

注意语法突出显示与字符串文字周围的双引号有何不同。

您收到该错误是因为 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
";