1

我想使用 vbs 文件作为从 Java 访问 Excel 文件中的 vba 宏的桥梁。另外,我需要传输一些可变参数。

在 Java 中,我调用像这样打开 vbs 文件(工作正常):

         String strFileName = "mappe2.xlsm"; //located in the same directory
         String strMacroName = "showname";
         String strParameter = "Myname";

         String[] command = {"wscript.exe", f.getAbsolutePath(), strFileName, strMacroName, strParameter};
         Process p = Runtime.getRuntime().exec(command);

在 Excel 中,我只是尝试调用这个简单的子:

Sub showname(strName As String)
     MsgBox ("The name is: " & strName) 
End Sub

我的(缩短的)vbs 文件如下所示:

Dim args, ExcelFileName, ExcelMacroName
Dim opt
Dim Command2
Set args = WScript.Arguments
ExcelFileName = args(0)
ExcelMacroName = args(1)
opt = Cstr(args(2))
Set objWbk = GetObject("E:\Mappe2.xlsm")

Command2 = ExcelFileName & "!" & "showname"

'objWbk.Application.Run Command2, "opt" 'This way it works!
objWbk.Application.Run Command2, opt 'Error: "Type conflict" occurs!

WScript.Quit

在这里你可以看到带有静态“opt”的宏调用工作正常。但由于我将其更改为变量,我得到类型冲突的错误,我不知道为什么。我需要让它可变。

你能帮助我吗?

4

3 回答 3

1

这是因为您sub showname(strName As String)需要一个字符串作为参数。即使您的变量opt包含一个字符串,它的类型也是Variable 传递变量,明确地将 opt 转换为字符串objWbk.Application.Run Command2, Cstr(opt)

于 2013-07-09T05:55:07.970 回答
0

我发现将 Excel 方法签名更改为:

Sub showname(strName As Variant)

允许我通过opt我的测试。不过,我真的没有很好的解释为什么会这样。

于 2013-07-09T05:03:11.180 回答
0

我需要等待作为新用户才能回答我自己的问题。我想现在就做,因为它读起来好多了。

好吧,至少我找到了解决方法。我无法解释为什么它不适用于变量,但我将展示我的解决方案是如何工作的。如果有人可以解释为什么,请让我和其他人知道。

所以让我们一步一步来:

在这里, opt 获取 args(2) 的值:

opt = args(2)

接下来,两者都显示相同的值(都显示我的 java 方法中声明的“Myname”):

wscript.echo "opt : " & opt 
wscript.echo "args(2) : " & args(2)

我不能使用 opt 作为变量来运行我的宏:

objWbk.Application.Run Command2, opt  'Error: Type conflict!

但是,如果我直接使用 arguments-collection,它会起作用:

objWbk.Application.Run Command2, args(2)

对我来说现在很好,因为目前我不需要更改接收到的参数;我可以简单地将它们转发给宏。但是,如果有人需要用变量传递任何不同的值,恐怕他不能这样做。如果有人知道解决方案,请告诉我!

谢谢您的帮助!

于 2013-07-08T21:06:27.487 回答