Тут случайно наткнулся на Киберфоруме на очень, имхо, полезную процедуру, написанную Казанский ещё в марте 2014 и почему-то не показанную ни здесь, ни на Планете... Это функция MsgBoxEx - практически полный (за исключением никому не нужных опций [, helpfile, context]) функциональный аналог всеми применяемого MsgBox , но с возможностью указать время, через которое он закроется автоматически и продолжение вызвавшей его процедуры продолжится. Я его функцию чуть покрутил, навёл красоты, комменты сделал на русском и утащил к себе в копилку. НАСТОЯТЕЛЬНО рекомендую:
[vba]
Код
Public Function MsgBoxEx(Prompt, Optional Buttons As VbMsgBoxStyle = 0, Optional Title, Optional TimeOut = 0) As VbMsgBoxResult '--------------------------------------------------------------------------------------- ' Procedure : MsgBoxEx ' Purpose : MsgBox с таймаутом (используется метод Popup WScript.Shell) ' Создаёт .VBS-файл во временной папке, запускает его, возвращает коды результата, удаляет временный файл ' Arguments : Первые 3 аргумента такие же, как у MsgBox, 4-й - таймаут в секундах. ' Если 4-й аргумент не задан или <=0, то ожидает ввода пользователя как обычный MsgBox ' Ret.Value : Такие же, как у Msgbox, но возвращает -1 по истечении таймаута. ' Errors : Возвращает ошибку 735 - "Can't save file to TEMP" если временная папка не доступна ' Author : Казанский, [email]exceleved@yandex.ru[/email] ' URL : http://www.cyberforum.ru/post5874942.html ' Date : 09.03.2014 '--------------------------------------------------------------------------------------- Dim sTmp$, ff% With CreateObject("WScript.Shell") sTmp = Environ("temp") If sTmp = "" Then sTmp = Environ("tmp") If sTmp = "" Then sTmp = .SpecialFolders("MyDocuments") If sTmp = "" Then Err.Raise 735, "MsgBoxEx", "Can't save file to TEMP" End If End If sTmp = sTmp & Format$(Now, """\~MsgBoxEx""YYYYMMDDHHMMSS"".vbs""") 'уникальное имя файла ff = FreeFile If IsMissing(Title) Then Title = "" Prompt = Str2Code(Prompt): TimeOut = Int(TimeOut): Title = Str2Code(Title): Buttons = Int(Buttons) Open sTmp For Output As ff Print #ff, "WScript.Quit CreateObject(""WScript.Shell"").Popup (""" & Prompt & """, " & TimeOut & ", """ & Title & """, " & Buttons & ")" ' Popup(<Text>,<SecondsToWait>,<Title>,<Type>) ' http://www.script-coding.com/WSH/WshShell.html#3.2. Close #ff MsgBoxEx = .Run(sTmp, 0, True) ' Run(<Command>,<WindowStyle>,<WaitOnReturn>) ' http://www.script-coding.com/WSH/WshShell.html#3.4. End With On Error Resume Next Kill sTmp End Function Private Function Str2Code$(sTxt) ' заменить CR+LF, LF+CR, CR, LF на " & vblf & " для использования в VBS Str2Code = Replace(Replace(Replace(Replace(Replace(sTxt, """", """"""), vbCrLf, vbLf), vbLf & vbCr, vbLf), vbCr, vbLf), vbLf, """ & vblf & """) End Function
[/vba]
Тут случайно наткнулся на Киберфоруме на очень, имхо, полезную процедуру, написанную Казанский ещё в марте 2014 и почему-то не показанную ни здесь, ни на Планете... Это функция MsgBoxEx - практически полный (за исключением никому не нужных опций [, helpfile, context]) функциональный аналог всеми применяемого MsgBox , но с возможностью указать время, через которое он закроется автоматически и продолжение вызвавшей его процедуры продолжится. Я его функцию чуть покрутил, навёл красоты, комменты сделал на русском и утащил к себе в копилку. НАСТОЯТЕЛЬНО рекомендую:
[vba]
Код
Public Function MsgBoxEx(Prompt, Optional Buttons As VbMsgBoxStyle = 0, Optional Title, Optional TimeOut = 0) As VbMsgBoxResult '--------------------------------------------------------------------------------------- ' Procedure : MsgBoxEx ' Purpose : MsgBox с таймаутом (используется метод Popup WScript.Shell) ' Создаёт .VBS-файл во временной папке, запускает его, возвращает коды результата, удаляет временный файл ' Arguments : Первые 3 аргумента такие же, как у MsgBox, 4-й - таймаут в секундах. ' Если 4-й аргумент не задан или <=0, то ожидает ввода пользователя как обычный MsgBox ' Ret.Value : Такие же, как у Msgbox, но возвращает -1 по истечении таймаута. ' Errors : Возвращает ошибку 735 - "Can't save file to TEMP" если временная папка не доступна ' Author : Казанский, [email]exceleved@yandex.ru[/email] ' URL : http://www.cyberforum.ru/post5874942.html ' Date : 09.03.2014 '--------------------------------------------------------------------------------------- Dim sTmp$, ff% With CreateObject("WScript.Shell") sTmp = Environ("temp") If sTmp = "" Then sTmp = Environ("tmp") If sTmp = "" Then sTmp = .SpecialFolders("MyDocuments") If sTmp = "" Then Err.Raise 735, "MsgBoxEx", "Can't save file to TEMP" End If End If sTmp = sTmp & Format$(Now, """\~MsgBoxEx""YYYYMMDDHHMMSS"".vbs""") 'уникальное имя файла ff = FreeFile If IsMissing(Title) Then Title = "" Prompt = Str2Code(Prompt): TimeOut = Int(TimeOut): Title = Str2Code(Title): Buttons = Int(Buttons) Open sTmp For Output As ff Print #ff, "WScript.Quit CreateObject(""WScript.Shell"").Popup (""" & Prompt & """, " & TimeOut & ", """ & Title & """, " & Buttons & ")" ' Popup(<Text>,<SecondsToWait>,<Title>,<Type>) ' http://www.script-coding.com/WSH/WshShell.html#3.2. Close #ff MsgBoxEx = .Run(sTmp, 0, True) ' Run(<Command>,<WindowStyle>,<WaitOnReturn>) ' http://www.script-coding.com/WSH/WshShell.html#3.4. End With On Error Resume Next Kill sTmp End Function Private Function Str2Code$(sTxt) ' заменить CR+LF, LF+CR, CR, LF на " & vblf & " для использования в VBS Str2Code = Replace(Replace(Replace(Replace(Replace(sTxt, """", """"""), vbCrLf, vbLf), vbLf & vbCr, vbLf), vbCr, vbLf), vbLf, """ & vblf & """) End Function
У меня в загашнике валяется вот такая. Не помню уже откуда. Дата файла 24.11.2015. Правда, ее нужно под 64бит переделать [vba]
Код
Private Declare Function MessageBoxTimeOut Lib "user32" Alias "MessageBoxTimeoutA" (ByVal hWnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal uType As VbMsgBoxStyle, ByVal wLanguageId As Long, ByVal dwMilliseconds As Long) As Long
Sub Дел() Range("B5:E85").ClearContents MessageBoxTimeOut Application.hWnd, "Пример Messagebox'а с таймаутом", "Автоматически закроется через 3 секунды", vbInformation + vbOKOnly, 0&, 3000 End Sub
[/vba]
У меня в загашнике валяется вот такая. Не помню уже откуда. Дата файла 24.11.2015. Правда, ее нужно под 64бит переделать [vba]
Код
Private Declare Function MessageBoxTimeOut Lib "user32" Alias "MessageBoxTimeoutA" (ByVal hWnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal uType As VbMsgBoxStyle, ByVal wLanguageId As Long, ByVal dwMilliseconds As Long) As Long
Sub Дел() Range("B5:E85").ClearContents MessageBoxTimeOut Application.hWnd, "Пример Messagebox'а с таймаутом", "Автоматически закроется через 3 секунды", vbInformation + vbOKOnly, 0&, 3000 End Sub
Саша, прелесть кода Казанского в том, что его можно использовать как функцию точно так же, как MsgBox , с подсказками по мере ввода и использованием тех же констант. Да и в декларациях не надо API-функцию прописывать.
Саша, прелесть кода Казанского в том, что его можно использовать как функцию точно так же, как MsgBox , с подсказками по мере ввода и использованием тех же констант. Да и в декларациях не надо API-функцию прописывать.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Пятница, 27.01.2017, 15:28
Private Declare PtrSafe Function MessageBoxTimeOut Lib "user32" Alias "MessageBoxTimeoutA" (ByVal hWnd As LongPtr, ByVal Message As String, ByVal Caption As String, ByVal uType As VbMsgBoxStyle, ByVal wLanguageId As Long, ByVal Milliseconds As Long) As Long
Private Declare PtrSafe Function MessageBoxTimeOut Lib "user32" Alias "MessageBoxTimeoutA" (ByVal hWnd As LongPtr, ByVal Message As String, ByVal Caption As String, ByVal uType As VbMsgBoxStyle, ByVal wLanguageId As Long, ByVal Milliseconds As Long) As Long