Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 8 : Access 2003)
フリーワード検索で該当データを全てフィルターしたい
投稿日時: 19/06/09 21:30:40
投稿者: 匿名

はじめまして。
Accessで顧客データのデータベースを作成中です。
こちらのURLのように、
(https://tsware.jp/tips/tips_626.htm)
フォームにテキストボックスを設置し、
テキストボックスに入力されたキーワードをサブフォームのデータの中から検索し、
該当するレコードを抽出したいのですが、
こちらのURLの通りのコードでやってみたところ、
該当データが一件しか表示されません。
該当データをすべて表示するように修正したいのですが、
こういったことは可能でしょうか。
 
状況は下記の通り。
 
サブフォーム(元データは「顧客データ」クエリ)
顧客名 郵便番号 住所 電話番号
短いテキスト 郵便番号 短いテキスト 短いテキスト
A社 110-2200 東京都渋谷区1-2-3 03-5456-xxxx
B社 110-2222 東京都足立区2-2-2 03-6234-xxxx
C社 140-3333 大阪府大阪市北区 06-7463-xxxx
D社 137-5454 静岡県熱海市4752 735-9651-xxxx
 
フォームのテキストボックスに「東京都」と入力したら、
A社とB社のデータをフィルターしたいのですが、
A社しか抽出されません。
 
 
 
Private Sub 検索キーワード_AfterUpdate()
 
  Dim rst As Recordset
  Dim sfrm As SubForm
  Dim iintLoop As Integer
 
  If IsNull(Me!検索キーワード) Then
    Beep
    Exit Sub
  End If
 
  Set sfrm = Me!frm顧客マスタ_sub
 
  Set rst = sfrm.Form.RecordsetClone
  With rst
    .MoveFirst
    Do Until .EOF
      For iintLoop = 0 To .Fields.Count - 1
        If InStr(CStr(Nz(.Fields(iintLoop))), Trim$(Me!検索キーワード)) > 0 Then
          sfrm.Form.Recordset.AbsolutePosition = rst.AbsolutePosition
          sfrm(.Fields(iintLoop).Name).SetFocus
          .Close
          Exit Sub
        End If
      Next iintLoop
      .MoveNext
    Loop
    .Close
 
    Beep
    MsgBox "指定したキーワードは見つかりませんでした!", vbOKOnly + vbInformation
 
  End With
 
End Sub

回答
投稿日時: 19/06/10 10:59:08
投稿者: hatena
投稿者のウェブサイトに移動

匿名 さんの引用:
こちらのURLのように、
(https://tsware.jp/tips/tips_626.htm)
フォームにテキストボックスを設置し、
テキストボックスに入力されたキーワードをサブフォームのデータの中から検索し、
該当するレコードを抽出したいのですが、
こちらのURLの通りのコードでやってみたところ、
該当データが一件しか表示されません。
 
・・・中略
 
フォームのテキストボックスに「東京都」と入力したら、
A社とB社のデータをフィルターしたいのですが、
A社しか抽出されません。

 
やりたいとこは、検索(該当レコードへの移動)ではなく、抽出(該当レコードのみに絞り込む)ですよね。
リンク先(提示のコード)は、検索であって、抽出ではありません。
 
Filterプロパティに抽出条件を設定します。
 
Private Sub 検索キーワード_AfterUpdate() 
 
    If IsNull(Me!検索キーワード) Then 
        Beep 
        Exit Sub 
    End If 
 
    With Me.Me!frm顧客マスタ_sub.Form
        ,Filter = "住所 Like '*" & Me!検索キーワード &  "*'"
        .FilterOn = True
        If .Recordset.Recordcount = 0 Then
            MsgBox "指定したキーワードは見つかりませんでした!", vbOKOnly + vbInformation
        End If
    End With 
 
End Sub

 
「住所」フィールド対象の場合のコードです。

投稿日時: 19/06/10 11:47:37
投稿者: 匿名

ご指導ありがとうございます。
  
やりたいことは検索ではなく、
抽出で間違いありません。
  
ちなみに、顧客名 郵便番号 住所 電話番号
すべてのフィールドからキーワード検索を行うことは可能でしょうか?

回答
投稿日時: 19/06/10 14:28:34
投稿者: hatena
投稿者のウェブサイトに移動

抽出条件を、Or でつなげばいいでょしう。
あるいは、フィールドを連結してそれを対象にしてもいいですね。
 

Private Sub 検索キーワード_AfterUpdate() 
 
    If IsNull(Me!検索キーワード) Then 
        Beep 
        Exit Sub 
    End If 
 
    With Me.Me!frm顧客マスタ_sub.Form
        ,Filter = "住所 & ';' & 郵便番号 & ';' & 住所 & ';' & 電話番号" & _
                  " Like '*" & Me!検索キーワード &  "*'"
        .FilterOn = True
        If .Recordset.Recordcount = 0 Then
            MsgBox "指定したキーワードは見つかりませんでした!", vbOKOnly + vbInformation
        End If
    End With 
 
End Sub

 
フィールドを連結するときには、データに含まれる可能性のない区切り文字を挿入するようにします。
上記は区切り文字に ; を使ってます。
 

回答
投稿日時: 19/06/10 17:30:40
投稿者: namidaneko

Private Sub 検索キーワード_AfterUpdate() 
 
    If IsNull(Me!検索キーワード) Then 
        Beep 
        Exit Sub 
    End If 
 
    With Me.Me!frm顧客マスタ_sub.Form
        ,Filter = "住所 & ';' & 郵便番号 & ';' & 住所 & ';' & 電話番号" & _
                  " Like '*" & Me!検索キーワード &  "*'"
        .FilterOn = True
        If .Recordset.Recordcount = 0 Then
            MsgBox "指定したキーワードは見つかりませんでした!", vbOKOnly + vbInformation
        End If
    End With 
 

End Sub

 
フィールドを連結するときには、データに含まれる可能性のない区切り文字を挿入するようにします。
上記は区切り文字に ; を使ってます。
 
[/quote]
 
 
 
ありがとうございます!
こちらのコードで無事イメージ通り動きました!
 
どうつないでいけばいいのか、全く想像もつかなかったのですが、とても勉強になりました。
ありがとうございます。
 
ちなみに、
こちらのコードの変数宣言なのですが、
 
Private Sub コマンド_Click()
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim strmsg As String
    Set cn = CurrentProject.Connection
    Set rs = New ADODB.Recordset
 
これで動くことは動いたのですが、
合ってますか?
自分でなにかおかしい気もしてます…
初歩的すぎてすみません。

回答
投稿日時: 19/06/11 08:44:02
投稿者: hatena
投稿者のウェブサイトに移動

namidaneko さんの引用:

ちなみに、
こちらのコードの変数宣言なのですが、
 
Private Sub コマンド_Click()
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim strmsg As String
    Set cn = CurrentProject.Connection
    Set rs = New ADODB.Recordset
 
これで動くことは動いたのですが、
合ってますか?

このフォーム上のコマンドボタンのクリック時のものですか。
 
変数宣言自体はまちがっていないと思いますが、
連結フォームで、ADOのレコードセットを使用する場面は普通はないと思いますか、
このあと、どのような処理を実行しているのでしょうか。

投稿日時: 19/06/11 11:19:04
投稿者: 匿名

フォーム上に設置したボタンを押して、抽出を実行します。
実行後はExcelにエクスポート、または、抽出を解除し、フォームを閉じます。
   
ADOについて、
よくわかっておらず、
使い方がよくおかしいかもしれません…
  
この場合、 Dim〜で変数宣言するのが正しいのでしょうか。

回答
投稿日時: 19/06/11 12:30:05
投稿者: hatena
投稿者のウェブサイトに移動

匿名 さんの引用:
この場合、 Dim〜で変数宣言するのが正しいのでしょうか。

はい、その部分は正しいです。

投稿日時: 19/06/12 19:38:57
投稿者: 匿名

ありがとうございました!
おかげさまで無事解決しました!

投稿日時: 19/06/12 19:39:31
投稿者: 匿名

解決済にさせてもらいます。