#669 | 文字列をオブジェクト変数に設定するには? | VBA | ||||||||||||||||||||||||||||||||||||
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 ここでは、各時点の変数の内容は次のように変化しています。
最終的に「ctl」オブジェクト変数に代入している「Forms(strForm)(strCtrl)」という表記の値は、『Forms("サンプルフォーム")("テキスト0")』となっています。『「!」ではなく、カッコと「”」を使うことでも特定のオブジェクトを指し示すことができる』ので、これを利用したプログラムということになります。 ※もしメインフォーム→サブフォーム→コントロールのように対象コントロールが深い位置にある場合は、さらに応用して、『Forms("サンプルフォーム")("サブフォーム")("テキスト0")』といったような表記に展開することで対応できます。 実行例:
|
||||||||||||||||||||||||||||||||||||||
|
Copyright © T'sWare All rights reserved |