Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@kawamurakeigo

VBA 拡張コンポーネント動的作成(備忘録)

VBAでよく利用する、拡張コンポーネント。
主にディクショナリ、ファイルシステム、DTPicker等を使う備忘録です。

筆者はBASICからプログラミングに入りましたが、C系の言語が長かったため、本文ではCall文を使用しております。
Call文を利用しない形式でも利用できます。

登録情報の格納場所

各コンポーネントはレジストリに登録されています。
コンピューター\HKEY_CLASSES_ROOT\
例:DTPicker
コンピューター\HKEY_CLASSES_ROOT\MSComCtl2.DTPicker

VBA関連

一覧

コンポーネント名 クラス名 コンポーネントID
ラベル MSForms.Label Forms.Label.1
テキストボックス MSForms.TextBox Forms.TextBox.1
コンボ ボックス MSForms.ComboBox Forms.ComboBox.1
リスト ボックス MSForms.ListBox Forms.ListBox.1
チェックボックス MSForms.CheckBox Forms.CheckBox.1
オプションボタン MSForms.OptionButton Forms.OptionButton.1
トグルボタン MSForms.ToggleButton Forms.ToggleButton.1
フレーム MSForms.Frame Forms.Frame.1
コマンド ボタン MSForms.CommandButton Forms.CommandButton.1
タブ ストリップ MSForms.TabStrip Forms.TabStrip.1
マルチページ MSForms.MultiPage Forms.MultiPage.1
スクロールバー MSForms.ScrollBar Forms.ScrollBar.1
スピン ボタン MSForms.SpinButton Forms.SpinButton.1
イメージ MSForms.Image Forms.Image.1

文法(動的作成)

オブジェクトは、UserForm,Frame,MultiPageなどコンポーネントを配置できるもの

変数に代入する場合

' 生成
set 変数 = オブジェクト.Controls.Add(コンポーネントID)
' 利用
変数.プロパティ...
' 解放
オブジェクト.Controls.Remove(変数.Name)

LabelSample1.bas
Dim labelSample As MSForms.Label

Private Sub UserForm_Initialize()
    Set labelSample = Me.Controls.Add("Forms.Label.1")
    labelSample.Caption = "ラベルサンプル"
End Sub

Private Sub UserForm_Terminate()
    Call Me.Controls.Remove(labelSample.Name)
End Sub

オブジェクトで管理する場合

' 生成
Call オブジェクト.Controls.Add(コンポーネントID,名前)
' 利用
オブジェクト.Controls(名前).プロパティ...
' 解放
Call オブジェクト.Controls.Remove(名前)

LabelSample2.bas

Private Sub UserForm_Initialize()
    Call Me.Controls.Add("Forms.Label.1", "CreatedLabel")
    Me.Controls("CreatedLabel").Caption = "ラベルサンプル"
End Sub

Private Sub UserForm_Terminate()
    Call Me.Controls.Remove("CreatedLabel")
End Sub

VBScript関連

VBScript(?)に実装されている機能

一覧

クラス名 コンポーネントID 備考
Dictionary Scripting.Dictionary
Drive Scripting.FileSystemObject GetDrive等で取得
File Scripting.FileSystemObject FilesからのForEach等で取得
FileSystem Scripting.FileSystemObject ファイル関係の基幹
Folder Scripting.FileSystemObject GetFolder等で取得

文法(動的作成)

DictionarySample.bas
Private myDict As Object

Private Sub UserForm_Initialize()
    Set myDict = CreateObject("Scripting.Dictionary")
    Call myDict.Add(1, "Data1")
End Sub

Private Sub UserForm_Terminate()
    Set myDict = Nothing
End Sub

VB6関連

入手先

VB6コンポーネントは、通常のOfficeインストール時には登録されていません。
別途入手・インストールする必要があります。
筆者は以下を利用しました。他にもVectorなどで他のソフトウェアもありますので、ご自由に使ってください。
「Visual Basic 6.0 Service Pack 6 Runtime Set Version.1.35(作:Tohさん、v6s6r135.zip)」

一覧

コンポーネント名 クラス名 コンポーネントID
動画再生(だったと思う) MSComCtl2.Animation MSComCtl2.Animation.2
コンボボックス型カレンダー MSComCtl2.DTPicker MSComCtl2.DTPicker.2
スクロールバー MSComCtl2.FlatScrollBar MSComCtl2.FlatScrollBar.2
カレンダー MSComCtl2.MonthView MSComCtl2.MonthView.2
上下ボタン MSComCtl2.UpDown MSComCtl2.UpDown.2

文法(動的作成)

通常のコンポーネントと同じです

他にも、多数のクラスが登録されていると思いますが、そちらは適宜追加したいと思います。

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?