• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:vba(Access2003)の記述情報)

Access2003のvba記述に関する質問

このQ&Aのポイント
  • Access2003のvbaを使用してフォームロード時にテキストボックスの編集ロックを行いたいのですが、記述したコードにエラーが出ています。具体的には、配列を使用してテキストボックスを一括で処理するためのFor文内でエラーが発生しています。
  • 試しにFor文を外してテキストボックスを一つだけロックするコードを記述したところ、問題なく動作しました。しかし、配列を使用する場合にエラーが発生します。また、文字列の結合方法についても調査しましたが、良い例にはたどり着けませんでした。
  • ご教授いただければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

土曜の深夜にお疲れ様です。 > Tbox = Array("テキストボックスA", "テキストボックスB", "テキストボックスC") これだと、変数Tboxに格納されるのは、「文字列の配列(のようなもの)」に なってしまいますので、「Tbox(0)」などでは意図した動作になりません。 ※なお、変数を参照する場合、「[ ]」による括りは不要です※ ご質問の動作を実現するには、以下の2通りの考え方があるかと思います。 a)Tboxに格納した文字列を、Controlsコレクションのインデックスとして使用する: Private Sub Form_Load()  Dim Tbox As Variant  Tbox = Array("テキストボックスA", "テキストボックスB", "テキストボックスC")  Dim i As Integer  For i = LBound(Tbox) To UBound(Tbox)   'フォーム内のコントロールのコレクション「Controls」を使用し、変数Tboxに   '格納した文字列をインデックス(=コントロール名)として指定   '※インデックスの型はStringでないとエラーになるため、CStr関数で変換※   Controls(CStr(Tbox(i))).Locked = True  Next i End Sub b)Tboxに格納するのを、文字列ではなくコントロールにする: Private Sub Form_Load()  Dim Tbox As Variant  'テキストボックス群自体を、Tboxに格納  Tbox = Array([テキストボックスA], [テキストボックスB], [テキストボックスC])  Dim i As Integer  For i = LBound(Tbox) To UBound(Tbox)   'Tboxに格納した要素ごとに処理を実行   Tbox(i).Locked = True  Next i End Sub ・・・以上です。 なお、ループ処理には、他に「For Each ~ Next」の構文もあります。 今回の事例では、(特に「b」の場合は)この方がすっきりするかもしれません。 a)Tboxに格納した文字列を、Controlsコレクションのインデックスとして使用する: Private Sub Form_Load()  Dim Tbox As Variant  Tbox = Array("テキストボックスA", "テキストボックスB", "テキストボックスC")  'Tboxに格納した各要素を格納するための変数Memを宣言  '※変数は、Variant型か、オブジェクト型(ObjectやControlなど)にする必要あり※  Dim Mem As Variant  For Each Mem In Tbox   Controls(CStr(Mem)).Locked = True  Next End Sub b)Tboxに格納するのを、文字列ではなくコントロールにする: Private Sub Form_Load()  Dim Tbox As Variant  Tbox = Array([テキストボックスA], [テキストボックスB], [テキストボックスC])  Dim Mem As Variant  For Each Mem In Tbox   Mem.Locked = True  Next End Sub ・・・以上、参考まで。

buzinesswa
質問者

お礼

画像まで添付いただいて有難う御座います。 この内容でまた勉強になりました。

関連するQ&A