- ベストアンサー
ExcelVBA、ExcelDBで複数条件で検索
お世話になります。 ユーザフォームに検索条件を入力し、その複数の検索条件をAnd検索して、結果をリストに表示させる画面を作成しています。 結果リストはユーザフォームのオブジェクトです。 検索条件がひとつのときはFindNextを使い、次々と配列に入れてリストを作りました。 が、検索条件が複数になったとき、どのように検索するのが良いのかわかりません。 通常のDBであればSQLなどで持ってこれますが、ExcelDBの場合、どうしたらよいのか検討がつきません。 良い方法をお知りの方、お知恵をかしてください。 ○検索条件 支店 A and 名前に「藤」が含まれるデータ ○DB 社員ID、名前、所属支店 0001 加藤あいう A 0002 加藤えおこ B 0003 佐藤かきく A ○結果リスト 0001と0003の人が表示される このような感じです。 説明が足らないようでしたら補足要求をお願い致します。
- みんなの回答 (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
その他の回答 (1)
- wildcard
- ベストアンサー率54% (54/100)
│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
お礼
すぐに回答いただき、ありがとうございます。 Lenを使うことは頭に浮かばなく、またひとつ選択肢が増えました。 実際は2番目に回答していただいた方のを参考にしましたが、ありがとうございました。 またよろしくお願い致します。
お礼
回答ありがとうございます。 FindとFindNextの間に判定を入れ、ちゃんとやりたいようにできました。 今回は関数にしなかったのですが、関数にしたほうがすっきりしますね。 またよろしくお願い致します。