パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)
他のアプリケーションの起動(API関数,OLE,DDE)
前回は、Shell関数による他のアプリケーションの起動について、触れました。
今回は、他の方法でアプローチしてみます。方法としては、API関数(ShellExecute)の利用、
OLEオートメーション(CreateObject関数)の利用、DDEの利用の3パターンがあります。
1 API関数(ShellExecute)
他のアプリケーションの起動という意味では、API関数 ShellExecute を利用するのが一番簡潔
かつ強力かもしれません。
API関数というのは、Windowsに用意されたシステムコールといったらよいでしょうか。API関数の
コールによりWindowsの提供する様々な機能を直接利用することができます。
API関数のなんたるかについては、また、別の機会に触れたいと思います。
| [宣言] Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _ (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _ ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long)_ As Long [パラメータ] hwnd ウィンドウハンドル lpOperation オペレーションの指定 "open" lpFileで指定されるファイルを開く "print" 印刷する IpFile ファイル名 lpParameters lpFileが実行ファイルの場合、実行ファイルに渡すパラメータの文字列 lpDirectory デフォルトディレクトリへのパス nShowCmd 起動したプログラムをどのように見せるかを指定する定数 戻り値 正常に実行された場合は32より大きな数 |
Shellexecute
でデータファイルを指定すると、拡張子に関連づけられたアプリが自動起動します。
例えば .doc ファイルを指定すると、Wordが立ち上がります。
必要な部分のコードを掲載します。以下のコードは おじさん作のBrouwse.xls(ver0.1.0)からの
抜粋です。Brouwse.xlsは「EXCEL自作アプリ」からダウンロードできますので、参考にして下さい
Brouwse.xlsではEXCELのシートにファイル名がフルパスで表示されます。
その中のひとつのセルを選択して、「ファイルを開く」ボタンを押すと、下のコードのSub
ボタン16_Click()が
実行されます。Selection
にファイル名がフルパスで入ります。
| Declare Function ShellExecute Lib
"shell32.dll" Alias "ShellExecuteA" _ (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _ ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd_ As Long) As Long ' 選択されたセル(selection)のFileを起動 Sub ボタン16_Click() On Error GoTo errline ret = ShellExecute(0, "open", Selection, "", Path, 1) errline: Err = 0 End Sub |
API関数Shellexecuteの宣言 ShellExecuteの呼出し。 "open" ファイルを開く。 Selection(現在選択されているセル=ファイル名が入っている) Path デフォルトパスは、EXCELのあるディレクトリへのパス。 1 通常のWindowで表示 |
2 OLEオートメーションの利用
OLEオートメーションは、アプリケーションのリンクや埋め込みを実現している技術です。
これを利用して、他のアプリケーションを開くこともできます。
具体的には、CreatObject 関数を使い、その戻り値(オブジェクトへの参照)を set ステートメントで
オブジェクト変数に代入します。これにより、そのアプリケーションの指定された種類のオブジェクトが
作成されます。
例えば、
Set WordObj = CreatObject("Word.Basic")
により、オブジェクト変数 WordObj がWord.Basic のオブジェクトとして作成され、
WordObj を使って
Word.Basicのプロパティやメソッドにアクセス可能になります。
| CreatObject ("AppName.ObjectType") Appname アプリケーションの名前 ObjectType 作成するオブジェクトの種類または、クラス |
「OLEオートメーション」という言葉を初めて聞いた人には、チンプンカンプンな説明かもしれませんが、
とりあえず、実例をみて下さい。WordでActivecell (ファイル名がフルパスで入っている)のファイルを
開くプロシージャです。
| Sub winword() a& = Shell("c:\MSOffice\WinWord\winword.exe", 1) Dim wobj As Object Set wobj = GetObject("", "Word.Basic") wobj.fileopen ActiveCell.Value Set wobj = Nothing End Sub |
Shell関数でWordを起動しておく wobj をオブジェクト変数として宣言 wobjを Word.Basic のオブジェクトとして作成 Word.Basic のFileopenメソッドで ActiveCell のファイルをWordで開く オブジェクトの開放。 |
最後にオブジェクトの開放をしておく必要があります。(Set
wobj = Nothing)
3 DDEの利用
DDEはダイナミック、データ、エクスチェンジの略です。アプリケーション間のデータ通信の手段のひとつ
です。OLEの登場以前には、アプリケーション間のデータ通信の手段として使われていましたが、今は
より強力なOLEにとって代わられました。
とりあえず、話題提供ということで、EXCEL95におけるDDEによる、他のアプリケーションの起動について
触れておきます。(VBとEXCEL95では、DDE関連の命令コードが違う。以下のコードはEXCEL95
特有のものです)
DDEInitiate(app, topic)
アプリケーションへのDDEチャネルを開きます。
app アプリケーションの名前を指定
topic アプリケーション内のチャネルを開く要素を指定
DDEpoke (channel, item, data)
アプリケーションにデータを送ります
Channel DDEInitiateによって返されるチャネルナンバーを指定
item データ送信先の項目名
data 送信データ
DDETerminate (channel)
DDEのチャネルを閉じます
channel DDEInitiateによって返されるチャネルナンバーを指定
以下は、Wordを起動し、指定したファイルを読みこませて、さらに"EXCEL からのDDEによるFile 読み込み"
という文字列をWordの先頭に付け加える(DDEpoke)処理をしている。(EXCEL95)
| Sub ddetest() ' 'My Documentsのように空白のあるフォルダだとファイル名が正確に取得できない ' filename = Application.GetOpenFilename("*.*(*.*),*.*") myAppID = Shell("C:\MSOffice\Winword\WinWord.exe " + filename, 1) Do channelnumber = Application.DDEInitiate(app:="winword", topic:=filename) Loop Until TypeName(channelnumber) <> "Error" temp = Sheets(1).Cells(1, 1) Sheets(1).Cells(1, 1) = "EXCEL からのDDEによるFile 読み込み" Application.DDEPoke channelnumber, "\StartOfDoc", Sheets(1).Cells(1, 1) Application.DDETerminate channelnumber Sheets(1).Cells(1, 1) = temp End Sub |
これは、古い手法なので真剣に見る必要はないでしょう。