2013-07-09 94 views
0

编辑:在将特定的Excel文件或其窗口放到前面之前,我需要检查它是否正在运行/仍然打开。检查一个特定的Excel文件在打开多个Excel文件时是否打开并激活它

旧问题: 我想设置一个特定的Excel窗口到前面。

有了这个VBScript代码,我可以通过它的名字激活一个单独的Excel窗口。但是由于打开了多个Excel窗口,它不再工作。在这种情况下,它不会找到所需的窗口,并且无法检查它是否打开。所以它总是会说ExcelFileName没有打开。

Set WshShell = WScript.CreateObject ("WScript.Shell") 
if WshShell.AppActivate(ExcelFileName) = True then 
    wscript.echo ExcelFileName & " is opened." 
    WshShell.sendkeys "%x" 'in Excel 2003 this would had opened the extra-menu-droplist of the menu-bar. Now it just activates Excel. 
else 
    wscript.echo ExcelFileName & " is not open." 
End if 

如何使它可以与多个打开的Excel窗口一起使用?

+0

一个简单的'CreateObject(“WScript.Shell”).AppActivate“Microsoft Excel”'不起作用? –

+0

是的,我很惊讶它工作正常。但是我很抱歉,我注意到我把这个问题写错了,我的错!除了激活一个窗口,我想在之前检查它是否可用或正在运行。我想在激活它之前检查是否打开了特定的Excel文件。我现在编辑我的问题。 – Eleandro

+0

看看这里:[检查工作簿是否在任何Excel实例中打开](http://www.thecodenet.com/articles.php?id=1)。不幸的是,它不能以与VBScript相同的方式工作,但它解释了这个问题。 – Eleandro

回答

5

因此,您想要检测是否打开了具有给定名称的工作簿?可以这样做在VBScript:

ExcelFileName = "some.xlsx" 

On Error Resume Next 
Set xl = GetObject(, "Excel.Application") 'attach to running Excel instance 
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 'use obj.FullName for full path 
    Set wb = obj 
    Exit For 
    End If 
Next 
If wb Is Nothing Then 
    WScript.Echo "Workbook not open." 
    WScript.Quit 1 
End If 

GetObject只能连接到最先推出的Excel实例,虽然。您需要终止该实例才能连接到下一个实例(请参阅here)。但是,由于这是在已经运行的实例中打开工作簿的默认设置,因此上面应该适用于大多数场景。

+0

非常感谢!我在'如果wb = Nothing Then'这行中发现一个错误,这应该是'If wb is Nothing Then',然后它工作正常。请编辑您的帖子,我已经打算将其标记为答案。 – Eleandro

+1

谢谢你的抬头。固定。 –