Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7 Professional : Access 2016)
コンボボックスとテキストボックスでの検索ができません
投稿日時: 18/01/21 22:30:02
投稿者: hana_brenda

access初心者です。見よう見まねで下記のVBAで複数のテキストボックスからあいまい検索ができるようになりました。いくつかをコンボボックスに変更したいのですが、コンボボックスにすると検索できなくなってしまいます。テキストボックス名部分をコンボボックス名に変更するだけではだめなのでしょうか?ご教示ください。
 
Private Sub com抽出_Click()
    Dim strFilter As String, strExp As String, aryOpe As Variant
 
    If Not IsNull(Me.txt県市町村) Then
        strFilter = strFilter & " AND T_案件名_県市町村 Like '*" & Me.txt県市町村 & "*'"
    End If
      
    If Not IsNull(Me.txt部局) Then
        strFilter = strFilter & " AND T_案件名_部局 Like '*" & Me.txt部局 & "*'"
    End If
        
    If Not IsNull(Me.txt課事務所) Then
        strFilter = strFilter & " AND " & BuildCriteria("T_案件名_課事務所", dbText, _
        "*" & Replace(StrConv(Me.txt課事務所, vbWide), " ", "* Or *") & "*")
    End If
      
     If Not IsNull(Me.txt案件名) Then
        strFilter = strFilter & " AND " & BuildCriteria("案件名", dbText, _
        "*" & Replace(StrConv(Me.txt案件名, vbWide), " ", "* Or *") & "*")
    End If
     
     If Not IsNull(Me.txt工事名) Then
        strFilter = strFilter & " AND " & BuildCriteria("工事名", dbText, _
        "*" & Replace(StrConv(Me.txt工事名, vbWide), " ", "* Or *") & "*")
    End If
     
     If Not IsNull(Me.txt工事種目) Then
        strFilter = strFilter & " AND " & BuildCriteria("工事種目", dbText, _
        "*" & Replace(StrConv(Me.txt工事種目, vbWide), " ", "* Or *") & "*")
    End If
     
     If Not IsNull(Me.txt名称) Then
        strFilter = strFilter & " AND " & BuildCriteria("名称", dbText, _
        "*" & Replace(StrConv(Me.txt名称, vbWide), " ", "* Or *") & "*")
    End If
      
     If Not IsNull(Me.txt単価コード) Then
        strFilter = strFilter & " AND " & BuildCriteria("単価コード", dbText, _
        "*" & Replace(StrConv(Me.txt単価コード, vbWide), " ", "* And *") & "*")
    End If
           
    Me.Filter = Mid(strFilter, 6)
    If strFilter = "" Then
        Me.FilterOn = False
    Else
        Me.FilterOn = True
    End If
End Sub

回答
投稿日時: 18/01/22 01:31:51
投稿者: hatena
投稿者のウェブサイトに移動

どのテキストボックスをコンボボックスに変換したのですか。
また、そのコンボボックスの設定はどうなってますか。
下記の設定を提示してください。
 
コントロールソース
価集合ソース
連結列
列数
列幅

投稿日時: 18/01/22 11:13:03
投稿者: hana_brenda

早速の返信ありがとうございます。下記の通りテキストボックスからコンボボックスに変更したいと思っております。
 
txt県市町村→cbo県市町村に変更したい
 
名前:cbo県市町村
コントロールソース :非連結
価集合ソース :SELECT [T_県市町村].[県市町村ID], [T_県市町村].[県市町村] FROM [T_県市町村] ORDER BY [県市町村ID];
連結列 :1
 列数 :2
 列幅 :0cm;2.54cm
 
 
txt課事務所→cbo課事務所に変更したい
 
名前:cbo課事務所
コントロールソース: 非連結
価集合ソース :SELECT [T_発注者事務所].[事務所ID], [T_発注者事務所].[事務所] FROM T_発注者事務所 ORDER BY [事務所];
連結列 :1
 列数 :2
 列幅 :0cm;2.54cm
 
 
txt工事名→cbo工事名に変更したい
 
名前:cbo工事名
コントロールソース :非連結
価集合ソース :"建築";"電気";"機械"
連結列 :1
 列数 :1
 列幅 :2.54cm
 
 
txt工事種目→cbo工事種目に変更したい
 
名前:cbo工事種目
コントロールソース :非連結
価集合ソース :SELECT [T_工事種目].[工事種目ID], [T_工事種目].[工事種目] FROM [T_工事種目] ORDER BY [工事種目];
連結列 :1
 列数 :2
 列幅 :0cm;2.54cm
 
よろしくお願い致します。

回答
投稿日時: 18/01/22 11:40:00
投稿者: hatena
投稿者のウェブサイトに移動

とりあえず下記のコンボについて
 

名前:cbo県市町村 
コントロールソース :非連結 
価集合ソース :SELECT [T_県市町村].[県市町村ID], [T_県市町村].[県市町村] FROM [T_県市町村] ORDER BY [県市町村ID]; 
連結列 :1 
 列数 :2 
 列幅 :0cm;2.54cm 
 

連結列が1になってますので、[県市町村ID]と結合しています。
1列目の列幅を0cmにしているので、リストやボックスには [県市町村ID] は表示されずに [県市町村] が表示されています。
これは表示上だけで、実際に格納されいるのは、[県市町村ID] ということをまずは理解しましょう。これが理解できれば、
 
    If Not IsNull(Me.txt県市町村) Then 
        strFilter = strFilter & " AND T_案件名_県市町村 Like '*" & Me.txt県市町村 & "*'" 
    End If 

 
は、下記になるということも理解できますね。
 
    If Not IsNull(Me.cbo県市町村) Then 
        strFilter = strFilter & " AND 県市町村ID = " & Me.cbo県市町村
    End If 

