1

ボタンで呼び出される VBA Sub に苦労しています。この Sub は、ハードコードされたファイル パスから Configuration.xls Excel スプレッドシートを開きます。MsgBox は、現在のワークスペースについて教えてくれます。ワークスペースは、現在のファイルから開いたばかりのファイルに変わります。ここではすべて問題ありません。

VBA Sub を呼び出す VBS を呼び出す外部バッチからこの Sub を実行したいと考えています。Configuration.xls ファイルを開いた後のワークスペースは同じままで、Configuration.xls に変わりません。さらに、VBS で Sub を呼び出すと、関数が 2 回実行されます - 理由はわかりません。

私の質問は、なぜ 2 つの呼び出しメカニズム間で動作が異なるのですか?

より複雑な実際のコードと同じ動作を示すため、以下のコードを簡略化しました。

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
4

1 に答える 1

0

完全に説明することはできませんが、この問題の解決策についてお知らせしたいと思います。解決策は、マクロ呼び出しの後ろにある "()" を取り除くことです。これには、VBS スクリプトが 2 回実行され、ワー​​クブックの「スコープ」が混同されるという影響があります。

非常に簡単な解決策ですが、それでも問題は「()」を追加するときに、関数に追加で何を伝えますか?

ご協力いただきありがとうございます!

みやび

于 2013-02-27T07:24:41.237 に答える