VBAで使ったことのあるCreateObjectや参照設定を整理してみました。
注意
今回、改めて実際に使ってテストした訳ではないので、間違っている可能性もあります。
CreateObjectで使えるのは、呼び出し先のプログラムの都合で使えたり使えなかったりします。
Windowsのバージョン、Officeのバージョン、Bit数、他にインストールされているプログラムなどで変わります。
ここに書いてあるのはあくまで参考程度とお考えください。
調査
VBAでCOMオブジェクトを使う方法は、アーリーバインディング(事前)とレイトバインディング(実行時)があります。
事前バインディングでは参照設定をする必要があり環境依存のバグに苦しめられますし、実行時バインディングではコードを丸暗記orコピペしなければならずコーディングが大変です。
これらは状況次第で使い分けたいのが開発者の心情なので、ちょっと大掛かりな対応表を作りました。
調査項目
- 事前:参照設定の一覧
- 実行時:CreateObjectの一覧
- 実行時:UserForm.Controls.Addの一覧
の三項目を調査しました。
本当は調査表の全体をここに載せたいところですが、はてなブログに横長の表を載せるのは現実的ではありません。
オリジナルデータは Google Spreadsheet にて編集可能で公開 したので、気が向いたら更新して頂いても結構です。
一応、最低限のテストとして、2019/4/19のOffice365 32bitにて
- Set obj = CreateObject(?)
- Set ctrl = Controls.Add(?)
を行い、実行時エラーが出ないことだけ確認しました。
また、TypeName
を実行した際の文字列が、他の項目とは全然違うようなので全て調べておきました。
- Debug.Print TypeName(obj)
- Debug.Print TypeName(ctrl)
一部はCreateObjectとControls.Addでも異なります。
参照設定
私が使った事のある参照設定を列挙しました。
バージョンによって違いますし、同じ名前のものが複数ありdllのフルパスを指定しなければならないものもあります。
本当に参考程度です。
Microsoft Access BarCode ControlXX.0 Microsoft Access X.X Object Library Microsoft ActiveX Data Objects X.X Library Microsoft DAO 3.6 Object Library Microsoft Excel X.X Object Library Ref Edit Control Microsoft Outlook X.X Object Library Microsoft PowerPoint X.X Object Library Microsoft Word X.X Object Library Microsoft HTML Object Library Microsoft Internet Controls Microsoft XML, vX.X Microsoft Forms 2.0 Object Library Microsoft Windows Common Controls 6.0 (SP6) Microsoft CDO for Windows 2000 Library Microsoft InkEdit Control 1.0 Microsoft Scripting Runtime Microsoft Shell Controls And Automation Microsoft Tablet PC Type Library, version 1.0 Microsoft VBScript Regular Expressions X.X Microsoft Windows Image Acquisition Library v2.0 Microsoft WMI Scripting VX.X Library Windows Script Host Object Model WindowsMediaPlayer
CreateObject
オブジェクトを作成する場合は、docs.microsoft.com - CreateObject、support.office.com - CreateObject を使用します。
Set obj = CreateObject(class, [ servername ])
一般的な利用で第2引数のservername
が使われることはないと思います。
実際に使う場合は、ProgID
(プログラムID)を使ってこう書きます。
Set obj = CreateObject("Scripting.FileSystemObject")
ProgIDは以下に記憶されています。
HKEY_LOCAL_MACHINE\Software\Classes\
ProgIDの構成はこんな風になっています。バージョン番号はあったり無かったりです。
{プログラム名}.{コンポーネント名}.{バージョン番号}
上記のキーの中には、CLSID
というGUID形式の文字列が記載されています。
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Scripting.FileSystemObject\CLSID 既定={6BF52A52-394A-11d3-B153-00C04F79FAA6}
これを活用することで、このように書く事もできます。
Set obj = CreateObject("new:{6BF52A52-394A-11d3-B153-00C04F79FAA6}")
この書き方は、先日のWindows Media Player の記事でも使いましたね。
オブジェクトによっては、この方法でないと使えない事があるようです。
(調べるとWMPlayer.OCXはProgIDもCLSIDも登録されているため、CLSIDでないと使えないのは本当に謎です)
オブジェクトインスタンス作成の宣言文だけ列挙しておきます。
Set obj = CreateObject("BARCODE.BarCodeCtrl.1") Set obj = CreateObject("Access.Application") Set obj = CreateObject("ADODB.Connection") Set obj = CreateObject("ADODB.Recordset") Set obj = CreateObject("ADODB.Stream") Set obj = CreateObject("DAO.DBEngine.120") Set obj = CreateObject("Excel.Application") Set obj = CreateObject("RefEdit.Ctrl") Set obj = CreateObject("Outlook.Application") Set obj = CreateObject("PowerPoint.Application") Set obj = CreateObject("Word.Application") Set obj = CreateObject("Word.Document") Set obj = CreateObject("htmlfile") Set obj = CreateObject("InternetExplorer.Application") Set obj = CreateObject("Microsoft.XMLDom") Set obj = CreateObject("Microsoft.XMLHTTP") Set obj = CreateObject("MSXML2.DOMDocument") Set obj = CreateObject("MSXML2.XMLHTTP") Set obj = CreateObject("Forms.CheckBox.1") Set obj = CreateObject("Forms.ComboBox.1") Set obj = CreateObject("Forms.CommandButton.1") Set obj = CreateObject("Forms.Image.1") Set obj = CreateObject("Forms.Label.1") Set obj = CreateObject("Forms.ListBox.1") Set obj = CreateObject("Forms.MultiPage.1") Set obj = CreateObject("Forms.OptionButton.1") Set obj = CreateObject("Forms.ScrollBar.1") Set obj = CreateObject("Forms.SpinButton.1") Set obj = CreateObject("Forms.TabStrip.1") Set obj = CreateObject("Forms.TextBox.1") Set obj = CreateObject("Forms.ToggleButton.1") Set obj = CreateObject("MSComctlLib.ListViewCtrl") Set obj = CreateObject("MSComctlLib.TreeCtrl") Set obj = CreateObject("Scriptlet.TypeLib") Set obj = CreateObject("CDO.Message") Set obj = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") Set obj = CreateObject("InkEd.InkEdit.1") Set obj = CreateObject("Scripting.Dictionary") Set obj = CreateObject("Scripting.FileSystemObject") Set obj = CreateObject("Shell.Application") Set obj = CreateObject("MSInkaut.InkPicture.1") Set obj = CreateObject("VBScript.RegExp") Set obj = CreateObject("Wia.ImageFile") Set obj = CreateObject("WbemScripting.SWbemLocator") Set obj = CreateObject("WScript.Shell") Set obj = CreateObject("WScript.Network") Set obj = CreateObject("new:{6BF52A52-394A-11d3-B153-00C04F79FAA6}")
Controls.Add
ユーザーフォームにコントロールを配置する場合は、 object.Addを使用します。
C#なんかでは、先にインタンスを作成してから任意のコントロールに配置するのですが、VBAでは最初から親コントロールを指定しなければコントロールが置けません。
Set Ctrl = object.Add(ProgID [, Name [, Visible ]] )
実際にはユーザーフォームのモジュールにて、このように書くことが多いのではないかと思います。
Set Ctrl = Controls.Add("Forms.CommandButton.1" , "btn_01")
こういう動的な指定は、大量のコントロールを作る場面で多いと思われます。
Sub ボタンを10個列挙() Dim arrBtn(1 To 10) As Object Dim i For i = LBound(arrBtn) To UBound(arrBtn) Set arrBtn(i) = Controls.Add( _ "Forms.CommandButton.1", _ "btn_" & Format(i, "00")) With arrBtn(i) .Caption = i .Top = i * 25 End With Next End Sub
※イベントの処理の振り分け技術については割愛。
尚、ワークシート上に設置する場合は、OLEObjects.Add となります。
ActiveWorkbook.Worksheets("Sheet1").OLEObjects.Add ClassType:="Word.Document"
以前、Windows Media Player の記事を書きましたが、あのときのように「参照設定を行いたくない」場合にも有効な手段です。
Set obj = Controls.Add("WMPlayer.OCX.7")
コントロールの宣言文だけ列挙します。
Set ctrl = Controls.Add("BARCODE.BarCodeCtrl.1") Set ctrl = Controls.Add("RefEdit.Ctrl") Set ctrl = Controls.Add("Forms.CheckBox.1") Set ctrl = Controls.Add("Forms.ComboBox.1") Set ctrl = Controls.Add("Forms.CommandButton.1") Set ctrl = Controls.Add("Forms.Image.1") Set ctrl = Controls.Add("Forms.Label.1") Set ctrl = Controls.Add("Forms.ListBox.1") Set ctrl = Controls.Add("Forms.MultiPage.1") Set ctrl = Controls.Add("Forms.OptionButton.1") Set ctrl = Controls.Add("Forms.ScrollBar.1") Set ctrl = Controls.Add("Forms.SpinButton.1") Set ctrl = Controls.Add("Forms.TabStrip.1") Set ctrl = Controls.Add("Forms.TextBox.1") Set ctrl = Controls.Add("Forms.ToggleButton.1") Set ctrl = Controls.Add("MSComctlLib.ListViewCtrl") Set ctrl = Controls.Add("MSComctlLib.TreeCtrl") Set ctrl = Controls.Add("InkEd.InkEdit.1") Set ctrl = Controls.Add("MSInkaut.InkPicture.1") Set ctrl = Controls.Add("WMPlayer.OCX.7")
参考資料
以前書いた関連記事
説明はここが簡潔で易しめです。
エクセルの真髄 - 参照設定、CreateObject、オブジェクト式の一覧
ProgIDとCLSIDの特定方法はこの辺りの記事が詳しいです。
Excel作業をVBAで効率化 - CreateObject関数の説明と参照するDLLの関係
VBA CreateObjectか参照設定のどちらかしか分からないとき、もう片方を調べる方法(NG)
VBA 参照設定とCreateObjectは全く別の経路でオブジェクトを参照する。
下記では全部列挙してくれているので、レジストリを検索するのが面倒な時参考になりそうです。
Qiita - VBA Office 2010(32Bit)で参照設定可能なリスト
まとめ
最終的な目的はこれらの機能を毎回ググらなくて済むような、便利なモジュールを作ることです。
更にワンタッチでアーリーバインディングとレイトバインディングを切り替えられるようにすることです。
全てを関数化しておき、参照設定済みかどうかで戻り値の型を変えようかと。
すぐに必要なものではないので、いつになることか分かりませんが、今回のまとめが役に立つことでしょう。
以上
何か御座いましたらコメント欄、またはTwitterからどうぞ♪
それではまた来週♪ ちゅんちゅん(・8・)