Проблемы с работой и активацией нескольких рабочих книг Excel VBA - PullRequest
0 голосов
/ 31 марта 2020

У меня возникают некоторые проблемы при работе с вызовами и при работе с несколькими книгами. У меня есть макрос, который обновляет некоторые таблицы 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

Это работает, если рабочие листы НЕ открыты, но это не работает, если рабочие листы открыты - это то, чего я хочу добиться sh. Предыдущий макрос открывает все рабочие таблицы и обновляет их. Я хочу, чтобы этот макрос (2-й, показанный выше) сохранял и закрывал все рабочие книги.

-Спасибо.

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Если вы замените свой 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 уже Я вижу, что этого можно достичь, не просматривая книги.

0 голосов
/ 31 марта 2020

Это закроет правильную книгу.

Sub CloseWorkbooks()
    Application.DisplayAlerts = False

    Dim wb As Workbook
    Dim i As Long

    For i = 1 To 6
        Set wb = Workbooks.Open(Filename:="G:\DATA......Book" & i & ".xlsx")
        Application.Wait (Now + TimeValue("00:00:02"))
        wb.Close SaveChanges:=True
    Next i
Exit Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...