- ベストアンサー
Access2003のvba記述に関する質問
- Access2003のvbaを使用してフォームロード時にテキストボックスの編集ロックを行いたいのですが、記述したコードにエラーが出ています。具体的には、配列を使用してテキストボックスを一括で処理するためのFor文内でエラーが発生しています。
- 試しにFor文を外してテキストボックスを一つだけロックするコードを記述したところ、問題なく動作しました。しかし、配列を使用する場合にエラーが発生します。また、文字列の結合方法についても調査しましたが、良い例にはたどり着けませんでした。
- ご教授いただければ幸いです。
- みんなの回答 (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 ・・・以上、参考まで。
お礼
画像まで添付いただいて有難う御座います。 この内容でまた勉強になりました。