关闭Outlook VBA中已打开的工作簿

关闭Outlook VBA中已打开的工作簿,vba,outlook,Vba,Outlook,我创建了一个Outlook宏,用于将Outlook邮件复制到Excel工作表 当目标工作簿已打开时,宏不会给出预期结果。我想关闭已打开的工作簿 我知道如何使用Excel VBA来实现这一点,但如何使用Outlook VBA来处理这一点 我使用以下代码检查Excel工作表是否打开 请注意,我想使用Outlook VBA关闭打开的工作簿 Function IsWorkBookOpen(FileName As String) Dim ff As Long, ErrNo As Long On Erro

我创建了一个Outlook宏,用于将Outlook邮件复制到Excel工作表

当目标工作簿已打开时,宏不会给出预期结果。我想关闭已打开的工作簿

我知道如何使用Excel VBA来实现这一点,但如何使用Outlook VBA来处理这一点

我使用以下代码检查Excel工作表是否打开

请注意,我想使用Outlook VBA关闭打开的工作簿

Function IsWorkBookOpen(FileName As String)
Dim ff As Long, ErrNo As Long

On Error Resume Next
ff = FreeFile()
Open FileName For Input Lock Read As #ff
Close ff
ErrNo = Err
On Error GoTo 0

Select Case ErrNo
Case 0:    IsWorkBookOpen = False
Case 70:   IsWorkBookOpen = True
Case Else: Error ErrNo
End Select
End Function
更新-1(我用来打开和填充工作簿的代码)

更新-2(解决方案)

Dim wb As Object
Set wb = GetObject("C:\book1.xlsx")
If Not wb is Nothing then wb.close

正如您所知,您可以使用GetObject检索实际文档本身,而无需打开应用程序和添加工作簿。如果工作簿已打开,它将为您提供对已打开实例的引用,否则它将为您打开它。这将允许您避免该问题;)

比如:

您可以使用下面的方法访问现有的Excel实例。您需要添加对Microsoft Excel对象库的引用(工具>引用),或将
Dim xlapp
Dim wb
的类型更改为
作为对象。我个人更喜欢添加引用以保持intellisense和早期绑定/编译器检查

'Gets an existing instance of Excel if running then closes workbooks open in the instance,
'otherwise exits
Sub blah()
    Dim xlapp As Excel.Application

    On Error Resume Next
    Set xlapp = GetObject(, "Excel.Application")
    On Error GoTo 0

    If xlapp Is Nothing Then
        'No instance was running. You can create one with
        'Set xlapp = New Excel.Application
        'but in your case it doesn't sound like you need to so:
        Exit Sub
    End If

    Dim wb As Workbook
    For Each wb In xlapp.Workbooks
        wb.Close False
    Next wb

    xlapp.Quit

End Sub

当多个应用程序实例正在运行时,获取特定应用程序实例的过程是非常不同的,因此,如果您需要该要求,可以这样说。

值得注意的是,如果用户恰好打开了多个Excel实例,这将只返回一个实例(可能不是打开工作簿的实例)。“当多个应用程序实例正在运行时,获取特定应用程序实例的过程是非常不同的,因此,如果您需要该需求,可以这样说。“:)@Cor_Blimey-谢谢,我使用GetObject方法解决了我的问题:)显示填充工作簿的代码会很有帮助。@TimWilliams-我已经添加了填充工作簿的代码。我希望这将帮助您找到解决方案。谢谢
Dim wb As Object
Set wb = GetObject("C:\book1.xlsx")
If not wb is nothing then debug.print wb.Name
'Gets an existing instance of Excel if running then closes workbooks open in the instance,
'otherwise exits
Sub blah()
    Dim xlapp As Excel.Application

    On Error Resume Next
    Set xlapp = GetObject(, "Excel.Application")
    On Error GoTo 0

    If xlapp Is Nothing Then
        'No instance was running. You can create one with
        'Set xlapp = New Excel.Application
        'but in your case it doesn't sound like you need to so:
        Exit Sub
    End If

    Dim wb As Workbook
    For Each wb In xlapp.Workbooks
        wb.Close False
    Next wb

    xlapp.Quit

End Sub