HSPとExcel VBAで情報取得 (その2)

1.概要

HSP3やExcel VBAによるCOMオブジェクトの活用事例としての第二弾です。 今回は、前回記事に引き続き、外部ファイルを任意の実行時モードで起動、ディレクトリ名を指定してエクスプローラを起動 するなどのサンプルを作成して紹介します。特殊フォルダのパス定義定数は0~21まであり、1つ1つのパスを取得・確認するために ボタンを配置して確認するようにしていますが、HSPとExcel VBAでは、等価の処理として記述するためにクリックしたボタン のボタンID(番号)で判別するようにしています。



2.サンプル

2-1.外部ファイルを任意の実行時モードで起動させる
HSPの標準命令では、exec命令という実行時のモードに応じたアプリケーションの起動ができる便利な命令があります。 これは、外部ファイルを指定された実行時のモードで起動させることができるものです。モードは次のものが指定できます。
    モード0 : HSPノーマル実行
    モード2 : 最小化モードで実行
    モード16 : 関連付けされたアプリケーションを実行
    モード32 : 指定したファイルを印刷する
このモードは、モード値を組合せて指定することもできますが、最大化した状態での起動や非表示での起動といったものができません。
ここでは、WSHの Runメソッドを利用して様々な実行時制御を実現させます。 また、プログラムの実行が終了するまでスクリプトを待機させるかどうかを示すブール値が指定できます。 HSPでは、newcom命令でWshShell変数をCOMオブジェクト型として初期化したのち、 Runメソッドで実行するコマンド ラインを示す文字列値である実行ファイルのファイル名を含む渡すべきパラメータを指定します。 そして、実行時モードの定数と、実行終了待ちをするかどうかのブール値を指定しています。 Runメソッドで指定できる実行時モードは、全部で11種類ありますが、サンプルにおいては主な6種類のモードを定義してあります。 実際の動作としては、メモ帳 (notepad.exe)を最大化状態で、かつ、終了実行待ちの状態で起動させます。

Runメソッドによる実行モード

モード意 味
0 タスクバーには表示されません。
 そのためウィンドウもありません。完全に非表示状態で起動します。
 この状態で起動した場合は通常はタスクマネージャから終了させることになります。
1 既定値です。直前に起動したときのウィンドウサイズで起動します。
 タスクバーにも表示されます。選択された状態で表示されます。
 ヘルプでは初回表示時はこの値を使うことを指定されています。
 (他の値を使っても問題はないように見えます)
2 最小化された状態で起動します。選択状態になります。
3 最大化された状態で起動します。選択状態になります。
4 直前に起動したときのウィンドウサイズで起動しますが、選択された状態にはなりません。
5 直前に起動したときのウィンドウサイズで起動します。タスクバーにも表示されます。
 選択された状態で表示されます。起動に関しては1と同じ挙動です。
6 最小化された状態で起動します。選択された状態にはなりませんがOSが持つウィンドウの
 表示順では現在アクティブになっているウィンドウの次の位置になります。
7 最小化された状態で起動します。選択された状態にはなりません。
8 直前に起動したときのウィンドウサイズで起動します。選択された状態にはなりません。
9 起動に関しては1と同じ挙動です。ヘルプでは最小化されたウィンドウ復元時には
 この値を使うことを指定されています。
10 アプリケーションの起動時の状態に依存します。

	;***** アプリケーションの起動 *****  
	#const WshHide              0  ; 非表示  
	#const WshNormalFocus       1  ; 通常サイズ  
	#const WshMinimizedFocus    2  ; 最小化  
	#const WshMaximizedFocus    3  ; 最大化  
	#const WshNormalNoFocus     4  ; 通常サイズかつ非フォーカス  
	#const WshMinimizedNoFocus  6  ; 最小化かつ非フォーカス  

	newcom WshShell, "WScript.Shell"  
	WshShell->"Run" "notepad.exe",WshMaximizedFocus, 1  
	delcom WshShell 
	stop
