- ベストアンサー
チェックボックスのテキストボックス表示順について
- チェックボックスの配置順にテキストボックスに文字を表示させる方法を教えてください。
- 現在、チェックされたチェックボックスをテキストボックスに表示させていますが、新しく追加したチェックボックスが最後に表示されてしまいます。
- 簡単な方法で配置順にテキストボックスに表示させるようにするにはどうすれば良いでしょうか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
VBA は、なんとか大丈夫になったでしょうか VBA での記述になります。 状況が不明なところもありますが、変更しやすい(?)方法での記述にしてみます。 説明は後にして、以下をフォームに記述しておきます。 Private Function MojiGet() As String Dim ctl As Control Dim sS As String With New ADODB.Recordset .Fields.Append "名", adVarChar, 255 .Fields.Append "値", adBoolean .Fields.Append "左", adInteger .Fields.Append "順", adInteger .CursorLocation = adUseClient .Open For Each ctl In Me.Controls Select Case ctl.ControlType Case acCheckBox sS = ctl.Name If (ctl.Controls.Count > 0) Then sS = ctl.Controls(0).Caption End If .AddNew .Fields("名") = sS .Fields("値") = ctl.Value .Fields("左") = ctl.Left .Fields("順") = ctl.TabIndex .Update End Select Next .Filter = "値 = True" .Sort = "左" sS = "" While (Not .EOF) sS = sS & " " & .Fields("名") .MoveNext Wend .Close MojiGet = Mid(sS, 2) End With End Function チェックボックスの状態を順次チェックしていくわけですが、 後での並べ替え( Sort )が楽なように ADO のレコードセットを使っておきます。 > A B Z E > と表示させたいのに > A B E Z > 表示されてしまいます。 これは、おそらく For Each ctl In Me.Controls Select Case ctl.ControlType とした場合の、出現順(作った順)で処理されているのだと思います。 上記の記述では、チェックボックスなら ・名前を覚える(チェックボックスにラベルがくっついていたらラベルの標題) ・値を覚える ・左位置を覚える ・タブ移動順を覚える で、この4つを全部覚えたら ・値 = True で絞込み( Filter ) ・並び替えを、左位置昇順 この結果で、「名」を繋げていきます Filter は使わずに、True の時のみレコードセットに追加・・・でも良いと思います。 並び順をタブ移動順に変更するのも容易です。 また、2段・3段になっていて、上の段から・・・とかなら "上" フィールドを追加して、ctl.Top も覚えておいてから Sort で "上, 左" とすれば順に得られれます。( "左, 上" とするとまた違った順に) もちろん、横並びの Top 値や Left 値は同じにしておく必要はありますが・・・ でも、タブ移動順の方が使えるのかも? ここで、関数名を MojiGet としたので、テキストボックスに設定する時には Me.テキストボックス = MojiGet で、できると思います。 テキストボックスのコントロールソースに =MojiGet() としても表示できますが、 更新のタイミングがうまくとれないと思います。 ( Me.Recalc 等で表示更新はされますが) その時には、このチェックボックスが変更されたら・・・・ という意味で、引数に与えるようにします。( Access さんに教えてあげます) 関数側では、引数は必要としていないので、ダミー的な受けにしておきます。 Private Function MojiGet2(ParamArray vDmy()) As String MojiGet2 = MojiGet End Function テキストボックスのコントロールソースには、 チェックボックス「A」「B」「C」に変更あったら表示を更新したい場合 =MojiGet2([A],[B],[C]) とでも記述しておきます。 なお、フォーム上に上記とは別の用途のチェックボックスがあるのであれば、 チェックボックスのプロパティにある「タグ」に識別子を埋めておきます。 「タグ」に設定する文字列は何でもよいので、 例えば、対象外のチェックボックスには設定なし・・・だけとすると For Each ctl In Me.Controls Select Case ctl.ControlType Case acCheckBox If (Len(ctl.Tag) > 0) Then ' ★こんな感じの判別 sS = ctl.Name ※ 冒頭に示した内容では、毎回順を得ていますが、 順を求めるのは1回で良いので、Form_Load とかでやっておいて、 以降は求まっていた順を使いながら、True/False を判別・・・・でも良いかも ただ、フォーム上では操作が絡むので、応答に満足できれば、このままでも・・・ ※ 同じような事をするフォームが複数あるのであれば、 関数部分を標準モジュールに移動させ、 ・ Private → Public ・ Me.Controls → CodeContextObject.Controls の変更で動くかも(未検証) ※ ADO のレコードセットを使わなくても、「タグ」に順を設定するとか・・・ でも、追加した後、その「タグ」修正を間違わない・・・注意が必要ですね 上記では、追加したら「タグ」に何かを入れておけば・・・・楽かな? いろいろ方法はあると思います。 参考にする/しない等々、自己責任でお願いします。
お礼
ありがとうございます! いつも質問すると、 割とはやめにどなたかから返事いただけるのに 今回はなかなかお返事いただけなかったので あきらめて週末を迎えたところでした。 週明けに出社して早速見てみたところ お返事いただけていてとてもうれしかったです! さっそく取り組んでみました! タブ移動順に表示させるようにしてみたところ ばっちり動きました! コードも説明も、 大変丁寧に教えていただき、本当に感謝しています! 本当に助かりました! ありがとうございました!!