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 实例。就我而言,我打开了一个 Excel,其中包含 2 个工作簿“Book1”和“Book2”。当我尝试使用这些工作簿名称中的任何一个查找 Excel 时,没有给出任何结果。为了缩小范围,仅在我的一台客户端计算机上观察到此问题。在其他机器上,同样的 java 代码运行良好。这在卸载 Excel2010 并安装 Excel2007 后开始发生。

所以我想要做的是,想要创建一个 vbscript,我可以在其中将工作簿名称作为输入,它会返回我是否有这样的 Excel 实例以给定的工作簿名称运行。

嘿,请指导我进一步创建这样的脚本,我将在其中给出工作簿名称,脚本将查找此类 Excel 实例是否正在运行。即使工作簿名称作为脚本中的硬编码输入传递也不是问题。我将根据我的工作簿名称进行更改。

感谢您之前的回复,也正在等待这个回复.. :))

4

3 回答 3

6

如果您可能打开了多个实例而不是检测特定工作簿是否打开,您可以使用:

  1. 此代码用于检查所有实例中所有打开的工作簿VBA 可以跨 Excel 实例吗?
  2. 检测文件是否已被使用。请参阅检测 Excel 工作簿是否已打开中Sid 建议
  3. Doug 的建议用于GetObject附加到您知道工作簿名称的主机实例。根据Microsoft 支持文章,您可以使用它Set xlApp = GetObject("YourExcelName").Application来检测“YourExcelName”是否在任何实例中打开

在您最初提出的问题中,下面的代码GetObject用于检测是否有任何实例是打开的,以及是否有一个ActiveWorkbook以及那个名称是什么。从您编辑的问题中,我上面的三个链接比这段代码更相关。

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 回答