前回はスクリプトの実行環境の説明から、使える機能に違いが出たりするって話でした。
今回は、実行環境に組み込まれて実装されていなくとも使える機能のお話をします。
使いたい機能が「外部ライブラリ」として公開されている場合には、「参照設定」や「CreateObject」関数といったもので使いたい機能を呼び出して使うことができます。
外部ライブラリ…(ちょっと理屈長くなるよ。)
「外部ライブラリ」とは、Windowsで言うとDLLなんて形でよく目にするものです。前回の記事で、コンパイルされた実行ファイルとして「exe」の話をすこししましたが、「exe」形式の実行ファイルは実行された場合に最初に呼び出されるポイントが決まっており、そこを起点にして一貫性を持つようにプログラムが書かれています。
対して「dll」は、他の不特定の「exe」ファイルが、共通した機能を実装できるようにクラスにインデックスを付けて体系化して「コンパイル」されたファイルとなります。「exe」ファイルの様に直接実行する事もできません。他のプログラムから呼び出されて、呼び出し元のプログラムに対してクラスの機能を提供します。
自分で「コンパイル」して「exe」ファイルを読み込む場合には、「dll」ファイルを指定して直接組み込むことができるのですが、マクロやスクリプトの場合は、「dll」がレジストリ登録されている場合に限り、その機能を使うことができます。
説明が小難しくなってますが、よーするによく使う「CreateObject("Scripting.FileSystemObject")」でファイル操作関連の機能を呼び出せるのは、「Scripting.FileSystemObject」っていう名前でDLLがレジストリ登録されているからなんですね。
例: Scripting.FileSystemObject は、「scrrun.dll」とかってDLLに入ってたり。
さて、ようやく参照設定とCreateObjectのお話
で、そんな「外部ライブラリ」を使う為の手段として一般的なところから参照設定とCreateObjectの話をしたい訳です。
普通のエディタでスクリプトなんか書いてるとCreateObject一択なので、あまり実感ないと思いますが、Office製品のVBAなんかを使っていると参照設定とCreateObjectの違いが分かりやすいので、VBAを例に説明していきます。
- 参照設定 → 事前バインディング
- CreateObject → 実行時バインディング
なんて呼ばれているみたいです。
スクリプトを勉強していると、こんなコード良く見ますね。
1 2 3 4 5 6 |
Dim fso, f, log1 Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("yyyymmdd.log", 1) log1 = f.ReadAll f.Close Set fso = Nothing |
これが、実行時バインディングになるんですが、fsoに呼び出されるのは「外部ライブラリ」のインスタンスで、この記述だと実行環境側からは、このインスタンスにどんな機能が内包されているのか読み込まれないので、コードを書くときはググって仕様を調べながら使っていくことになりますね。
さて、これと同じ機能を参照設定を使って呼び出してみましょう。
Excel 開いて、マクロエディタ開いてっと、
ほんで、「Microsoft Scripthing Runtime」をチェックしてOKっと。
これで、参照設定の設定は完了ですっ!
試しに、コードエディタ上でFileSystemObjectを呼び出して見ましょう。
なんと、型宣言の途中でもうすでに「FileSystemObject」が型の一覧に含まれているではありませんか!?型として、クラスを認識できているので、このままクラスとしてFileSystemObjectを使うことができる訳です。先のスクリプトのコードを書き換えるとこうなります。
1 2 3 4 5 6 7 8 9 |
Dim fso As FileSystemObject Dim f As TextStream Dim log1 As String Set fso = New FileSystemObject Set f = fso.OpenTextFile("yyyymmdd.log", 1) log1 = f.ReadAll f.Close Set fso = Nothing |
事前バインディングするとそのクラスで定義されているファンクションなんかが開発環境上にロードされてコード補完ができるようになるし、なんとなくVariant型で全部片づけていたインスタンスが何者だったのかわかりやすくなりますね。
[表示] - [オブジェクトブラウザ]から上のプルダウンで「Scripting」を選択すると全てのメンバを確認できたりなんかします。
とっても便利なんですが、欠点もあります。Excelブック自体に参照設定がされていないと、動かないコードになってしまうんですねぇ。
また、今回紹介したFileSystemObjectなんかはWindowsがWindowsである限り変わらなさそうな普遍的なライブラリですが、他のマイナーな機能を外部ライブラリから使う場合には、動作端末が変わった際に動かなくなるリスクがあることを頭に置いておく必要があります。
マクロがWindows7 → Windows10のリプレースで動かなくなってしまった。なんてよく聞きますよね・・・?
さて、今回もウンチク説明が長くなってしまいましたが、次回からはそろそろ実用的なサンプルコードでも紹介していきましょうかねー?