上記は 県市町村ID が数値型の場合です。テキスト型なら、
 
    If Not IsNull(Me.cbo県市町村) Then 
        strFilter = strFilter & " AND 県市町村ID = '" & Me.cbo県市町村 & "'"
    End If 

 
他のコンボボックスは上記の点を踏まえてご自身でトライしてみてください。

回答
投稿日時: 18/01/22 11:52:30
投稿者: Suzu

コンボボックスの仕様として、
  値集合ソースのレコードに含まれた値の中から【選択】します。
  これは逆に言うと、値集合ソースのレコードに含まれない物は選択できない事になります。
 
また
 コンボボックスで選択し表示されている値
 コンボボックスのValueプロパティーの値 ----- 値集合ソースの列を1列目から数え連結列に指定された値
 は別にする事が可能です。
 
 

hana_brenda さんの引用:
txt県市町村→cbo県市町村に変更したい
 
名前:cbo県市町村
コントロールソース :非連結
価集合ソース :SELECT [T_県市町村].[県市町村ID], [T_県市町村].[県市町村] FROM [T_県市町村] ORDER BY [県市町村ID];
連結列 :1
 列数 :2
 列幅 :0cm;2.54cm

 
上記の場合、
 Value プロパティーは、値集合ソースの左から1列目 となります。
 つまり、Valueプロパティーは、【県市町村ID】の値となっています。
 
ですので
If Not IsNull(Me.txt県市町村) Then 
        strFilter = strFilter & " AND T_案件名_県市町村 Like '*" & Me.txt県市町村 & "*'" 

Me.txt県市町村 と指定したばあい、コントロールの既定のプロパティーは、Valueプロパティーですので
Me.txt県市町村.Value が省略された形です。
 
今回コンボボックスに変え
MsgBox Me.cbo県市町村
 とすると、[T_県市町村].[県市町村] ではなく[T_県市町村].[県市町村ID]の値のが返されるのが判ると思います。
 
ですので txt県市町村→cbo県市町村 としただけの場合、先にも言った通り【県市町村ID】の値が返されます。
 
値集合ソースの2列目の値が取得したい場合は、
MsgBox Me.cbo県市町村.Coloumns(1)
とします。
  ※ 仕様として、1列目は、Coloumns(0)
                 2列目は、Coloumns(1)
                   :
               の様に、n列目を取得したい場合、Coloumns(n-1)として取得する事になります。
 
 
対策の方法としては二つ。
 
1. テーブル 【T_案件名】のフィールドに【県市町村ID】が含まれる様にし
   " AND T_案件名_県市町村 = " & Me.cbo県市町村
  とする。
   ※ 県市町村ID は数値型 前提
 
2. Columnsプロパティーを使用し
   " AND T_案件名_県市町村 Like '*" & Me.cbo県市町村.Coloumns(1) & "*'"
   の様にします。
 
   ただ、コンボボックスの値はマスターの値ですので、部分一致にする必要がなく
   " AND T_案件名_県市町村 = '" & Me.cbo県市町村.Coloumns(1) & "'"
   で良いはずです。

投稿日時: 18/01/22 15:17:58
投稿者: hana_brenda

hatena 様、返信ありがとうございます。
県市町村IDは数値型ですので数値型の方で書き換えてみましたが、パラメーターの入力 県市町村IDと出てきてしまい、そのままOKすると検索結果が1件も表示されません。数値を入れてOKすると、全レコードが表示されています。ヘルプ等検索してみましたが原因がわかりませんでした。
 If Not IsNull(Me.cbo県市町村) Then
        strFilter = strFilter & " AND 県市町村ID = " & Me.cbo県市町村
    End If
 
Suzu様、返信ありがとうございます。これから挑戦してみます。

回答
投稿日時: 18/01/22 16:03:00
投稿者: hatena
投稿者のウェブサイトに移動

hana_brenda さんの引用:
hatena 様、返信ありがとうございます。
県市町村IDは数値型ですので数値型の方で書き換えてみましたが、パラメーターの入力 県市町村IDと出てきてしまい、そのままOKすると検索結果が1件も表示されません。数値を入れてOKすると、全レコードが表示されています。ヘルプ等検索してみましたが原因がわかりませんでした。
 If Not IsNull(Me.cbo県市町村) Then
        strFilter = strFilter & " AND 県市町村ID = " & Me.cbo県市町村
    End If

「県市町村ID」は実際のフォームのレコードソースのフィールド名にしてください。
 
ID ではなく、市町村名で検索する方法もありますが(Suzuさんの2番めの方法)、その場合、Coloumns(1)として2列目の値を参照します。
ただ、インデックスが設定してあるIDの方で抽出したほうが高速です。

投稿日時: 18/01/23 10:47:32
投稿者: hana_brenda

hatena様返信ありがとうございました。
レコードソースのテーブルに[県市町村ID]が含まれておりませんでした。テーブルに[県市町村ID]を入れたら検索できるようになりました。他のコンボボックスも成功しました。ありがとうございました。
 

投稿日時: 18/01/23 10:52:25
投稿者: hana_brenda

Suzu様
何度かエラーが出ておりましたが、
 
  If Not IsNull(Me.cbo県市町村) Then
        strFilter = strFilter & " AND T_案件名_県市町村 = '" & Me.cbo県市町村.Column(1) & "'"
    End If
 
 If Not IsNull(Me.cbo課事務所) Then
        strFilter = strFilter & " AND T_案件名_課事務所 = '" & Me.cbo課事務所.Column(1) & "'"
    End If
で成功しました。
他のコンボボックスも挑戦してみます。
ありがとうございます。

トピックに返信