'***** アプリケーションの起動 *****  
Sub apprun()
    Dim wsh  As Object

    ' WshHide               0   : 非表示  
    ' WshNormalFocus        1   : 通常サイズ  
    ' WshMinimizedFocus     2   : 最小化  
    ' WshMaximizedFocus     3   : 最大化  
    ' WshNormalNoFocus      4   : 通常サイズかつ非フォーカス  
    ' WshMinimizedNoFocus   6   : 最小化かつ非フォーカス  

    Set wsh = CreateObject("Wscript.Shell")
    wsh.Run "notepad.exe", WshMaximizedFocus, True
End Sub

2-2.任意に指定したディレクトリ名を指定してエクスプローラを起動する
システムに予約されている特殊フォルダのパスを指定してエクスプローラを起動します。 WSHでは、特殊フォルダのパスは、0~21 までの定数値として持っています。この定数値を パラメータとして、Exploreメソッドから呼び出します。 HSPでは、newcom命令でShellApp変数をCOMオブジェクト 型として初期化したのち、 Exploreメソッドで配列で定義してある定数値をパラメータ として与えることにより実行します。
	;***** ディレクトリ名を指定してエクスプローラを起動 *****
	;***** ShellSpecialFolderConstants *****
	dim folmode,18
	folmode(0) = 0        ; ssfDESKTOP : デスクトップ(仮想)
	folmode(1) = 1        ; ssfIE :Internet Explorer
	folmode(2) = 2        ; ssfPROGRAMS : プログラム
	folmode(3) = 3        ; ssfCONTROLS : コントロールパネル
	folmode(4) = 4        ; ssfPRINTERS : プリンタ
	folmode(5) = 5        ; ssfPERSONAL : マイドキュメント
	folmode(6) = 6        ; ssfFAVORITES : お気に入り
	folmode(7) = 7        ; ssfSTARTUP :スタートアップ
	folmode(8) = 8        ; ssfRECENT : 最近使ったファイル
	folmode(9) = 9        ; ssfSENDTO : 送る
	folmode(10) = 10      ; ssfBITBUCKET : ごみ箱
	folmode(11) = 11      ; ssfSTARTMENU : スタートメニュー
	folmode(12) = 16      ; ssfDESKTOPDIRECTORY : デスクトップ(フォルダ)
	folmode(13) = 17      ; ssfDRIVES : マイコンピュータ
	folmode(14) = 18      ; ssfNETWORK : ネットワークコンピュータ
	folmode(15) = 19      ; ssfNETHOOD : NetHood
	folmode(16) = 20      ; ssfFONTS : フォント
	folmode(17) = 21      ; ssfTEMPLATES : テンプレート

	newcom ShellApp, "Shell.Application"

	onexit *owari
	font "Meiryo UI",14,0 : objmode 2
	objsize 300,26
	pos 40,5
	button " デスクトップ(仮想)     ",*execmode
	button " Internet Explorer      ",*execmode
	button " プログラム              ",*execmode
	button " コントロールパネル      ",*execmode
	button " プリンタ                ",*execmode
	button " マイドキュメント         ",*execmode
	button " お気に入り              ",*execmode
	button " スタートアップ          ",*execmode
	button " 最近使ったファイル      ",*execmode
	button " 送る                    ",*execmode
	button " ごみ箱                  ",*execmode
	button " スタートメニュー        ",*execmode
	button " デスクトップ(フォルダ)   ",*execmode
	button " マイコンピュータ        ",*execmode
	button " ネットワークコンピュータ  ",*execmode
	button " NetHood                 ",*execmode
	button " フォント                ",*execmode
	button " テンプレート            ",*execmode
	stop

*execmode
	objID = stat
	if objID=1 {
		dialog "Internet Explorerが既定でないと起動できません。"
	}
	ShellApp->"Explore" folmode(objID)
	stop

*owari
	;COMオブジェクト型で、有効なCOMオブジェクトを保持しているか
	if vartype(ShellApp)==6 {
		if varuse(ShellApp)==1 : delcom ShellApp
	}
	end
'***** デスクトップ(仮想) *****
Private Sub CommandButton1_Click()
    Call prcButtonClick(1)
End Sub

'***** Internet Explorer *****
Private Sub CommandButton2_Click()
    Call prcButtonClick(2)
End Sub

'***** プログラム *****
Private Sub CommandButton3_Click()
    Call prcButtonClick(3)
