アフィリエイト広告を利用しています


[ PR ]


検索
<< 2024年03月 >>
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
最新記事
カテゴリーアーカイブ
写真ギャラリー
プロフィール
あどのまつりさんの画像
あどのまつり
プロフィール
ファン


[ PR ]


2020年10月19日

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

2021.12.09追記
Wordpressでこの記事で使っているAPI-MSGBOXを表示し、UWSCで1秒後に自動的にOKを押すという記事を書いたので、ココにも更新しておく。


「VBA ExcelVBAでMessageBoxを最前面表示し1秒後OKを押す」


以下・・・本文

私が自作しているコピペツールは元々手動でExcelシートにWebから貼付けをしていた挙動をそのままUWSCに置き換えてExcelVBAでシートにコピペするように作成したので、とてもプログラミング的な動きではない!

初めからプログラミングを意識するなら、WebからのコピペをテキストデータもしくはCSV形式でファイルに保存して、後から編集でExcelもしくはAccessで表形式にデータ形式を整えデータベース投入するという手法が一般的だと思うが、なにぶん馬券購入しながらのプログラム作成になった為、ちょっとずつ作業を自動化するという方法を取った。もちろん手動でやっていたことをプログラミングするだけなので、コピペ作業のプログラミングは簡単なモノで良く、また先行で作成していたコピペ後のデータベース投入までは今までのExcelやAccessで作成したモノがそのまま使えるというメリットとその過程で作成される成果物がそのままブログで使用できるという効果もある。

ただプログラムとしてはやはり継ぎ接ぎなので、どうしてもUWSCとExcelVBAの切替部分でのタイムラグが発生する場合があり、SleepやWaitでは回避できないプログラミングの弱点があるのも確かだ。ここでMSGBOXを利用して、WAIT状態を作りツールの切替時(今回だとUWSCの起動時にMSGBOXを挟むことで)にMSGBOXで一旦止めてから次の処理に移ると、ほぼタイムラグの発生の問題は改善されるので、無駄なSleep命令を入れなくても快適に動くことが分かった。ただWeb表示の最前面に表示することはできない。

処理はちゃんと止まるので、ExcelやAccessを手動で表示切替すればメッセージが表示される。ここから処理を再開しすれば良いのだが、できればMSGBOXを最前面に表示し手動切替のワンクリックは省きたい。

EXCEL VBAでMessageBoxを表示させると

Sub test_VBAmsgbox()
Dim RET As Variant

'VBA MSGBOX TEST
RET = MsgBox("vba-message", vbOKOnly, "vba-title")
End Sub


※これでも良いが、ExcelシートからUWSCやPythonを使ってChromeを起動しコピペを行えばウィンドウにはChromeでWeb画面が表示されておりメッセージ(MessageBox)は隠れてしまう。Web画面の上にメッセージ表示するようにしたい。

こんな時用にAPIのMessageBoxを使えるようにVBAで関数化しておけば、メッセージをトップ表示したいときはこの関数を使えば良いということになる。(これはググれば例文は簡単に見つかるので現行のVBAで使用できるようにちょっとだけ変更して使用する)

'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")

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


但し、、、
これだと半自動が限界であり、完全自動化するにはPythonだけで組みなおす方がベターな気はするが・・・
私の使い方だと、そろそろJRA-VANデータラボを投入した方が良いのか?と思えてきた。
早速明日準備してみようかな?と思っている。これで更にブログネタが増えるかも知れないね〜( ̄▽ ̄)

ちなみに秋華賞は、まったくダメでしたね〜私の本命馬マイティは・・・どこへ〜
それでは、またね〜
posted by あどのまつり at 02:47 | EXCEL