フォーム内のコントロールを取得して順番に処理したいとき次のような
書き方で行っています。
サンプル:
With Me
For Each MyControl In .Controls
If TypeName(MyControl) = "CheckBox" Then
処理・・・・・
End If
Next
End With
この場合、取得するコントロールの順番を決まったとおり行うにはどう
したらよいのでしょうか。TabIndexのプロパティに順番に処理されるの
かと思い希望する順番にTabIndexを変更してみましたが、順番は変わり
ませんでした。
どうぞよろしくお願いします。
# 環境に言及がないので VB6.0 を想定 (^^;; 。
確認してませんが、たぶん Controls コレクションに追加された順番 (≒
デザイン画面でコントロールを作成した順番) ではないかと。
この順番を変えたいとなると .frm ファイルを直接テキストエディタで編集
してコントロールの順番を入れ替えるしかない気がします。
もっともデザイン画面でコントロールを追加したり、最背面/最前面への移動
なんかしたら、再度やり直しになるのでお勧め出来ませんが...(^^;;
コントロールを処理する順番に依存するのなら For Each を使わずに直接コ
ントロールを指定した方がよいと思いますよ。
Geo=TK3 さま さっそくのご指導ありがとうございます。
>.frm ファイルを直接テキストエディタで編集
>してコントロールの順番を入れ替えるしかない気がします。
さっそくチャレンジしてみます。
>直接コントロールを指定した方がよい
おっしゃるとおりなのですが、コントロールの数がべらぼうに多く
またFor Each の中でやっている処理は、SQL分のSELECT項目の
作成なのでかなり記述が長くなってしまいます。・・・
単に邪魔くさいだけなのですが。根が横着なもので・・・。
(CheckBoxの名前にDBの項目名をそのまま使いCheckBoxにチェッ
クがはいっているとSELECT分にそのコントロール名を追加していく)
結果はまたご報告します。
とりあえず、お礼まで。
For Eachは使っていないけど。
Private Sub Command1_Click()
Dim MyControl As CheckBox
Dim strCtrlName As String
Dim strCtrlNameB() As String
Dim lngCount As Long
strCtrlName = "Check1,Check2,Check3,Check4,Check5"
strCtrlNameB = Split(strCtrlName, ",")
For lngCount = LBound(strCtrlNameB) To UBound(strCtrlNameB)
Set MyControl = Controls(strCtrlNameB(lngCount))
If MyControl.Value = 1 Then
Debug.Print MyControl.Name
'処理
End If
Next
End Sub
>またFor Each の中でやっている処理は、SQL分のSELECT項目の
>作成なのでかなり記述が長くなってしまいます。・・・
そうであれば GOD さんが提示してくれたサンプルのようにするのがよいと
思います。
strCtlName にコントロール名を列記していく手間は掛かりますが、.frm
ファイルを直接いじるよりは楽 (^^;; 。
てか SELECT 文の選択リストの構築なら別に順番にこだわる必要はない気が
するので、フェイクさんが最初に提示したコードのままで十分なのでは (^^;; 。
GODさま
>strCtrlName = "Check1,Check2,Check3,Check4,Check5"
で自分の好きな順番に指定すればいいんですね。こんな
方法もあったのですね。ありがとうございます。今後は
この方法を使わせていただきます。
今回はGeo=TK3さまにお教えいただいた方法で結果はOK
でした。.frmをエディタで直接書き換えることができる
ことも今回勉強させていただきました。
本当に皆様ありがとうございました。
ツイート | ![]() |