パソコン活用研究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関数のなんたるかについては、また、別の機会に触れたいと思います。

ShellExecute
[宣言]
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のプロパティやメソッドにアクセス可能になります。

CreateObject関数の構文
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

これは、古い手法なので真剣に見る必要はないでしょう。

 

Top page | Visual Basic&Excel活用研究目次