こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

vba(Access2003)の記述情報

こんばんは。
遅くに質問失礼します。
只今、Access2003のvbaを記述しており、エラーが出て困りましたので質問いたしました。
初歩的な事かと思うのですがご指導下さいませ。

AccessのフォームにテキストボックスA、テキストボックスB、テキストボックスC、作成し、フォームロード時に編集ロックをしたいと思います。
※------------------------------
Me.AllowEdits = False とか
プロパティの編集ロック はい/いいえ を利用しない方法を探しています。
--------------------------------

現在vbaの記述は
Private Sub Form_Load()
 Dim Tbox As Variant
 Tbox = Array("テキストボックスA", "テキストボックスB", "テキストボックスC")

 Dim i As Integer
 For i = LBound(Tbox) To UBound(Tbox)
  [Tbox(i)].Locked = True ★
 Next i
End Sub

を記述すると★行にエラーが発生します。
勉強のため色々ためしてみました。

試(1)…For文を外し短文で
[テキストボックスA].Locked = True
とした場合には問題なくロックできました。

試(2)…For文を外し短文で
[Tbox(0)].Locked = True
とした場合にはエラー。

試(3)…変数内確認のため
MsgBox Tbox(0)
とした場合「テキストボックスA」と出ます。

試(4)…For文を外し短文で
[ & Tbox(0) & ].Locked = True や
[ + Tbox(0) + ].Locked = True 試しましたがエラー・・・(当たり前でしょうが、、、

試(5)…googleで『vba [] 文字列 結合』等色々調べましたがあまり良い例に辿り着けず、、、

ご教授いただければ幸いです。
何卒、宜しくお願い致します。

投稿日時 - 2012-04-29 01:02:51

QNo.7446886

困ってます

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

土曜の深夜にお疲れ様です。

> 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


・・・以上、参考まで。

投稿日時 - 2012-04-29 08:43:38

お礼

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

投稿日時 - 2012-04-29 12:33:17

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問