NightWalkerの日記: DDEでExcel通信
既に開いているexcelに外部からDDEを使ってデータを投げ込む・・
なんて事は懐古テクノロジーになってしまったんだな。
Webを見ても情報が少ないし、Officeリソースキットを買わないと詳細がわからないようだ。
というか本屋で立ち読みした限りでは、DdeExecuteで使えるコマンド一覧なんてなかったぜ?
という事で、知りえた情報をメモ。
■使い方編
・DDEMLを使う
・DdeConnectionListで接続可能一覧を取得
・DdeQueryNextServer、DdeQueryConvInfoでサーバー情報を取得
・DdeQueryStringでサーバー名とトピック名を取得
・"Folders","Shell","PROGMAN"というサーバーがでふぉ
・PokeもExceuteもRequestもDdeClientTransactionを使う
・DdeClientTransaction(NULL,0,ConnectHandle,DdeCreateStringHandleした文字列,CF_TEXT,XTYP_REQUEST,timeout時間,NULL)
・DdeClientTransaction(DdeCreateDataHandleした文字列(LPBYTEにキャスト),0xffffffff,ConnectHandle,0,XTYP_EXECUTE,timeout時間,NULL)
・DdeClientTransaction(書き込む値の文字列(LPBYTEにキャスト),値の文字列長+1,ConnectHandle,DdeCreateStringHandleした文字列,CF_TEXT,XTYP_POKE,timeout時間,NULL)
・ちゃんとDdeFreeDataHandleとかDdeFreeStringHandleしておくこと
■Excelとの通信
・excelは何もいじらないし、ましてVBAも使わない
・Excel起動中にDdeConnectionListすると、サーバー名"Excel"で、トピック名"System","[Book1]Sheet1"~Sheet3"などが取得できる
・トピック名"System"に接続(DdeConnect)する
・"topics"をリクエストしてみると、DdeConnectionListで出てきたトピック名一覧が取得できる
・"selection"リクエストしてみると、"[Book1]Sheet1!R1C1"など、選択しているセルが取得できる。
・トピック名"[Book1]Sheet1"に接続する
・"R1C1"に"abcd"をPOKEすると、Sheet1!A1に"abcd"が書き込まれる
・"[Select(\"R2C1\")]"をExecuteすると、選択セルがSheet1!A2に移動する。
・"R1C1"をRequestすると、書き込まれている値(abcd)が取得できる
その他、未確認もあるけどDDE通信で使えるコマンド
・[Insert(n)] n=1~4でセル単位、行列単位の挿入
・[app.minimize()] excelを最小化
・[quit()]
参考にしたwebサイト
Systemに"selection"を教えてくれた神様
[]付きのコマンド例を多く掲載している仏様
DDEMLのサンプルとして大変参考になりました
VBサンプルが大変参考になりました
知らないDDEコマンドがあって参考になりました
以上、大変ありがとうございました。
DDEでExcel通信 More ログイン