2010年11月17日水曜日

ダブルクリックしたデータファイルのパスを渡すには

次のような要件があるとします。
拡張子 .orz のデータファイルをダブルクリックすると、特定 MDB を起動させて、そのデータファイルを処理させたい。
拡張子 .orz は既存の拡張子とカブっていない、また特定 MDB のパスは固定であるものとします。
方法としては、拡張子の関連付けで、特定 MDB を起動させます。
またその際に、ダブルクリックされたファイルのフルパスを cmd スイッチに渡すようにします。cmd スイッチに渡された値は、VBA で Command 関数経由で参照できます。

Access のコマンド ライン スイッチ - Access - Microsoft Office
Command 関数 - Access - Microsoft Office

以下、詳細。

まず db1.mdb の標準モジュールに、以下のようなプロシージャを用意しておきます。

Public Function Proc1()

    Dim dataFile As String

    dataFile = Command$()
    
    ' ここにデータファイルを処理するコードを記述する。
    ' ここではテストのため、メッセージボックスに表示する。
    MsgBox dataFile

End Function

次に、以下のようなマクロを作成します。


拡張子の関連付けで、このマクロを呼び出すように指定します。

拡張子の関連付けを手動で行う場合は、以下のような手順になります (Windows XP の場合です)。

  1. Windows エクスプローラを起動し、[ツール]-[フォルダ オプション...] を選択します。
  2. [フォルダ オプション] ダイアログが開くので、[ファイルの種類] タブに切り替えて [新規] ボタンをクリックします。
  3. [新しい拡張子の作成] ダイアログが開くので、[ファイルの拡張子] 欄に登録したい拡張子を入力して [OK] をクリックします。


  4. [フォルダ オプション] ダイアログに戻ります。登録した拡張子が選択されている状態であることを確認し、[詳細設定] ボタンをクリックします。


  5. [ファイルの種類の編集] ダイアログが開きます。[新規] ボタンをクリックします。
  6. [アクションの編集] ダイアログが開くので、以下の内容を入力します。


    アクション開く(&O)
    アクションを実行するアプリケーション"C:\Program Files\Microsoft Office\OFFICE11\MSACCESS.EXE" /NOSTARTUP "C:\temp\test.mdb" /xマクロ1 /cmd"%1"
    DDE を使うチェックオン
    DDE メッセージ[SetForeground][ShellOpenDatabase "C:\temp\test.mdb"]
    アプリケーションMsaccess
    DDE アプリケーションが実行していないとき[SHELLNOOP]
    トピックShellSystem
    赤字部分は、実際の値に読み替えてください。

  7. [OK] ボタンを 3 回クリックしてすべてのダイアログを閉じます。

以上で終わりです。
上の例では、拡張子 .orz のデータファイルをダブルクリックすると "C:\temp\test.mdb" が起動し、データファイルのパスが表示されます。


DDE の設定は、多重起動を防ぐためのものです。上の例では、すでに "C:\temp\test.mdb" が開いている状態で再度 呼び出されると、既存のウィンドウをアクティブにする動作になります。DDE をオフにすると、多重起動します。どちらがよいかは状況に応じて選ぶと良いでしょう。

起動スイッチでマクロを指定していますが、MDB 側のエントリーポイントを AutoExec マクロにしておけば起動時に自動実行されるので、起動スイッチでマクロを指定する必要はなくなります。しかし、そうするとメンテナンス目的等で MDB を直接開くときにもマクロが実行されてしまいます。ここでは AutoExec マクロではなく、x スイッチでマクロを指定する方法を取りました。

拡張子の関連付けの設定はレジストリに保存されています。詳しくはファイル拡張子とプログラムの関連付け - Web/DB プログラミング徹底解説をご参照ください。
いったん上記の設定を手作業で行えば、後はレジストリの設定を .reg ファイルに書き出すことができます。
共有フォルダに .reg ファイルを配置すれば、各ユーザがダブルクリックするだけで簡単に同じ設定を登録できます。
もちろんあなたが管理者であれば、グループポリシーを使って一斉に適用するなど、お好みの方法で展開するとよいでしょう。

2 件のコメント:

  1. いつも楽しく拝見・そして勉強させていただいています。

    今作っているアプリケーションで、まさにこの方法を探していました。/cmdで渡すというのは掴んだのですが、行き詰っていた中でこの方法にめぐりあえました。

    お陰様で独自アプリのプリセットを独自ファイルとして入れ替えする仕組みを実装できました。Windows7だとDDEセッティングする場所が画面上にないためにレジストリに直書きしましたが、あとは多重起動せずに、ファイルダブルクリックだけで起動中もインポートできるような仕組みを考えています。

    本当に素晴らしいテクニックありがとうございました。

    返信削除
  2. しばらく別方面に取り組んでいて、コメントに気づくのが遅れました。すみません。

    お役に立てたようで何よりです。
    Win7 には DDE 無いんですか(設定画面だけ無くなったのかな)。まあ DDE はレガシーですから、むしろ DDE には頼らないほうが健全なんでしょうけど。

    追加の仕組みができたら、どんな風に実装したのか(差し支えなければ)教えてください。興味あります。

    それでは。

    返信削除