三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。
よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

Access ルックアップフィールド から作られた 複数選択コンボボックス? の選択数を知り 条件付書式で使用したい

f:id:ken3memo:20220316024235j:plain

知恵袋の質問 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13258769148

Microsoft Accessについて、
関連付けられた複数選択のコンボボックスとテキストボックスがあり、
そのコンボボックスの選択数によって条件付き書式で
テキストボックスの背景色を変更したいと思ったのですが、
複数選択のコンボボックスの選択数を判定する条件がわかりません。

複数選択のコンボボックスの選択数を条件付き書式の条件にいれる方法はありますでしょうか?

に回答してみました。

Me!コンボボックスオブジェクト.Value で 値がとれるので、
単純に (例:作業内容と言う名前でルックアップフィールドから複数選択コンボボックス作りました)

UBound(Me![作業内容].Value)>0
を条件書式に入れると、
動かなかった、、、私の勘違いカモ・・・

https://youtu.be/9sAAZGTGu3I
↑テストしてみました、こんな感じで設定すると、複数選択されているか判断できると思います。
(あせっている動画ですが、時間のある時に見て、笑ってください。)

ひとつフォーム内にモジュール(Private Functionで選択数を返す)を作り

'複数選択コンボボックス?の選択数を調べたかったので、
Private Function testCNT() As Integer

    Dim box
    
    box = Me![作業内容].Value  '作業を複数選択 コンボボックス

    testCNT = UBound(box)

End Function

条件書式の式に
testCNT()>=1
を入れる。

また、

Private Sub 作業内容_AfterUpdate()
    Me.備考.Requery    'コンボ更新後にやらないと条件書式が再評価されない?
End Sub


該当のルックアップフィールドから作成した
複数選択コンボが更新されたタイミングで
設定した 条件書式のテキストボックス を .Requery しないと、色が変わらないかも。

ルックアップフィールド.Value と UBound を探ってみてください。
1つでも解決のヒントとなれば幸いです。

https://youtu.be/9sAAZGTGu3I?t=60
↑テストしてみました、こんな感じで設定すると、複数選択されているか判断できると思います。
(あせっている動画ですが、時間のある時に見て、笑ってください。)

Private Sub コマンド27_Click()
    Dim cnt As Integer
    Dim box
    
    box = Me![作業内容].Value  '作業を複数選択 コンボボックス
    
    Debug.Print "UBoundは" & UBound(box) & "です※配列は0からなので注意"
    For cnt = 0 To UBound(box)
        Debug.Print cnt & ":" & box(cnt)
    Next
    
    Stop  'コードを止める

End Sub



2022/03/16 追記

f:id:ken3memo:20220316191134j:plain

またまた、テスト不足かもしれませんが、
とりあえず対策として
If TypeName(box) = "Null"
で、コンボボックスが選択されているか、チェックしてみました。

'複数選択コンボボックス?の選択数を調べたかったので、
Private Function testCNT() As Integer

    Dim box As Variant
    
    box = Me![作業内容].Value  '作業を複数選択 コンボボックス
    If TypeName(box) = "Null" Then '↑でNullか?チェック
        testCNT = 0   '選択無し Nullの時は0を返す
    Else
        'Debug.Print "UBoundは" & UBound(box) & "です※配列は0からなので注意"
        testCNT = UBound(box)  '選択されていたら、配列の数を返す。あっここ+1?まぁいっか
    End If
    
End Function

で動作するといいなぁ。

中身の確認の方も

Private Sub コマンド27_Click()  '中身を.Valueで確認
    Dim cnt As Integer
    Dim box As Variant
    
    box = Me![作業内容].Value  '作業を複数選択 コンボボックス
    If TypeName(box) = "Null" Then '↑でNullか?チェック
        Debug.Print "Null、test関数を抜けます"
        Exit Sub
    End If
    
    Debug.Print "UBoundは" & UBound(box) & "です※配列は0からなので注意"
    For cnt = 0 To UBound(box)
        Debug.Print cnt & ":" & box(cnt)
    Next
    
    Stop  'コードを止める

End Sub

まだまだ、抜けていたらスミマセン。
Accessのルックアップフィールドからの複数選択コンボボックス、
嫌われているのか?情報がなかなか無いですね。

失敗例が参考になるといいなぁと思いつつ、
恥の上塗りをしないうちに失礼します(笑)

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。
・[Excel/Access VBA]の解説
・[ASP(Active Server Pages)]の解説。
・[元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
・[プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
三流君を踏み台にする
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)