#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


ここでは、各時点の変数の内容は次のように変化しています。

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")』となっています。『「!」ではなく、カッコと「”」を使うことでも特定のオブジェクトを指し示すことができる』ので、これを利用したプログラムということになります。

※もしメインフォーム→サブフォーム→コントロールのように対象コントロールが深い位置にある場合は、さらに応用して、『Forms("サンプルフォーム")("サブフォーム")("テキスト0")』といったような表記に展開することで対応できます。


実行例:
  • 実行前
  • 実行後
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved