Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Application.Quit - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Application.Quit (Макросы/Sub)
Application.Quit
pentium1024 Дата: Воскресенье, 09.01.2022, 13:55 | Сообщение № 21
Группа: Пользователи
Ранг: Новичок
Сообщений: 34
Репутация: 0 ±
Замечаний: 20% ±

2016
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 - Воскресенье, 09.01.2022, 13:59
 
Ответить
Сообщение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
Дата добавления - 09.01.2022 в 13:55
doober Дата: Воскресенье, 09.01.2022, 15:13 | Сообщение № 22
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Потому, что в событии Workbook_BeforeClose нельзя вызывать ThisWorkbook.Close (False)


 
Ответить
СообщениеПотому, что в событии Workbook_BeforeClose нельзя вызывать ThisWorkbook.Close (False)

Автор - doober
Дата добавления - 09.01.2022 в 15:13
pentium1024 Дата: Воскресенье, 09.01.2022, 15:19 | Сообщение № 23
Группа: Пользователи
Ранг: Новичок
Сообщений: 34
Репутация: 0 ±
Замечаний: 20% ±

2016
doober, спасибо.
Это Вы уже неявно говорили. Осталось не понятным, почему, и почему работает, если нельзя.
Про то, что один глупец может задать столько вопросов, что не смогут ответить сто мудрецов, не пишите, я знаю.
 
Ответить
Сообщениеdoober, спасибо.
Это Вы уже неявно говорили. Осталось не понятным, почему, и почему работает, если нельзя.
Про то, что один глупец может задать столько вопросов, что не смогут ответить сто мудрецов, не пишите, я знаю.

Автор - pentium1024
Дата добавления - 09.01.2022 в 15:19
RAN Дата: Воскресенье, 09.01.2022, 16:06 | Сообщение № 24
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
в событии Workbook_BeforeClose нельзя вызывать ThisWorkbook.Close (False)

Правильно. Можно
[vba]
Код
ThisWorkbook.Close False
[/vba]
:p


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
в событии Workbook_BeforeClose нельзя вызывать ThisWorkbook.Close (False)

Правильно. Можно
[vba]
Код
ThisWorkbook.Close False
[/vba]
:p

Автор - RAN
Дата добавления - 09.01.2022 в 16:06
Саня Дата: Вторник, 11.01.2022, 03:33 | Сообщение № 25
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
зачем я здесь в это время? %)
ПРИВЕТ!

[vba]
Код
Sub Test2()
    MsgBox 1
    Application.DisplayAlerts = False
    Application.Quit
    MsgBox 2
    DoEvents
    MsgBox 3
    Stop
End Sub
[/vba]


Сообщение отредактировал Саня - Вторник, 11.01.2022, 03:36
 
Ответить
Сообщениезачем я здесь в это время? %)
ПРИВЕТ!

[vba]
Код
Sub Test2()
    MsgBox 1
    Application.DisplayAlerts = False
    Application.Quit
    MsgBox 2
    DoEvents
    MsgBox 3
    Stop
End Sub
[/vba]

Автор - Саня
Дата добавления - 11.01.2022 в 03:33
pentium1024 Дата: Вторник, 11.01.2022, 08:33 | Сообщение № 26
Группа: Пользователи
Ранг: Новичок
Сообщений: 34
Репутация: 0 ±
Замечаний: 20% ±

2016
RAN, Некоторые учебники велят ставить скобки.

Саня, ай, как хорошо! Спасибо.
Stop лишний.
 
Ответить
СообщениеRAN, Некоторые учебники велят ставить скобки.

Саня, ай, как хорошо! Спасибо.
Stop лишний.

Автор - pentium1024
Дата добавления - 11.01.2022 в 08:33
Саня Дата: Вторник, 11.01.2022, 13:49 | Сообщение № 27
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
Stop лишний.


по моему мнению, там все строчки лишние :)

а стоп я поставил, чтобы показать, что она недостижима (при условии, если нет дуЕвентса)
msgbox'ы блокируют поток, .quit не может завершиться

попробуйте пройти код пошагово
 
Ответить
Сообщение
Stop лишний.


по моему мнению, там все строчки лишние :)

а стоп я поставил, чтобы показать, что она недостижима (при условии, если нет дуЕвентса)
msgbox'ы блокируют поток, .quit не может завершиться

попробуйте пройти код пошагово

Автор - Саня
Дата добавления - 11.01.2022 в 13:49
Саня Дата: Вторник, 11.01.2022, 14:04 | Сообщение № 28
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
недавно пришлось так делать, поделюсь - это лучше в отдельный модуль:
[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
[/vba]

больше нет вопросов к msgbox

Автор - Саня
Дата добавления - 11.01.2022 в 14:04
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Application.Quit (Макросы/Sub)
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!