设置工作簿变量(如果已打开)

问题描述 投票:0回答:1

我正在尝试在 Outlook 中编写一个宏,以便在 Outlook 上执行一些操作并修改 Excel 文档。

如果“Doc List.xlsm”打开,

Set ExWbk = ExApp.Workbooks("C:\Doc List.xlsm")
不起作用。

如果文档已关闭,则

Set ExWbk = ExApp.Workbooks.Open("C:\Doc List.xlsm")
正在工作,我可以更改 Excel 文档。

当我进行一些错误处理时,我得到:

错误(9):下标超出范围。

Dim ExApp As Excel.Application
Dim ExWbk As Workbook
Dim ExSheet As Worksheet
....
Set ExApp = New Excel.Application
x = IsWorkBookOpen("C:\Doc List.xlsm")
If x = True Then
    Set ExWbk = ExApp.Workbooks("C:\Doc List.xlsm")
Else
    Set ExWbk = ExApp.Workbooks.Open("C:\Doc List.xlsm")
    ExApp.Visible = True
End If
....
excel vba outlook
1个回答
4
投票

问题在于总是打开一个新的 Excel 实例。并且

Doc List.xlsm
永远不会在实例中打开(因为您刚刚在计算机上启动了 Excel 实例 - 通过代码)。
Doc List.xlsm
,如果打开,将在 Excel 的现有实例中如此。

因此,您可以使用它来测试您的计算机上是否已打开 Excel 实例。

'initiate Excel object
On Error Resume Next
Set ExApp = GetObject(,"Excel.Application")
On Error GoTo 0
If ExApp Is Nothing Then Set ExApp = New Excel.Application

现在,我看不到您的

IsWorkbookOpen
函数,但您必须检查工作簿是否在您刚刚启动的 Excel 实例中打开,因此请确保发生这种情况。

然后你的其余代码就变成了

If x Then
   Set ExWbk = ExApp.Workbooks("Doc List.xlsm") 'no need to include directory path
Else
   Set ExWbk = ExApp.Workbooks.Open("C:\Doc List.xlsm")
   ExApp.Visible = True
End If

最后一点,需要明确的是,如果在代码打开且

Doc List.xlsm
文件在另一个实例中打开且未被
GetObject 拾取时,计算机上打开了多个 Excel 实例,即使此操作也可能会失败
参考。但我不会在这里讨论如何处理。

© www.soinside.com 2019 - 2024. All rights reserved.