nilem, в итоге у меня всё давно работает, наверное, неправильно и бредово. Не тормозит, не зависает, не приводит к неоднозначностям. У меня остались вопросы по работе кода, о них я и вопрошаю. Повторю эти вопросы. 1. Application.Quit произойдёт только после End Sub, а помещать его можно в любое место кода? 2. Почему MsgBox срабатывает дважды в кодах [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] при наличии в нём ThisWorkbook.Close (False). И в [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 3. Если из Private Sub сделать Call Workbook_BeforeClose, то закрытия файла не происходит. Верно я понимаю, что Workbook_BeforeClose с Call работает как обычная Sub – книгу не закрывает и передаёт очередь по окончании своей работы вызвавшей её Private Sub?
doober, решение «читай доки» со штампом «хоть немного» отвратительно. Мне не нужно, чтобы за меня кто-то кодил или «доки хоть немного почитал», я прошу ответов на мои вопросы у тех, кто знает, кому уже не нужно для ответа читать доки. Насколько я понимаю, это основная цель форума. Если Вы не хотите/не можете помочь, не отвечайте. А этим высокомерием очков себе не заработаете, наоборот. Или Вы хотите, чтобы ответы у Вас выпрашивали, желательно при этом подчёркивая собственное ничтожество? Уверять, что я не немного читал перед тем, как обратиться сюда, глупо. Вы и подобные Вам скажут, что читал недостаточно, не то и ещё что-нибудь подобное.
nilem, в итоге у меня всё давно работает, наверное, неправильно и бредово. Не тормозит, не зависает, не приводит к неоднозначностям. У меня остались вопросы по работе кода, о них я и вопрошаю. Повторю эти вопросы. 1. Application.Quit произойдёт только после End Sub, а помещать его можно в любое место кода? 2. Почему MsgBox срабатывает дважды в кодах [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] при наличии в нём ThisWorkbook.Close (False). И в [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 3. Если из Private Sub сделать Call Workbook_BeforeClose, то закрытия файла не происходит. Верно я понимаю, что Workbook_BeforeClose с Call работает как обычная Sub – книгу не закрывает и передаёт очередь по окончании своей работы вызвавшей её Private Sub?
doober, решение «читай доки» со штампом «хоть немного» отвратительно. Мне не нужно, чтобы за меня кто-то кодил или «доки хоть немного почитал», я прошу ответов на мои вопросы у тех, кто знает, кому уже не нужно для ответа читать доки. Насколько я понимаю, это основная цель форума. Если Вы не хотите/не можете помочь, не отвечайте. А этим высокомерием очков себе не заработаете, наоборот. Или Вы хотите, чтобы ответы у Вас выпрашивали, желательно при этом подчёркивая собственное ничтожество? Уверять, что я не немного читал перед тем, как обратиться сюда, глупо. Вы и подобные Вам скажут, что читал недостаточно, не то и ещё что-нибудь подобное.pentium1024
Сообщение отредактировал pentium1024 - Воскресенье, 09.01.2022, 13:59
doober, спасибо. Это Вы уже неявно говорили. Осталось не понятным, почему, и почему работает, если нельзя. Про то, что один глупец может задать столько вопросов, что не смогут ответить сто мудрецов, не пишите, я знаю.
doober, спасибо. Это Вы уже неявно говорили. Осталось не понятным, почему, и почему работает, если нельзя. Про то, что один глупец может задать столько вопросов, что не смогут ответить сто мудрецов, не пишите, я знаю.pentium1024
недавно пришлось так делать, поделюсь - это лучше в отдельный модуль: [vba]
Код
Option Explicit #If Win64 Then Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" ( _ ByVal hwnd As Long, _ lpdwProcessId As Long) As Long #Else Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long #End If
Function KillProcess(hwnd As Long) Dim CurrentForegroundThreadID As Long Dim strComputer As String Dim objWMIService Dim colProcessList Dim objProcess Dim ProcIdXL As Long
ProcIdXL = 0 CurrentForegroundThreadID = GetWindowThreadProcessId(hwnd, ProcIdXL) If ProcIdXL = 0 Then Exit Function '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where ProcessID =" & ProcIdXL) For Each objProcess In colProcessList objProcess.Terminate Next End Function
Sub KillMe() KillProcess Application.hwnd End Sub
[/vba]
и запуск:
[vba]
Код
Sub Test2() MsgBox 1 Application.DisplayAlerts = False KillMe 'Application.Quit MsgBox 2 MsgBox 3 End Sub
[/vba]
больше нет вопросов к msgbox
недавно пришлось так делать, поделюсь - это лучше в отдельный модуль: [vba]
Код
Option Explicit #If Win64 Then Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" ( _ ByVal hwnd As Long, _ lpdwProcessId As Long) As Long #Else Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long #End If
Function KillProcess(hwnd As Long) Dim CurrentForegroundThreadID As Long Dim strComputer As String Dim objWMIService Dim colProcessList Dim objProcess Dim ProcIdXL As Long
ProcIdXL = 0 CurrentForegroundThreadID = GetWindowThreadProcessId(hwnd, ProcIdXL) If ProcIdXL = 0 Then Exit Function '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where ProcessID =" & ProcIdXL) For Each objProcess In colProcessList objProcess.Terminate Next End Function
Sub KillMe() KillProcess Application.hwnd End Sub
[/vba]
и запуск:
[vba]
Код
Sub Test2() MsgBox 1 Application.DisplayAlerts = False KillMe 'Application.Quit MsgBox 2 MsgBox 3 End Sub