2013-02-25 2 views
1

Я борюсь с VBA Sub, который вызывается кнопкой. Этот Sub открывает таблицу Configuration.xls Excel из жестко закодированного пути к файлу. MsgBox расскажет мне о текущей рабочей области - рабочая область изменяется от текущего файла до только что открытого. Здесь все хорошо.Вызов функции VBA: клавиша Excel против VBS-вызова

Теперь я хочу выполнить этот Sub из внешней партии, которая вызывает VBS, который вызывает VBA Sub. Рабочее пространство после открытия файла Configuration.xls остается неизменным и не изменяется в Configuration.xls. Кроме того, при вызове Sub на VBS функция запускается дважды - не подскажите почему.

Так что мой вопрос: почему у меня разные способы взаимодействия между двумя механизмами вызова?

Я упростил приведенный ниже код, поскольку он показывает то же поведение, что и мой более сложный реальный код.

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

Я могу воспроизвести вашу проблему независимо от того, является ли она функцией sub/a. Хороший вопрос, я всегда следовал примеру онлайн без(). Я хотел бы знать, что происходит с(). – Larry

ответ

0

Я просто хочу, чтобы вы знали о решении этого вопроса Allthough я не могу полностью объяснить. Решение заключается в том, чтобы избавиться от "()" за макро-вызовом. Это приводит к тому, что сценарий VBS запускается дважды, а область «Рабочая книга» путается.

Так простое решение, но все же вопрос WHY- Что я должен сказать дополнительно, добавляя «()»?

Благодарим за помощь!

TheMadMatt

Смежные вопросы