Private Sub Workbook_BeforeClose(Cancel As Boolean) … If Cells(1, 1) = "" And Workbooks.Count = 1 Then MsgBox "1": ThisWorkbook.Close (False): MsgBox "2": Application.Quit MsgBox "3" …
[/vba] 1. Не могу понять, почему ThisWorkbook.Close не происходит, судя по работающему MsgBox "2", и Application.Quit не происходит, судя по работающему MsgBox "3". 2. Не могу понять, почему MsgBox "1" срабатывает два раза. При этом полстраницей ниже [vba]
Код
… ThisWorkbook.Save If Workbooks.Count = 1 Then Application.Quit End Sub
[/vba] работает. Прошу помощи ответами на 1. и 2.
Здравствуйте! [vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean) … If Cells(1, 1) = "" And Workbooks.Count = 1 Then MsgBox "1": ThisWorkbook.Close (False): MsgBox "2": Application.Quit MsgBox "3" …
[/vba] 1. Не могу понять, почему ThisWorkbook.Close не происходит, судя по работающему MsgBox "2", и Application.Quit не происходит, судя по работающему MsgBox "3". 2. Не могу понять, почему MsgBox "1" срабатывает два раза. При этом полстраницей ниже [vba]
Код
… ThisWorkbook.Save If Workbooks.Count = 1 Then Application.Quit End Sub
[/vba] работает. Прошу помощи ответами на 1. и 2.pentium1024
1. Не могу понять, почему ThisWorkbook.Close не происходит
А че бы ему происходить, если в самом событии перед закрытием его же и вызываете. Так должно сработать[vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.DisplayAlerts = False If Cells(1, 1) = "" And Workbooks.Count = 1 Then MsgBox "1": MsgBox "2": Application.Quit MsgBox "3" End Sub
1. Не могу понять, почему ThisWorkbook.Close не происходит
А че бы ему происходить, если в самом событии перед закрытием его же и вызываете. Так должно сработать[vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.DisplayAlerts = False If Cells(1, 1) = "" And Workbooks.Count = 1 Then MsgBox "1": MsgBox "2": Application.Quit MsgBox "3" End Sub
К вопросу 2. Почему MsgBox срабатывает два раза. Если выше объяснено вызовом ThisWorkbook.Close из самого себя, то в коде [vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean, k As Byte) … With Range("E2:E" & lr + 8) … .ClearContents End With
ThisWorkbook.Save If Workbooks.Count = 1 Then MsgBox "Quit " & k: k = k + 1: Application.Quit End Sub
[/vba] .ClearContents приводит к тому же, двойному срабатыванию MsgBox "Quit " & k:. Который оба раза показывает 1 как k. Ничему в моём коде это не мешает, но хочется знать для того, чтобы знать. Поэтому прошу помощи у состоявшихся знатоков.
К вопросу 2. Почему MsgBox срабатывает два раза. Если выше объяснено вызовом ThisWorkbook.Close из самого себя, то в коде [vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean, k As Byte) … With Range("E2:E" & lr + 8) … .ClearContents End With
ThisWorkbook.Save If Workbooks.Count = 1 Then MsgBox "Quit " & k: k = k + 1: Application.Quit End Sub
[/vba] .ClearContents приводит к тому же, двойному срабатыванию MsgBox "Quit " & k:. Который оба раза показывает 1 как k. Ничему в моём коде это не мешает, но хочется знать для того, чтобы знать. Поэтому прошу помощи у состоявшихся знатоков.pentium1024
doober, спасибо. Вопрос 1. прояснён. Если я верно понял, Application.Quit произойдёт только после End Sub, а помещать его можно в любое место кода.
doober, спасибо. Вопрос 1. прояснён. Если я верно понял, Application.Quit произойдёт только после End Sub, а помещать его можно в любое место кода.pentium1024
Сообщение отредактировал pentium1024 - Пятница, 07.01.2022, 09:52
Вы не разобрались. Выполните этот код, который запишите в обычный модуль.[vba]
Код
Sub Test2() MsgBox 1 Application.DisplayAlerts = False Application.Quit MsgBox 2 End Sub
[/vba] MsgBox 2 не произойдет. А код, который находится в событии Sub Workbook_BeforeClose выполнится до конца, потому что книга еще не закрыта. Простыми словами, после закрытия книги выполнить Application.Quit.
Вы не разобрались. Выполните этот код, который запишите в обычный модуль.[vba]
Код
Sub Test2() MsgBox 1 Application.DisplayAlerts = False Application.Quit MsgBox 2 End Sub
[/vba] MsgBox 2 не произойдет. А код, который находится в событии Sub Workbook_BeforeClose выполнится до конца, потому что книга еще не закрыта. Простыми словами, после закрытия книги выполнить Application.Quit.doober
Сообщение отредактировал doober - Пятница, 07.01.2022, 11:02
doober, :-) А я поленился проверять. Так что, «Application.Quit произойдёт только после End Sub, а помещать его можно в любое место кода» верно для всех Sub, не только для Sub Workbook_BeforeClose?
P.S. Да, доходит до MsgBox "2". А Application.Quit происходит только после End Sub.
doober, :-) А я поленился проверять. Так что, «Application.Quit произойдёт только после End Sub, а помещать его можно в любое место кода» верно для всех Sub, не только для Sub Workbook_BeforeClose?
P.S. Да, доходит до MsgBox "2". А Application.Quit происходит только после End Sub.pentium1024
Сообщение отредактировал pentium1024 - Суббота, 08.01.2022, 07:02
Родился и 3. Если из Private Sub сделать Call Workbook_BeforeClose, то закрытия файла не происходит. Верно я понимаю, что Workbook_BeforeClose с Call работает как обычная Sub – книгу не закрывает и передаёт очередь по окончании своей работы вызвавшей её Private Sub?
Родился и 3. Если из Private Sub сделать Call Workbook_BeforeClose, то закрытия файла не происходит. Верно я понимаю, что Workbook_BeforeClose с Call работает как обычная Sub – книгу не закрывает и передаёт очередь по окончании своей работы вызвавшей её Private Sub?pentium1024
doober, сначала понять, в чём неправильность пути и бредовость идеи. Потом по событию закрывать книгу, предварительно какие-то данные переписав, какие-то почистив. Т.к. те же переписывания и чистки д. происходить и по кресту, то код нужно поместить в Workbook_BeforeClose. Сейчас по событию делаю Call Workbook_BeforeClose. Всё, кстати, работает, если туда поместить ThisWorkbook.Close, что, видимо, тоже неправильно и бредово. Случаев «я не знал, что так нельзя, и сделал так, и оно работает» полно не только в программировании. Наверное, Вы правы в неправильности и бредовости, поэтому по событию нужно ThisWorkbook.Close в Private Sub.
doober, сначала понять, в чём неправильность пути и бредовость идеи. Потом по событию закрывать книгу, предварительно какие-то данные переписав, какие-то почистив. Т.к. те же переписывания и чистки д. происходить и по кресту, то код нужно поместить в Workbook_BeforeClose. Сейчас по событию делаю Call Workbook_BeforeClose. Всё, кстати, работает, если туда поместить ThisWorkbook.Close, что, видимо, тоже неправильно и бредово. Случаев «я не знал, что так нельзя, и сделал так, и оно работает» полно не только в программировании. Наверное, Вы правы в неправильности и бредовости, поэтому по событию нужно ThisWorkbook.Close в Private Sub.pentium1024
Сообщение отредактировал pentium1024 - Воскресенье, 09.01.2022, 01:16
Private Sub Workbook_BeforeClose(Cancel As Boolean) 'Т.к. те же переписывания и чистки д. происходить и по кресту If MsgBox("Уже переписали и почистили?", 36) = vbNo Then Cancel = True ' здесь вызываем код для очистки End If End Sub
[/vba] *Сергей уже написал (я поздно увидел)
а может типа такого: [vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean) 'Т.к. те же переписывания и чистки д. происходить и по кресту If MsgBox("Уже переписали и почистили?", 36) = vbNo Then Cancel = True ' здесь вызываем код для очистки End If End Sub
nilem, благодарю за участие. Помощь пользователя – не наш способ, оно д. работать само. В каком направлении работать, куда меня направляете вы с doober'ом, я пока не сообразил. Зачем мне Cancel = True, кому и зачем он не даст закрыть книгу, кот. нужно закрыть, не понятно. Как в анекдоте про сложную лекцию: вопросов нет, всё один большой вопрос.
nilem, благодарю за участие. Помощь пользователя – не наш способ, оно д. работать само. В каком направлении работать, куда меня направляете вы с doober'ом, я пока не сообразил. Зачем мне Cancel = True, кому и зачем он не даст закрыть книгу, кот. нужно закрыть, не понятно. Как в анекдоте про сложную лекцию: вопросов нет, всё один большой вопрос.pentium1024