• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:チェックボックスの配置順にテキストボックスに表示)

チェックボックスのテキストボックス表示順について

このQ&Aのポイント
  • チェックボックスの配置順にテキストボックスに文字を表示させる方法を教えてください。
  • 現在、チェックされたチェックボックスをテキストボックスに表示させていますが、新しく追加したチェックボックスが最後に表示されてしまいます。
  • 簡単な方法で配置順にテキストボックスに表示させるようにするにはどうすれば良いでしょうか?

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.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 のレコードセットを使わなくても、「タグ」に順を設定するとか・・・  でも、追加した後、その「タグ」修正を間違わない・・・注意が必要ですね  上記では、追加したら「タグ」に何かを入れておけば・・・・楽かな?  いろいろ方法はあると思います。 参考にする/しない等々、自己責任でお願いします。

masunona
質問者

お礼

ありがとうございます! いつも質問すると、 割とはやめにどなたかから返事いただけるのに 今回はなかなかお返事いただけなかったので あきらめて週末を迎えたところでした。 週明けに出社して早速見てみたところ お返事いただけていてとてもうれしかったです! さっそく取り組んでみました! タブ移動順に表示させるようにしてみたところ ばっちり動きました! コードも説明も、 大変丁寧に教えていただき、本当に感謝しています! 本当に助かりました! ありがとうございました!!

関連するQ&A