【Excel】VBAでMessageBoxを最前面表示し1秒後OKを押す方法

目次

Windows-API のMessageBoxを利用すると最前面表示できる

  1. MessageBoxを最前面表示させる
  2. Enterキーを押すUWSCプログラムを作成する
  3. 動作テスト

ExcelVBA でWindows-APIのMessageBoxを使うサンプル

'APIのMessageBox利用指定
Declare PtrSafe Function MessageBox Lib "user32.dll" Alias _
 "MessageBoxA" (ByVal hWnd As Long, ByVal msgC As String, ByVal msgT As String, ByVal uType As Long) _
 As Long
'OKボタンフラグ
Public Const MB_OK = &H0
'最前面フラグ
Public Const MB_TOPMOST = &H40000

Sub test_APImsgbox()
    Dim RET As Variant
    'API MSGBOX TEST
    RET = TopMostMsgBox("message", "title")
    'VBA MSGBOX TEST
    RET = MsgBox("vba-message", vbOKOnly, "vba-title")
End Sub

Function TopMostMsgBox(c, t)

    Dim msgT As String
    Dim msgC As String

    msgT = t
    msgC = c

    MessageBox 0, msgC, msgT, MB_OK Or MB_TOPMOST

End Function

test_APImsgbox を何か適当なWEB表示をして、実行してみると

TopMostMsgBox はメッセージボックスが最前面に表示されるが

MsgBox ではExcelを表示させないとメッセージが表示されないといった現象が起きる。

UWSCでコピペ作業をする場合にメッセージを表示させて、プログラム動作の通過ポイントを確認する場合には、 TopMostMsgBox を利用しWeb表示を確実にしてから次の操作に移るといった感じ、で

ExcelVBAとの連動を行うと、テストしながらプロトタイプ完成まで可視化できるので、私は良く使う手法だが、時間的には待ち時間が増えるというデメリットもあるので、短時間に処理を行う必要のあるシステム作成には不向きな組み方ではある。

下記に私が毎週使用している出馬表作成で TopMostMsgBox を使用して自動的に「OK」をEnterキー押下するVBAをサンプルとして記載する。

UWSC で TopMostMsgBox 表示した「OK」を自動で押す

TopMostMsgBox でMessageBoxを表示させて、UWSCの「記録」機能で保存した.uwsを編集すれば良いだけだが、汎用的に使いたいのでタイトルをUWSCで掴めるように変数にしている。

UWSC 「APIMSGENTER1.uws」を作成

PAR1="""" + PARAM_STR[0] + """"
ACW(GETID(PAR1,"#32770"),885,481,167,133,0)
SLEEP(1)
BTN(LEFT,CLICK,968,505)
KBD(VK_RETURN,CLICK,100)

PAR1にExcelVBAで設定するMessageBoxのタイトルを変数で渡すことで、1秒後にMessageBoxの「OK」をEnterキーで押すというプログラムが作成できる。

SLEEP(1)を(3)にすれば3秒後にEnterを押すという風に変更できるので、Web表示をするタイミングを考慮してこのプログラムを作成すれば良い。私は APIMSGENTER1.uws と APIMSGENTER8.uws をよく使っている。

SLEEP(n)として引数で渡せば、更に汎用性は増すが私の場合は1と8しかほぼ使わないので、待ち時間は固定にして.UWSを2つ作成している。

↓実際に「出馬表」のコピペExcelVBAの使用部分を抜粋しておくので、参考にしてほしい。

出馬表のヘッダーをコピペする箇所を抜粋

Sub SYUSOU_SELCPY()
'抜粋

''' UWSCの実行:クリップボードにヘッダーをコピぺ

    WSH.Run uwscPATH & "UWSC.exe" & " " & uwscfPATH & _
     "APIMSGENTER1.UWS" & " " & "SYUSOU2M.uws実行前", 8, False
    RET = TopMostMsgBox( _
     "出走データ作成!ブラウザが完全に表示されるまで待つこと!", _
     "SYUSOU2M.uws実行前")
    
    WSH.Run uwscPATH & "UWSC.exe" & " " & uwscfPATH & _
     "SYUSOU2M.uws" & " " & wk_nm2, 3, True

    If Not CB_CHK Then Exit Sub
'''
  • “SYUSOU2M.uws実行前”, 8, False

ここがポイントになる。先にEnterを押してからメッセージボックスを表示させるといったテクニックだが、なぜ?と疑わずこうやれば動くんだな!?的な感じで良い。

UWSCの各構文については、[UWSC HELP] を活用して下さいませ。

編集後記

  • ExcelVBAからAPIのMSGBOXを使い最前面に表示し処理待ちをする

以前同じネタを無料ブログで掲載しているが、この時はJRAホームページを
最前面 [TOPMOST] で表示せずに
[Active] でいけるはずと思い込んでいたので

メッセージボックスだけ最前面にする方法を思いつき記事にしている。

ここから更に [Enter]キーを自動で押すことに挑戦し、Webを最前面にすれば全て上手くいくかな?
というところまで辿り着くのに1年ほど経過した次第だ!

ExcelVBAとUWSCを使ってExcelシートにWeb内容をコピペする場合
手作業でやる順序そのままを書き写す感じで実行できるので
デバッグはやり易いが、裏で動かすといったことをやるなら他のRPAを考えた方が良い。

JRAホームページはデータベースを検索した結果を都度表示しているwebサイトなので、私の今の知識だと
UWSC+ExcelVBA が一番早く自作データベースが作成できると考え、システム開発した。

2022.9.5(Mon)現在では、「調教+前走レース内容+実績を重視したマニュアル予想」がほとんどなので
自作競馬データベース構築当時考えていた、「完全自動化馬券購入システムによるプラス収支」とまでは
行き切っていないが、少なくとも30を超える検証用サブシステムを作成し今のところ、ほぼ全てでゴミ化
しているといった結果だ ❣ そんなに簡単にバクチで金は儲からないのである。。。( ̄▽ ̄)

それでは、またね~😎

この記事を書いた人

マクロで半自動化!GO!GO!!PROGRAMMING
管理人:あどのまつり
馬齢:牡50代(後)✖1

2023年はコロナ明けでタイ旅行にいきThai!!

目次