【问题标题】:How to get workbook name of running excel instance using vbscript..?如何使用 vbscript 获取正在运行的 excel 实例的工作簿名称..?
【发布时间】:2013-04-01 06:33:48
【问题描述】:
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 实例是否正在运行。即使工作簿名称作为脚本中的硬编码输入传递也不是问题。我将根据我的工作簿名称进行更改。

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

【问题讨论】:

  • Workbook.Name 属性适合您吗?
  • 请参阅我更新后的帖子中的第 3 点。

标签: excel vbscript


【解决方案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"

【讨论】:

    【解决方案2】:

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

    1. 此代码用于检查所有实例中所有打开的工作簿Can VBA Reach Across Instances of Excel?
    2. 检测文件是否已被使用。见Sid's suggestion 来自Detect whether Excel workbook is already open
    3. Doug's suggestion 使用 GetObject 附加到您知道工作簿名称的主机实例。根据Microsoft Support article,您可以使用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"""
    

    【讨论】:

    • +1 在代码的早期将它们夹在 OERN 和 OEGT0 之间是最好的方法 :)
    • 非常感谢。 :) 你几乎让我的任务变得简单了。需要更多帮助。用整个要求更新了我的问题。请帮我这样做。等待您的慷慨回应。
    • 我的判断与@SiddharthRout 相反,-0.5 用于将ActiveWorkbook 包装在OERN 中,而不是使用Workbooks.Count
    • @seeker -0.25 到搜索者。 :) Workbooks.Count 可以为充当插件的个人工作簿返回 1 - 但不可用。加上最初询问ActiveWorkbook 的问题 - 它已被编辑
    • @brettdj 仍然看不到 OERN 的原因,请参阅 msdn.microsoft.com/en-us/library/office/…
    【解决方案3】:

    我不会使用 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
    

    P.S. 阅读 Brettdj 后更新的答案看起来像 GetObject 可以帮助多个 Excel 实例,因此如果可行,您可以将您的测试封装在一个函数中。

    Function IsWBookOpen(strWBook)
        On Error Resume Next
        Dim wb: Set wb = GetObject(strWBook)
        IsWBookOpen = Not Err
    End Function
    

    【讨论】:

    • @brettdj - 我认为这会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-07-15
    • 2012-09-12
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多