2013-02-25 162 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