エクセルVBAでWindows APIのShowWindowAsync関数を利用する方法について解説しています。
ShowWindowAsync関数は指定されたウインドウの表示状態を設定するAPI関数です。
まずAPI(Application Programming Interface)とは、アプリケーションからOSやプログラム言語を操作するためのライブラリです。例えば、APIを利用してファイル制御やウインドウ制御などの処理を行うことが出来ます。そして、Windows APIですが、こちらはMicrosoft WindowsのAPIのことを指します。Windows APIは、Windowsのバージョン毎に拡張されており、16ビットは「Win16 API」32ビットは「Win32 API」と呼ばれます。
ShowWindowAsync関数は、指定されたウインドウの表示状態を設定するAPI関数です。
構文 | ShowWindowAsync(hWnd, nCmdShow) | ||||
---|---|---|---|---|---|
引数 | 省略 | 説明 | |||
hWnd | × | ウィンドウのハンドルを指定します。 | |||
nCmdShow | × | ウィンドウの表示方法を指定します。アプリケーションがほかのプログラムから 構造体を渡して起動された場合、初めて ShowWindow 関数を呼び出したときには、このパラメータは無視されます。構造体が渡されていない場合、ShowWindow 関数を初めて呼び出すときには、WinMain 関数の nCmdShow パラメータで取得した値を指定してください。以降の呼び出しでは、次のいずれかの値を指定できます。 |
戻り値は設定前にウィンドウが可視だった場合、0 以外の値が返ります。設定前にウィンドウが隠れていた場合、0 が返ります。
値 | 意味 |
SW_FORCEMINIMIZE | Windows 2000:たとえウィンドウを所有するスレッドがハングしていても、ウィンドウを最小化します。このフラグは、ほかのスレッドのウィンドウを最小化する場合にだけ使用してください。 |
SW_HIDE | ウィンドウを非表示にし、他のウィンドウをアクティブにします。 |
SW_MAXIMIZE | ウィンドウを最大化します。 |
SW_MINIMIZE | ウィンドウを最小化し、Z オーダーが次のトップレベルウィンドウをアクティブにします。 |
SW_RESTORE | ウィンドウをアクティブにして表示します。最小化または最大化されていたウィンドウは、元の位置とサイズに戻ります。最小化されているウィンドウを元に戻す場合は、このフラグをセットします。 |
SW_SHOW | ウィンドウをアクティブにして、現在の位置とサイズで表示します。 |
SW_SHOWDEFAULT | アプリケーションを起動したプログラムが 関数に渡した 構造体で指定された SW_ フラグに従って表示状態を設定します。 |
SW_SHOWMAXIMIZED | ウィンドウをアクティブにして、最大化します。 |
SW_SHOWMINIMIZED | ウィンドウをアクティブにして、最小化します。 |
SW_SHOWMINNOACTIVE | ウィンドウを最小化します。 SW_SHOWMINIMIZED と似ていますが、この値を指定した場合は、ウィンドウはアクティブ化されません。 |
SW_SHOWNA | ウィンドウを現在のサイズと位置で表示します。 SW_SHOW と似ていますが、この値を指定した場合は、ウィンドウはアクティブ化されません。 |
SW_SHOWNOACTIVATE | ウィンドウを直前の位置とサイズで表示します。 SW_SHOWNORMAL と似ていますが、この値を指定した場合は、ウィンドウはアクティブ化されません。 |
SW_SHOWNORMAL | ウィンドウをアクティブにして表示します。ウィンドウが最小化または最大化されていた場合は、その位置とサイズを元に戻します。初めてウィンドウを表示するときには、このフラグを指定してください。 |
#If VBA7 Then
Private Declare PtrSafe Sub ShowWindowAsync Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub ShowWindowAsync Lib "kernel32" (ByVal ms As Long)
#End If
※ドラッグ(スワイプ)すると全体を確認できます。
こちらはShowWindowAsync関数を利用するためのAPI宣言になります。API宣言ShowWindowAsync関数を利用しますという宣言で必ず記述します。ここで注意点がありますが、API宣言を「IF~Thenステートメント」で分岐させているのが分かるかと思います。これは、office2010で64bit(ビット)版の場合は書き方が異なるため、「IF~Thenステートメント」でそれぞれAPI宣言をしています。手元のPC環境に合わせた書き方でも大丈夫ですが、汎用性を持たせるための記述になりますので、追記しておきましょう。
参考元は「32ビット版のOffice2010プログラムでVBAマクロを編集すると・・・」になりますので、一度確認してください。
もう1つ注意する点はShowWindowAsync関数を利用している間は、EXCEL操作は一切行えません。処理中でも操作できるようにするには、DoEvents関数を利用する必要があります。こちらはWindowsに制御を移してくれる関数でループ処理などで利用する場合、プログラムが固まることがなくなります。
また、宣言ステートメントは、最初のプロシージャ宣言の前に配置する必要がありますので、一番上に記述してください。
ShowWindowAsync関数を利用して時間を止めます。
こちらのサンプルコードは処理をするとShowWindowAsync関数で3秒間処理を停止し、その後にメッセージボックスを表示させるマクロになります。
#If VBA7 Then
Private Declare PtrSafe Sub ShowWindowAsync Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub ShowWindowAsync Lib "kernel32" (ByVal ms As Long)
#End If
Sub sample()
ShowWindowAsync 3000
msgBox "3秒間処理を止めました。"
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
3秒後にメッセージボックスが表示されます。
ShowWindowAsync関数は、IE(InternetExplorer)を操作する上で必ず利用されるものです。ほとんどのコンテンツで利用されていますので、ここでは代表的なコンテンツを紹介します。
↑ExcelのVBA全般について分からない事があればこちらの掲示板よりご質問ください。
VBAのIE操作入門↑ExcelのVBAをマスターできたら、エクセルVBAのIE操作にも挑戦してみてください。
こちらでは、エクセルVBAの事例で利用したステートメントをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。
こちらでは、エクセルVBAの事例で利用したオブジェクトをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。
こちらでは、エクセルVBAの事例で利用したオブジェクトのプロパティをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。
こちらでは、エクセルVBAの事例で利用したオブジェクトのメソッドをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。
こちらでは、エクセルVBAの事例で利用したオブジェクトのイベントをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。