Макрос VBA Excel для выхода из всех книг завершается бесконечным циклом - PullRequest
0 голосов
/ 29 июня 2018

Я хотел бы написать макрос для цикла по всем книгам Excel (в нескольких экземплярах), распечатать активный лист во всех книгах и закрыть все экземпляры Excel.

Код следующий:

Dim xl As Excel.Application
Set xl = GetObject(, "Excel.Application")
If xl Is Nothing Then
    msgbox "Unable to set xl"
    Exit Sub
End If

Dim wb As Excel.Workbook
Dim loopCount As Integer
loopCount = 0


Do Until xl Is Nothing
    loopCount = loopCount + 1

    For Each wb In xl.Workbooks
        wb.ActiveSheet.PrintOut
        wb.Saved = True
    Next

    xl.Quit

    If loopCount > 30 Then
        msgbox "Infinite loop"
        Exit Sub
    End If

    Set xl = GetObject(, "Excel.Application")

Loop

msgbox "Ended successfully"

Проблема в том, что закрывается только одно приложение, а затем макрос завершается в бесконечном цикле. Зачем? Я пытался сделать это несколькими способами, всегда заканчивая бесконечным циклом.

Большое спасибо за ваши идеи!

1 Ответ

0 голосов
/ 29 июня 2018

Вы закрываете Excel полностью, поэтому макрос не может завершить свою работу.

попробуйте это:

Sub test()

    Dim xl As Excel.Application
    Set xl = GetObject(, "Excel.Application")
    If xl Is Nothing Then
        MsgBox "Unable to set xl"
        Exit Sub
    End If

    Dim wb As Excel.Workbook
    Dim loopCount As Integer
    loopCount = 0


    Do Until xl Is Nothing
        loopCount = loopCount + 1

        For Each wb In xl.Workbooks
            wb.ActiveSheet.PrintOut
            wb.Saved = True
            ' closes all workbooks except the one which contains the macro
            If (wb.Name <> ThisWorkbook.Name) Then
                wb.Close
            ' if all workbooks except the one which contains the macro are closed, it junps to the end
            ElseIf (Workbooks.Count = 1) Then
                GoTo end
            End If
        Next



        If loopCount > 30 Then
            MsgBox "Infinite loop"
            Exit Sub
        End If

        Set xl = GetObject(, "Excel.Application")

    Loop



    ' due to if (false) this part is just reachable via GoTo
    If (False) Then
end:
    ' here you can also close the workbook which contains the macro
    MsgBox "Ended successfully"
    End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...