End Sub

'***** コントロールパネル *****
Private Sub CommandButton4_Click()
    Call prcButtonClick(4)
End Sub

'***** プリンタ *****
Private Sub CommandButton5_Click()
    Call prcButtonClick(5)
End Sub

'***** マイドキュメント *****
Private Sub CommandButton6_Click()
    Call prcButtonClick(6)
End Sub

'***** お気に入り *****
Private Sub CommandButton7_Click()
    Call prcButtonClick(7)
End Sub

'***** スタートアップ *****
Private Sub CommandButton8_Click()
    Call prcButtonClick(8)
End Sub

'***** 最近使ったファイル *****
Private Sub CommandButton9_Click()
    Call prcButtonClick(9)
End Sub

'***** 送る *****
Private Sub CommandButton10_Click()
    Call prcButtonClick(10)
End Sub

'***** ごみ箱 *****
Private Sub CommandButton11_Click()
    Call prcButtonClick(11)
End Sub

'***** スタートメニュー *****
Private Sub CommandButton12_Click()
    Call prcButtonClick(12)
End Sub

'***** デスクトップ(フォルダ) *****
Private Sub CommandButton13_Click()
    Call prcButtonClick(13)
End Sub

'***** マイコンピュータ *****
Private Sub CommandButton14_Click()
    Call prcButtonClick(14)
End Sub

'***** ネットワークコンピュータ *****
Private Sub CommandButton15_Click()
    Call prcButtonClick(15)
End Sub

'***** NetHood *****
Private Sub CommandButton16_Click()
    Call prcButtonClick(16)
End Sub

'***** フォント *****
Private Sub CommandButton17_Click()
    Call prcButtonClick(17)
End Sub

'***** テンプレート *****
Private Sub CommandButton18_Click()
    Call prcButtonClick(18)
End Sub

'***** ボタン番号判定 *****
Private Sub prcButtonClick(ByVal viBtnNo As Integer)
    Call folmode(viBtnNo)
End Sub

'***** ディレクトリ名を指定してエクスプローラを起動 *****
Sub folmode(ByVal viBtnNo As Integer)
    Dim ShellApp  As Object
    Dim folmode(18) As Integer

    '***** ShellSpecialFolderConstants *****
    folmode(1) = 0        ' ssfDESKTOP : デスクトップ(仮想)
    folmode(2) = 1        ' ssfIE : Internet Explorer
    folmode(3) = 2        ' ssfPROGRAMS : プログラム
    folmode(4) = 3        ' ssfCONTROLS : コントロールパネル
    folmode(5) = 4        ' ssfPRINTERS : プリンタ
    folmode(6) = 5        ' ssfPERSONAL : マイドキュメント
    folmode(7) = 6        ' ssfFAVORITES : お気に入り
    folmode(8) = 7        ' ssfSTARTUP :スタートアップ
    folmode(9) = 8        ' ssfRECENT : 最近使ったファイル
    folmode(10) = 9       ' ssfSENDTO : 送る
    folmode(11) = 10      ' ssfBITBUCKET : ごみ箱
    folmode(12) = 11      ' ssfSTARTMENU : スタートメニュー
    folmode(13) = 16      ' ssfDESKTOPDIRECTORY : デスクトップ(フォルダ)
    folmode(14) = 17      ' ssfDRIVES : マイコンピュータ
    folmode(15) = 18      ' ssfNETWORK : ネットワークコンピュータ
    folmode(16) = 19      ' ssfNETHOOD : NetHood
    folmode(17) = 20      ' ssfFONTS : フォント
    folmode(18) = 21      ' ssfTEMPLATES : テンプレート

    If viBtnNo = 2 Then
        MsgBox "Internet Explorerが既定でないと起動できません。"
    End If

    Set ShellApp = CreateObject("Shell.Application")
    ShellApp.Explore (folmode(viBtnNo))
    
    Set ShellApp = Nothing
End Sub

