VBAのプログラムにおいて、フォームやレポート、コントロールといったオブジェクト変数(”As Form"などで宣言された変数)にその対象を代入する場合、通常は「Set
<オブジェクト変数名> = <オブジェクトの実体名>」といったような書き方をします。
たとえば、次のような記述です。
Dim frm As Form
Dim ctl As Control
Set frm = Forms!サンプルフォーム
Set ctl = Forms!サンプルフォーム!テキスト0
一般的にはレアケースかもしれませんが、あらかじめそのオブジェクト名が文字列変数に代入(あるいは定数宣言)されていて、それをオブジェクト変数に直接代入するといったことはできません。たとえば次のようなコードは”型が一致しません”エラーとなってしまいます。
Dim strFormName As String
strFormName = "Forms!サンプルフォーム"
Set frm = strFormName
このようなとき、そのオブジェクト名の文字列を分解して、オブジェクト変数に代入可能な状態に組み直してから代入することで対処することができます。
次のコードでは、対象となるコントロール「テキスト0」のオブジェクト名が文字列として代入されており、それを組み直してオブジェクト変数に代入したうえで、そのコントロールの背景色を設定しています。
Sub ObjectSample()
Dim ctl As Control 'コントロールのオブジェクト変数
Dim strCtlName As String 'コントロールの文字列変数
Dim strForm As String
Dim strCtrl As String
Dim intPos As Integer
'対象コントロールの文字列表記
strCtlName = "Forms!サンプルフォーム!テキスト0"
'まずフォームオブジェクト部分を切り出し
intPos = Len("Forms!") + 1
strForm = Mid$(strCtlName, intPos, InStr(intPos + 1, strCtlName, "!") - intPos)
'次にコントロールオブジェクト部分を切り出し
intPos = InStr(intPos, strCtlName, "!") + 1
strCtrl = Mid$(strCtlName, intPos)
'フォーム+コントロール形式のオブジェクト名に組み直して代入
Set ctl = Forms(strForm)(strCtrl)
'コントロールの背景色を設定
ctl.BackColor = vbBlack
End Sub
ここでは、各時点の変数の内容は次のように変化しています。
|
strCtlName |
intPos |
strForm |
strCtrl |
初期状態 |
(空) |
0 |
(空) |
(空) |
Step1 |
Forms!サンプルフォーム!テキスト0 |
|
|
|
Step2 |
Forms!サンプルフォーム!テキスト0 |
7 |
|
|
Step3 |
Forms!サンプルフォーム!テキスト0 |
7 |
サンプルフォーム |
|
Step4 |
Forms!サンプルフォーム!テキスト0 |
16 |
サンプルフォーム |
|
Step5 |
Forms!サンプルフォーム!テキスト0 |
16 |
サンプルフォーム |
テキスト0 |
最終的に「ctl」オブジェクト変数に代入している「Forms(strForm)(strCtrl)」という表記の値は、『Forms("サンプルフォーム")("テキスト0")』となっています。『「!」ではなく、カッコと「”」を使うことでも特定のオブジェクトを指し示すことができる』ので、これを利用したプログラムということになります。
実行例:
- 実行前
- 実行後
|