2013-07-08 25 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