2-3.任意に指定したディレクトリ名を指定してマイコンピュータ形式で開く
システムに予約されている特殊フォルダのパスを指定してマイコンピュータ形式で開きま す。WSHでは、特殊フォルダのパスは、0~21 までの定数値として持っています。この定数 値をパラメータとして、Openメソッドから呼び出します。 HSPでは、newcom命令でShellApp変数をCOMオブジェクト 型として初期化したのち、 Openメソッドで#constで定義してある定数値をパラメータとし て与えることにより実行します。 処理は、エクスプローラを起動かマイコンピュータ形式かの違いだけです。
	;***** 任意のフォルダをマイコンピュータ形式で開く *****
	;***** ShellSpecialFolderConstants *****
	dim mycomp,18
	mycomp(0) = 0        ; ssfDESKTOP : デスクトップ(仮想)
	mycomp(1) = 1        ; ssfIE :Internet Explorer
	fmycomp(2) = 2       ; ssfPROGRAMS : プログラム
	mycomp(3) = 3        ; ssfCONTROLS : コントロールパネル
	mycomp(4) = 4        ; ssfPRINTERS : プリンタ
	mycomp(5) = 5        ; ssfPERSONAL : マイドキュメント
	mycomp(6) = 6        ; ssfFAVORITES : お気に入り
	mycomp(7) = 7        ; ssfSTARTUP :スタートアップ
	mycomp(8) = 8        ; ssfRECENT : 最近使ったファイル
	mycomp9) = 9         ; ssfSENDTO : 送る
	mycomp(10) = 10      ; ssfBITBUCKET : ごみ箱
	mycomp(11) = 11      ; ssfSTARTMENU : スタートメニュー
	mycomp(12) = 16      ; ssfDESKTOPDIRECTORY : デスクトップ(フォルダ)
	mycomp(13) = 17      ; ssfDRIVES : マイコンピュータ
	mycomp(14) = 18      ; ssfNETWORK : ネットワークコンピュータ
	mycomp(15) = 19      ; ssfNETHOOD : NetHood
	mycomp(16) = 20      ; ssfFONTS : フォント
	mycomp(17) = 21      ; ssfTEMPLATES : テンプレート

	newcom ShellApp, "Shell.Application"

	onexit *owari
	font "Meiryo UI",14,0 : objmode 2
	objsize 300,26
	pos 40,5
	button " デスクトップ(仮想)     ",*execmode
	button " Internet Explorer      ",*execmode
	button " プログラム              ",*execmode
	button " コントロールパネル      ",*execmode
	button " プリンタ                ",*execmode
	button " マイドキュメント         ",*execmode
	button " お気に入り              ",*execmode
	button " スタートアップ          ",*execmode
	button " 最近使ったファイル      ",*execmode
	button " 送る                    ",*execmode
	button " ごみ箱                  ",*execmode
	button " スタートメニュー        ",*execmode
	button " デスクトップ(フォルダ)   ",*execmode
	button " マイコンピュータ        ",*execmode
	button " ネットワークコンピュータ  ",*execmode
	button " NetHood                 ",*execmode
	button " フォント                ",*execmode
	button " テンプレート            ",*execmode
	stop

