我正在尝试在 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 实例。并且
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 实例,即使此操作也可能会失败
参考。但我不会在这里讨论如何处理。