首页 > 解决方案 > 使用和激活多个工作簿的问题 excel VBA

问题描述

我在处理呼叫和处理多个工作簿时遇到了一些问题。我有一个宏,可以使用一些数据更新一些 Excel 工作表。所有 5 个电子表格都分配了一个带有文件名和文件路径的变量。当我在完成更新后运行第二个 SUB / Macri 以保存并关闭所有 5 个工作簿时 - 即使它们被分配了与前一个宏相同的变量名,它也不会选择正确的工作簿。所以我相信我的问题是 - 如果工作簿已经打开,我也无法关联变量。- 我假设如果文件名和文件路径是正确的,打开的工作簿可以设置为变量,然后能够关闭它们 - 想法?

    Sub CloseWorkbooks()

    Dim MB, WB1, WB2, WB3, WB4, WB5 As Workbook
    Dim FP1, FN1, FN2, FN3, FN4, FN5 As String


    FP1 = "G:\DATA......"

        FN5 = "Book1.xlsx"
        FN2 = "Book2.xlsx"
        FN3 = "Book3.xlsx"
        FN4 = "Book4.xlsx"
        FN1 = "Book5.xlsx"

        Application.DisplayAlerts = False

            Set WB1 = Workbooks.Open(Filename:=FP1 & FN1)
            WB1.Activate
            WB1.Save

            'Application.Wait (Now + TimeValue("00:00:05"))
            WB1.Close


                Set WB2 = Workbooks.Open(Filename:=FP1 & FN2)
                WB2.Activate
                WB2.Save
                'Application.Wait (Now + TimeValue("00:00:05"))
                WB2.Close


                    Set WB3 = Workbooks.Open(Filename:=FP1 & FN3)
                    WB3.Activate
                    WB3.Save
                    Application.Wait (Now + TimeValue("00:00:02"))
                    WB3.Close


                        Set WB4 = Workbooks.Open(Filename:=FP1 & FN4)
                        WB4.Activate
                        WB4.Save
                        Application.Wait (Now + TimeValue("00:00:02"))
                        WB4.Close


                            Set WB5 = Workbooks.Open(Filename:=FP1 & FN5)
                            WB5.Activate
                            WB5.Save
                            Application.Wait (Now + TimeValue("00:00:02"))
                            WB5.Close



End Sub

如果工作表未打开,则此方法有效,但如果工作表已打开,则此方法无效-这是我希望它完成的。前面的宏打开所有工作表并更新它们。我希望这个宏(上面显示的第二个)保存并关闭所有工作簿。

-谢谢。

标签: excelvba

解决方案


如果您将您的替换Workbooks.Open(...)为对此的调用,则它应该在工作簿打开时返回,如果未打开则打开并返回它。

Public Function getWorkbookByFileName(ByVal FileName As String) As Workbook
Dim Book As Workbook: Set Book = Nothing
Dim Count As Integer: Count = Application.Workbooks.Count
Dim Index As Integer: Index = 1
Do
    If Application.Workbooks(Index).FullName = FileName Then
        Set Book = Application.Workbooks(Index)
        Exit Do
    End If
    If Index < Count Then
        Index = Index + 1
    Else
        Exit Do
    End If
Loop
If Book Is Nothing Then
    Set Book = Application.Workbooks.Open(FileName:=FileName)
End If
Set getWorkbookByFileName = Book
End Function

这是相当冗长的,查看检测 Excel 工作簿是否已经打开的一些答案,我发现它可以在不循环工作簿的情况下实现。


推荐阅读