コントロールを引数にしたプロシージャを作るにはどうすればいいのか、 コントロールをForループに入れてやるにはどうすればいいのか。
経緯
フォームをダブルクリックした際に フォーム上の 全テキストボックスについて .Enabled
を変化させようとしました。 全てのコントロール名を書き連ねるのは大変なので、 ループ を使って複数のコントローラに対して処理を行おうと考えました。
解決法
VBA では Me.Controls("ControlName")
でコントロールを取得できます。 そこで、 .Enabled
を変更する TextBox の名前を txtTitle1
、txtTitle2
というようにしておき、次のようなループ処理を実行します。
1 2 3 |
For i = 0 to N Me.Controls("txtTitle" & CStr(i)).Enabled = False Next |
Me.Controls
で取得したコントローラについて複数行の初期化処理を行う場合は With
を使うのもいいですが、 次のように変数に代入して使うこともできます。
1 2 |
Dim cobj As Object Set cobj = Me.Controls("XXXXXX") |
変数宣言のところで As TextBox
などと書くと エラーが出ます。
これらを利用して作ったのが次のコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Option Explicit Private Const N As Integer = 8 '制御する TextBox の総数 'フォームがダブルクリックされたら、テキストボックスを編集不可にします。 Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Integer Dim cobj As Object Dim b As Boolean b = Not txtTitle1.Enabled For i = 1 To N Set cobj = Me.Controls("txtTitle" & CStr(i)) cobj.Enabled = b Next i End Sub |
その他下記のような方法が使えそうです。
配列を使う
.Net では コントロール の 配列 (のようなもの) に コレクション というのがあり、 配列のように扱うことができます。 しかし VBA には コレクション クラス が用意されていません。
しかし、 Me.Controls
の引数にする String は配列にできます。
コレクションクラスを作ってしまう
コントロールの集合を扱えるようなクラスを作ってしまうのもいいと思います。