Фокус на MgsBox, когда Excel не активен - PullRequest
0 голосов
/ 17 декабря 2018

Я проверил связанные вопросы, такие как этот или этот , но решения, по-видимому, не решают мою проблему.

Я выполняю сценарий VBAна моем компьютере.Выполнение сценария занимает несколько минут, и в ожидании я проверяю другие вещи на своем компьютере.Чтобы привлечь мое внимание после завершения работы скрипта, я добавил MsgBox в конце моего скрипта.Однако, так как Excel не активен / не выбран, когда сценарий завершается, я не вижу его - только когда я повторно активирую / выбираю Excel.

Как я могу выделить MsgBox, когда Excel неactive? Я уже пробовал следующие настройки, но они не работают:

  • ThisWorkbook.Activate :

    ...
    ThisWorkbook.Activate
    MsgBox "..."
    ...
    
  • AppActivate () (эта команда вызвала ошибку):

    ...
    AppActivate("Microsoft excel")
    MsgBox "..."
    ...
    

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Отказ от ответственности : Это не мой код, и я не знаю, кто автор.У меня был этот код в моей базе данных.

Введите ваш код в Sub Sample().Я показал, где вы можете вставить свой код.После запуска кода Excel будет мигать 5 раз.Вы можете изменить это число, изменив Private Const NumberOfFlashes = 5

Вставьте его в модуль.

Option Explicit

Private Type FLASHWINFO
    cbSize As Long
    Hwnd As Long
    dwFlags As Long
    uCount As Long
    dwTimeout As Long
End Type

Private Const FLASHW_STOP As Long = 0
Private Const FLASHW_CAPTION As Long = &H1
Private Const FLASHW_TRAY As Long = &H2
Private Const FLASHW_ALL As Long = (FLASHW_CAPTION Or FLASHW_TRAY)
Private Const FLASHW_TIMER As Long = &H4
Private Const FLASHW_TIMERNOFG As Long = &HC
Private FLASHW_FLAGS As Long

Private Declare Function LoadLibrary Lib "kernel32" _
Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long

Private Declare Function GetProcAddress Lib "kernel32" _
(ByVal hModule As Long, ByVal lpProcName As String) As Long

Private Declare Function FreeLibrary Lib "kernel32" _
(ByVal hLibModule As Long) As Long

Private Declare Function FlashWindowEx Lib "user32" _
(FWInfo As FLASHWINFO) As Boolean

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Const NumberOfFlashes = 5

Private Function APIFunctionPresent(ByVal FunctionName _
   As String, ByVal DllName As String) As Boolean

    Dim lHandle As Long
    Dim lAddr  As Long

    lHandle = LoadLibrary(DllName)
    If lHandle <> 0 Then
        lAddr = GetProcAddress(lHandle, FunctionName)
        FreeLibrary lHandle
    End If

    APIFunctionPresent = (lAddr <> 0)

End Function

Sub Sample()
    '
    ' Put your code here. Once that code finishes, Excel will FLASH
    '

    Dim udtFWInfo As FLASHWINFO

    If Not APIFunctionPresent("FlashWindowEx", "user32") Then Exit Sub

    With udtFWInfo
       .cbSize = Len(udtFWInfo)
       .Hwnd = Application.Hwnd
       .dwFlags = FLASHW_FLAGS Or FLASHW_TRAY
       .uCount = NumberOfFlashes
       .dwTimeout = 0
    End With

    Call FlashWindowEx(udtFWInfo)

    MsgBox "Done"
End Sub
0 голосов
/ 17 декабря 2018

Самый простой способ - это, вероятно, создать вместо этого пользовательскую форму, а затем установить фокус на нее при инициализации.

Код в пользовательской форме, отображаемый как модальный:

Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName _
    As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowPos Lib "User32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
    ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const FLAGS As Long = SWP_NOMOVE Or SWP_NOSIZE
Private Const HWND_TOPMOST = -1

Private Sub UserForm_Initialize()
    Dim hwnd As Long: hwnd = FindWindow(vbNullString, Me.Caption)
    If hwnd > 0 Then SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS   ' Set Modal
End Sub
0 голосов
/ 17 декабря 2018

Попробуйте:

Application.WindowState = xlMaximized
...