4
Dim objXL, strMessage

On Error Resume Next

Set objXl = GetObject(, "Excel.Application")

If Not TypeName(objXL) = "Empty" then
    strMessage = "Excel Running"    
Else 
    strMessage = "Excel NOT Running"
End If

MsgBox strMessage, vbInformation, "Excel Status"

ねえ、どうもありがとう。これにより、探しているものに本当に近づき、解決策にはるかに近づきます。私の正確な要件/問題を教えてください:実際に私の問題は、Java から特定のワークブック名​​の Excel インスタンスを見つけようとしていますが、表示されていても Excel インスタンスが返されないことです。私の場合、「Book1」と「Book2」の 2 つのワークブックを含む Excel を開いています。これらのブック名のいずれかで Excel を検索しようとすると、結果が得られません。絞り込むために、この問題は私のクライアント マシンの 1 つでのみ観察されます。残りのマシンでは、この同じ Java コードが正常に動作します。これは、Excel2010 をアンインストールして Excel2007 をインストールした後に発生し始めました。

だから私がやろうとしているのは、ワークブック名​​を入力として与えることができる1つのvbscriptを作成したいということです.

ワークブック名​​を指定すると、スクリプトはそのような Excel インスタンスが実行されているかどうかを確認します。ワークブック名​​がスクリプトでハードコーディングされた入力として渡されても問題ありません。ワークブック名​​に従って変更します。

以前の返信に感謝し、これも待っています.. :))

4

3 に答える 3

6

特定のワークブックが開いているかどうかを検出するよりも、複数のインスタンスを開いている可能性がある場合は、次を使用できます。

  1. すべてのインスタンスで開いているすべてのワークブックを調べるこのコードVBA は Excel のインスタンス間で到達できますか?
  2. ファイルが既に使用されているかどうかを検出します。Excel ワークブックが既に開いているかどうかを検出するからの Sid の提案を参照してください。
  3. GetObjectワークブック名​​がわかっているホスト インスタンスにアタッチするために使用するDoug の提案。Microsoft サポートの記事に従って、Set xlApp = GetObject("YourExcelName").Application「YourExcelName」が任意のインスタンスで開いているかどうかを検出するために使用できます

最初に尋ねた質問では、以下のコードを使用GetObjectして、インスタンスが開いているかどうか、ActiveWorkbookおよびその名前があるかどうかを検出します。編集した質問から、上記の 3 つのリンクは、このコードよりも関連性があります。

Dim objXL, WB, strMessage
On Error Resume Next
Set objXL = GetObject(, "Excel.Application")
Set WB = objXL.ActiveWorkbook
On Error GoTo 0
If Not TypeName(objXL) = "Empty" Then
    If Not TypeName(WB) = "Nothing" Then
    strMessage = "Excel Running - " & objXL.ActiveWorkbook.Name & " is active"
    Else
    strMessage = "Excel Running - no workbooks open"
    End If
Else
    strMessage = "Excel NOT Running"
End If
MsgBox strMessage, vbInformation, "Excel Status"""
于 2013-04-10T05:39:57.843 に答える
2

私は Excel を使用していません。次のコードが出発点になることを願っています。ただし、多数の Excel インスタンスを実行している場合は、今後さらに自分で調査する必要があります。

Dim objXL, strName, bFound, strMsg

On Error Resume Next
Set objXl = GetObject(, "Excel.Application")
On Error GoTo 0
If Err Then
    MsgBox "Excel NOT Running", vbInformation, "Excel Status"
    WScript.Quit(-1)
End If

strName = InputBox("Enter Workbook Name:", "Required")
If Len(strWBName) = 0 Then WScript.Quit(-2)

bFound = False
If objXL.Workbooks.Count > 0 Then
    For Each wb In objXL.Workbooks
        If wb.Name = strName Then
            bFound = True
            Exit For
        End If
    Next
End If

strMsg = "Workbook " & UCase(strName) & " is "
If bFound Then
    MsgBox strMsg & "open", vbInformation, "Result"
Else
    MsgBox strMsg & "not open", vbInformation, "Result"
End If

PS Brettdj の更新された回答を読んだ後GetObject、複数の Excel インスタンスに役立つように見えるため、それが機能する場合は、テストを関数にカプセル化できます。

Function IsWBookOpen(strWBook)
    On Error Resume Next
    Dim wb: Set wb = GetObject(strWBook)
    IsWBookOpen = Not Err
End Function
于 2013-04-10T19:21:24.113 に答える
1

次のコマンドを使用して、アクティブなワークブック名​​を取得できます。objXL.ActiveWorkbook.Name

Dim objXL, strMessage

On Error Resume Next

Set objXL = GetObject(,"Excel.Application")

If Not TypeName(objXL) = "Empty" then
    strMessage = "Excel Running"    
    WScript.Echo "The active workbook name is " & objXL.ActiveWorkbook.Name
Else 
    strMessage = "Excel NOT Running"
End If

MsgBox strMessage, vbInformation, "Excel Status"
于 2013-04-09T18:30:34.697 に答える