• ベストアンサー

ExcelVBA、ExcelDBで複数条件で検索

お世話になります。 ユーザフォームに検索条件を入力し、その複数の検索条件をAnd検索して、結果をリストに表示させる画面を作成しています。 結果リストはユーザフォームのオブジェクトです。 検索条件がひとつのときはFindNextを使い、次々と配列に入れてリストを作りました。 が、検索条件が複数になったとき、どのように検索するのが良いのかわかりません。 通常のDBであればSQLなどで持ってこれますが、ExcelDBの場合、どうしたらよいのか検討がつきません。 良い方法をお知りの方、お知恵をかしてください。 ○検索条件 支店 A and 名前に「藤」が含まれるデータ ○DB 社員ID、名前、所属支店 0001 加藤あいう A 0002 加藤えおこ B 0003 佐藤かきく A ○結果リスト 0001と0003の人が表示される このような感じです。 説明が足らないようでしたら補足要求をお願い致します。

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

Excelで多量のデータを扱ったことは余りありませんが、『FindNext』を使って書いてみました。 質問はこのようなことでしょうか? 標準モジュールに貼り付けます。 (Sheet1)  │ A  │  B  │  C  │ ―┼――――┼―――――┼―――――┼ 1│社員ID│ 名 前 │所属支店 │ 2│ 1  │加藤あいう│  A  │ 3│ 2  │加藤えおこ│  B  │ 4│ 3  │佐藤かきく│  A  │ このような表を想定しています。(当方Excel2000です) 標準モジュールに貼り付け。『CellsFind』を実行します。 Sub CellsFind()   '『藤』、『A』は何らかの手段で設定することとします   Dim fndStr1 As String, fndStr2 As String     fndStr1 = "藤"     fndStr2 = "A"   Call CellsFind_Sub(fndStr1, fndStr2) End Sub Sub CellsFind_Sub(strWhat1 As String, strWhat2 As String)   Dim ws1 As Worksheet    'シート1   Dim rgShimei As Range    '氏名検索範囲   Dim fndCell As Range    '見つけたセル   Dim fstAddress As String  '最初に見つけたセルの番地     Set ws1 = Worksheets("Sheet1")     Set rgShimei = ws1.Range("B1:B" & ws1.Range("B65536").End(xlUp).Row)   With rgShimei     Set fndCell = .Find(strWhat1, LookIn:=xlPart) '『strWhat1』が含まれるセルを検索する     If Not fndCell Is Nothing Then         '見つかった場合       fstAddress = fndCell.Address        '最初に見つかったセル番地       Do         '**** 追加の判定を行う ****         If fndCell.Offset(0, 1) = strWhat2 Then           'ここで何らかの処理・・・配列に追加など           With fndCell             MsgBox .Offset(0, -1).Text & " " & .Text & _                            " " & .Offset(0, 1).Text           End With         End If         '**************************         Set fndCell = .FindNext(fndCell)    '次のセルを探す       Loop While Not fndCell Is Nothing And fndCell.Address <> fstAddress     End If   End With End Sub

cat_tomato
質問者

お礼

回答ありがとうございます。 FindとFindNextの間に判定を入れ、ちゃんとやりたいようにできました。 今回は関数にしなかったのですが、関数にしたほうがすっきりしますね。 またよろしくお願い致します。

その他の回答 (1)

  • wildcard
  • ベストアンサー率54% (54/100)
回答No.1

  │A    B     C ─┼────────────── 1 │社員ID  名前  所属支店 2 │0001  加藤あいう   A 3 │0002  加藤えおこ   B 4 │0003  佐藤かきく   A 表が上記の構成だとすると、下記のコードなどどうでしょうか?   Dim a, b, c, d, e As Long   Dim AA, BB As String   AA = InputBox("「所属支店」を入力してください。")   BB = InputBox("「名前」の一部を入力してください。")   e = Len(BB) '部分一致検索の文字数を調べる   a = Range("A1").CurrentRegion.Rows.Count '表の行数を調べる。   For b = 2 To a     If Cells(b, 3).Value = AA Then       c = Len(Cells(b, 2).Value)       For d = 1 To c         If Mid(Cells(b, 2).Value, d, e) = BB Then           MsgBox b & "行目が検索条件と合致します"         End If       Next d     End If   Next b

cat_tomato
質問者

お礼

すぐに回答いただき、ありがとうございます。 Lenを使うことは頭に浮かばなく、またひとつ選択肢が増えました。 実際は2番目に回答していただいた方のを参考にしましたが、ありがとうございました。 またよろしくお願い致します。

関連するQ&A