2013-07-08 26 views
1

我想使用vbs文件作为桥梁,以便从Java访问Excel文件中的vba-macro。另外,我需要传输一些可变参数。VBS:在application.run中使用变量时发生类型冲突

在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 

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

你能帮我吗?

+0

这只是一个疯狂的猜测,但尝试调用'objWbk.Application.Run Command2,Eval(opt)' – 2013-07-08 12:43:43

+0

Thanky你为这个尝试!至少宏启动了,但参数传输不正确。所以opt是空的,Msgbox显示如下:“名字是:” – Eleandro

+0

你确定args(2)不是null吗? – wingyip

回答

1

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

+0

感谢您的回答! 我尝试了第一个,但是你不能在VBScript中以这种方式声明一个字符串。 但第二种方法工作正常。有趣的是,您需要在使用run-method调用宏时将转换转换为字符串。当我尝试先进行一些转换时,它不起作用:'opt = CStr(args(2))' – Eleandro

+0

还有一个问题:当我通过'wscript.echo Typename(opt )'它显示'String',并且在运行语句之前或之后检查无关紧要。 VBS中的字符串如何在VBA中不是字符串? – Eleandro

+2

@Eleandro,VBScript中的所有变量都是_Variant_类型。你可以在[MSDN](http://msdn.microsoft.com/en-us/library/9e7a57cf%28v=vs.84%29.aspx)上阅读它们。基本上,Variant是一种可以保存几种不同类型的特殊类型。 TypeName函数向您显示子类型(也就是Variant所持有的变量的类型)。 –

0

我需要等待一个新用户,然后才能回答我自己的问题。我想现在就做,因为阅读好多了。

那么,至少我找到了解决方法。我无法解释为什么它不能与变量一起工作,但我会展示我的解决方案如何工作。如果有人能解释为什么请让我和其他人知道。

因此,让你一步一步来:

这里,选择获取参数的个数值(2):

opt = args(2) 

下,都表现出相同的值(均显示“的Myname”的声明在我的Java方法):

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

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

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

但它的工作原理,如果我使用的参数收集直接:

objWbk.Application.Run Command2, args(2) 

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

谢谢你的帮助!

0

我发现,改变了Excel的方法签名:

Sub showname(strName As Variant) 

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

+0

这将工作,因为'opt'被视为一个变体。因此,通过的论证和期望的论证具有相同的类型。 – CaBieberach

+0

谢谢,这工作正常! – Eleandro