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

时间:2017-10-23 16:14:26

标签: c# vba ms-word com-interop

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

  

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

我一直在查看this文章,但我没有回复任何内容。没看到我在这里失踪的东西。

这是调试器:

enter image description here

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

使用DoubleQuotes将文本引用到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";