【问题标题】:Opening or activating workbook in Excel from VBS从 VBS 在 Excel 中打开或激活工作簿
【发布时间】:2023-03-24 14:15:01
【问题描述】:

我正在编写一个小的 VBScript 来执行以下操作:

  1. 检查 Excel 是否打开;如果不打开它。
  2. 如果 Excel 已打开,请检查特定工作簿是否已打开。
  3. 如果工作簿已打开,请将其激活;如果没有,请打开它。

到目前为止,我已经能够编写以下代码:

ExcelFileName = "....xlsx"

On Error Resume Next
Set xl = GetObject(, "Excel.Application")
IF Err Then
    If Err.Number = 429 Then
    WScript.Echo "Workbook not open (Excel is not running)."
    Else
    WScript.Echo Err.Description & " (0x" & Hex(Err.Number) & ")"
    End If
    WScript.Quit 1
End If
On Error Goto 0

Set wb = Nothing
For Each obj In xl.Workbooks
    If obj.Name = ExcelFileName Then
    Set wb=obj
    xl.DisplayAlerts = False
    wb.Save
    Exit For
    End If
Next

If wb Is Nothing Then
    xl.Workbooks.Open("C:\...")
End If

Set xl = Nothing
Set wb = Nothing

但如果 Excel 尚未打开,它会默默地无法打开新实例。

【问题讨论】:

  • 脚本尝试打开 Excel 时到底出了什么问题?
  • 目前 Excel 没有启动。我正在使用GetObject(, "Excel.Application"),这就是它试图附加到现有 Excel 实例的原因。如果没有(意味着 Excel 已关闭),我希望它打开 Excel。很抱歉,如果我没有把自己说得很清楚,这是我第一次尝试编写代码。
  • 您是否收到任何错误,或者它只是保持关闭状态?
  • 它只是保持关闭状态。
  • GetObject 仅获取现有实例(如果有要获取的对象)。如果失败,您需要CreateObject(创建一个新实例)。这里已经有很多这样做的例子了。你找过他们吗?我在这个问题右侧的 Related 列表中找到了 example。 ====>>>>

标签: excel vbscript com


【解决方案1】:

使用 GetObject 打开文件。

set wb = GetObject("c:\folder\excel.xls")

COM 会找出需要做的事情。只需一行代码即可满足您的三个要求。

这是 VB 在使用带有文件名的 GetObject 时要求 COM 做的事情。

BindMoniker

通过对象的名字对象定位对象,如果对象不活动则激活该对象,并检索指向该对象上指定接口的指针。

HRESULT BindMoniker( LPMONIKER pmk, DWORD grfOpt, REFIID iidResult, LPVOID FAR * ppvResult );

【讨论】:

  • 我喜欢 set wb 的 getobject,但是你的问题变成了你不知道/拥有父应用程序 - 然后必须得到它。正确的?我尝试创建一个 excel 应用程序对象,然后使用您的 GetObject 方法设置 wb。然后我尝试调用 applicationobject.run "openedworkbookname!macroname",我得到的错误非常有趣。 “抱歉,我们找不到 c:\users\john\DOCUMENTS\...”,而那甚至不是 wb 的路径...
【解决方案2】:

GetObject 在为您提供正在运行的 Excel 实例或导致错误时表现正常。如果出现错误(Excel 未运行),请使用 CreateObject 创建一个新的 Excel 实例。

【讨论】:

    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 2017-01-16
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多