从VBS打开或激活工作簿

我正在写一个小的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尚未打开,则会默默无法打开新的实例。

GetObject行为正常给你一个运行的Excel实例或导致错误。 如果出现错误(Excel未运行),请使用CreateObject创buildExcel的新实例。

使用GetObject打开文件。

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

COM会解决需要做的事情。 这一条线就是你的三个要求所需要的。

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

BindMoniker

通过名字对象定位对象,如果对象处于非活动状态,则激活该对象,然后检索指向该对象上指定接口的指针。

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