*execmode
	objID = stat
	if objID=1 {
		dialog "Internet Explorerが既定でないと起動できません。"
	}
	ShellApp->"Open" mycomp((objID)
	stop

*owari
	;▼COMオブジェクト型で、有効なCOMオブジェクトを保持しているか
	if vartype(ShellApp)==6 {
		if varuse(ShellApp)==1 : delcom ShellApp
	}
	end
'***** デスクトップ(仮想) *****
Private Sub CommandButton1_Click()
    Call prcButtonClick(1)
End Sub

'***** Internet Explorer *****
Private Sub CommandButton2_Click()
    Call prcButtonClick(2)
End Sub

'***** プログラム *****
Private Sub CommandButton3_Click()
    Call prcButtonClick(3)
End Sub

'***** コントロールパネル *****
Private Sub CommandButton4_Click()
    Call prcButtonClick(4)
End Sub

'***** プリンタ *****
Private Sub CommandButton5_Click()
    Call prcButtonClick(5)
End Sub

'***** マイドキュメント *****
Private Sub CommandButton6_Click()
    Call prcButtonClick(6)
End Sub

'***** お気に入り *****
Private Sub CommandButton7_Click()
    Call prcButtonClick(7)
End Sub

'***** スタートアップ *****
Private Sub CommandButton8_Click()
    Call prcButtonClick(8)
End Sub

'***** 最近使ったファイル *****
Private Sub CommandButton9_Click()
    Call prcButtonClick(9)
End Sub

'***** 送る *****
Private Sub CommandButton10_Click()
    Call prcButtonClick(10)
End Sub

'***** ごみ箱 *****
Private Sub CommandButton11_Click()
    Call prcButtonClick(11)
End Sub

'***** スタートメニュー *****
Private Sub CommandButton12_Click()
    Call prcButtonClick(12)
End Sub

'***** デスクトップ(フォルダ) *****
Private Sub CommandButton13_Click()
    Call prcButtonClick(13)
End Sub

'***** マイコンピュータ *****
Private Sub CommandButton14_Click()
    Call prcButtonClick(14)
End Sub

'***** ネットワークコンピュータ *****
Private Sub CommandButton15_Click()
    Call prcButtonClick(15)
End Sub

'***** NetHood *****
Private Sub CommandButton16_Click()
    Call prcButtonClick(16)
End Sub

'***** フォント *****
Private Sub CommandButton17_Click()
    Call prcButtonClick(17)
End Sub

'***** テンプレート *****
Private Sub CommandButton18_Click()
    Call prcButtonClick(18)
End Sub

'***** ボタン番号判定 *****
Private Sub prcButtonClick(ByVal viBtnNo As Integer)
    Call mycomp(viBtnNo)
End Sub

'***** 任意のフォルダをマイコンピュータ形式で開く *****
Sub mycomp(ByVal viBtnNo As Integer)
    Dim ShellApp  As Object
    Dim mycomp(18) As Integer

    '***** ShellSpecialFolderConstants *****
    mycomp(1) = 0        ' ssfDESKTOP : デスクトップ(仮想)
    mycomp(2) = 1        ' ssfIE : Internet Explorer
    mycomp(3) = 2        ' ssfPROGRAMS ; プログラム
    mycomp(4) = 3        ' ssfCONTROLS : コントロールパネル
    mycomp(5) = 4        ' ssfPRINTERS : プリンタ
    mycomp(6) = 5        ' ssfPERSONAL : マイドキュメント
    mycomp(7) = 6        ' ssfFAVORITES : お気に入り
    mycomp(8) = 7        ' ssfSTARTUP :スタートアップ
    mycomp(9) = 8        ' ssfRECENT : 最近使ったファイル
    mycomp(10) = 9       ' ssfSENDTO : 送る
    mycomp(11) = 10      ' ssfBITBUCKET : ごみ箱
    mycomp(12) = 11      ' ssfSTARTMENU : スタートメニュー
    mycomp(13) = 16      ' ssfDESKTOPDIRECTORY : デスクトップ(フォルダ)
    mycomp(14) = 17      ' ssfDRIVES : マイコンピュータ
    mycomp(15) = 18      ' ssfNETWORK : ネットワークコンピュータ
    mycomp(16) = 19      ' ssfNETHOOD : NetHood
    mycomp(17) = 20      ' ssfFONTS : フォント
    mycomp(18) = 21      ' ssfTEMPLATES : テンプレート

    If viBtnNo = 2 Then
        MsgBox "Internet Explorerが既定でないと起動できません。"
    End If

    Set ShellApp = CreateObject("Shell.Application")
    ShellApp.Open (mycomp(viBtnNo))
    
    Set ShellApp = Nothing
End Sub

3.ソースコードについて

掲載ソースコードのライセンスは、CC0 (クレジット表示不要、改変可、商用可) とします。自由に利用して頂いてかまいません。 尚、データの取得やプログラム実行において損害等が生じた場合は、筆者は一切の責任も負いません。全て自己責任でお願いします。

■関連記事
・HSPとExcel VBAで情報取得 (COMオブジェクトの活用)
・HSPとExcel VBAで情報取得 (その1)
・HSPとExcel VBAで情報取得 (その3)
・HSPとExcel VBAで情報取得 (その4)

コメント

このブログの人気の投稿

Excelアドインで日本語形態素解析

階層構造JSONファイルの作成

HSPでコマンドプロンプトを制御する

TOP