2013-02-25 159 views
1

我正在努力與一個按鈕調用的VBA Sub。該Sub從硬編碼文件路徑打開Configuration.xls Excel電子表格。一個MsgBox告訴我當前的工作空間 - 工作空間從當前文件更改爲剛打開的文件。這裏一切都很好。VBA函數調用:Excel按鈕vs VBS調用

我現在想從外部批處理執行這個Sub,它調用調用VBA Sub的VBS。打開Configuration.xls文件後的工作空間保持不變,並且不會更改爲Configuration.xls。另外,當通過VBS調用Sub時,函數會執行兩次 - 不知道爲什麼。

所以我的問題是 - 爲什麼我在兩個調用機制之間有不同的行爲?

我簡化了下面的代碼,因爲它顯示了與我更復雜的實際代碼相同的行爲。

Sub ReadConfiguration() 

MsgBox ActiveWorkbook.Name 
FileExcel = "D:\_Trash\VBA_VBS\Configuration.xls" 
Workbooks.Open Filename:=FileExcel, ReadOnly:=True, IgnoreReadOnlyRecommended:=True 
strFileName = FunctionGetFileName(FileExcel) 
MsgBox ActiveWorkbook.Name 

On Error Resume Next 
Set wBook = Workbooks(strFileName) 
If Err Then 
    Exit Sub 
End If 
ActiveWorkbook.Close savechanges:=False 
End Sub 
'***************************************************** 
Function FunctionGetFileName(FullPath As Variant) 
Dim StrFind As String 
Do Until Left(StrFind, 1) = "\" 
    iCount = iCount + 1 
    StrFind = Right(FullPath, iCount) 
    If iCount = Len(FullPath) Then Exit Do 
Loop 
FunctionGetFileName = Right(StrFind, Len(StrFind) - 1) 
End Function 
'***************************************************** 

的VBS看起來像這樣

Dim args, objExcel 
Set args = WScript.Arguments 
Set objExcel = CreateObject("Excel.Application") 
objExcel.Workbooks.Open args(0) 
objExcel.Visible = False 
objExcel.Run "Module1.ReadConfiguration()" 
objExcel.ActiveWorkbook.Close(0) 
objExcel.Quit 
+0

我可以重現你的問題,不管它是一個子/功能。好問題,我總是在沒有()的情況下在網上進行示例。我想知道()是怎麼回事。 – Larry 2013-02-27 07:41:04

回答

0

我只想讓你知道這個問題的解決allthough我不能完全解釋。解決方法是擺脫宏調用後面的「()」。這具有VBS腳本運行兩次並且工作簿'範圍'混淆的效果。

這麼簡單的解決方案,但仍然是問題爲什麼 - 當我添加「()」時,我該怎麼告訴函數呢?

感謝您的幫助!

TheMadMatt