実現したいこと
-
検索システムでand・or検索を実装した際に、完全一致ではなく部分一致でも該当のデータが抽出されるようにしたい。
-
検索対象のファイルがアクティブでない状態でも検索がかけられるようにしたい。
前提
管理のためにマスターデータを作成し、検索システムを使用することで該当のデータをいち早く見つけ効率よく作業ができるようにしたいと思い、パソコンスキルの教科書さんを参考にマクロを作成しています。
マスターデータは項目ごとにシートが3つに分かれており、元号でファイルが分けられています。
そのため、閉じられているExcelファイルに対して複数条件検索をかけ、なおかつ該当データを抽出して一覧を作成できるようにしたいです。
発生している問題・エラーメッセージ
上記ページで紹介されているコードは下記に記載させていただきますが、私の力不足で上手く編集できず次の2点でつまずいております。
・マスターデータが同じファイルの別シートにある前提
・検索条件が完全一致となっていて部分一致ができない
該当のソースコード
'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub ExtractData() 'プログラム2|シート設定 Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = ThisWorkbook.Worksheets("Sheet1") Set ws2 = ThisWorkbook.Worksheets("ExtractedData") 'プログラム3|各シートの最終行を取得 Dim cmax1 As Long, cmax2 As Long cmax1 = ws1.Range("A65536").End(xlUp).Row cmax2 = ws2.Range("A65536").End(xlUp).Row 'プログラム4|データをリセット ws2.Range("B6:B7").ClearContents If Not cmax2 = 9 Then: ws2.Range("A10:E" & cmax2).ClearContents 'プログラム5|開始日と終了日を取得 Dim startdate As Date, enddate As Date startdate = ws2.Range("B2").Value enddate = ws2.Range("B3").Value 'プログラム6|取引先を取得 Dim torihiki As String torihiki = ws2.Range("B4").Value 'プログラム7|開始日、終了日、取引先が空欄か判定 Dim flag(2) As Boolean ' BooleanのDefault値はFalse If startdate = 0 Then: flag(0) = True If enddate = 0 Then: flag(1) = True If torihiki = "" Then: flag(2) = True 'プログラム8|変数の初期化 Dim n As Long: n = 10 Dim goukei As Long: goukei = 0 Dim kensu As Long: kensu = 0 'プログラム9|条件に合致した行を抽出 Dim i As Long For i = 2 To cmax1 If flag(0) = False Then If ws1.Range("C" & i).Value < startdate Then: GoTo Continue End If If flag(1) = False Then If ws1.Range("C" & i).Value >= enddate Then: GoTo Continue End If If flag(2) = False Then If ws1.Range("E" & i) <> torihiki Then: GoTo Continue End If 'プログラム10|条件に合致した行のデータのみを対象して分析 ws2.Range("A" & n & ":E" & n).Value = ws1.Range("A" & i & ":E" & i).Value goukei = goukei + ws1.Range("D" & i).Value kensu = kensu + 1 n = n + 1 'プログラム11|プログラム9で条件に合致しなかった場合、ここへジャンプ Continue: Next 'プログラム12|合計値と件数を出力 ws2.Range("B6").Value = goukei ws2.Range("B7").Value = kensu 'プログラム13|プログラム終了 End Sub
試したこと
'プログラム9|条件に合致した行を抽出 Dim i As Long For i = 2 To cmax1 If flag(0) = False Then If ws1.Range("C" & i).Value < startdate Then: GoTo Continue End If If flag(1) = False Then If ws1.Range("C" & i).Value >= enddate Then: GoTo Continue End If If flag(2) = False Then If ws1.Range("E" & i) <> torihiki Then: GoTo Continue End If
上記コード内のプログラム9のtorihiki部分を>torihiki にしてみたり、>1にしてみたりしました。
色々調べてみたのですが、関連した項目を見つけられず、数学的な考えで>が含む、
>1が何かしらの値・文字が入っていればという意味合いなのかなと思い試してみたのですが、
余計に訳が分からなくなり、今に至ります。
分かりにくい上に丸投げになっているように捉えられかねない内容となってしまっているかもしれませんが、皆様のお力をお借りしたく思います。
何卒宜しくお願い致します。
追記1
tatsu99様
以下ご確認のほどお願い致します。
'プログラム0|変数宣言の指定 Option Explicit 'プログラム開始 Sub ExtractData() 'シート設定 Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = ThisWorkbook.Worksheets("概要一覧") Set ws2 = ThisWorkbook.Worksheets("検索と抽出") '各シートの最終行を取得 Dim cmax1 As Long, cmax2 As Long cmax1 = ws1.Range("A1048576").End(xlUp).Row cmax2 = ws2.Range("A1048576").End(xlUp).Row '購入先を取得 Dim torihiki As String torihiki = ws2.Range("C2").Value '購入品の種類1を取得 Dim bihin1 As String bihin1 = ws2.Range("C3").Value '購入品の種類2を取得 Dim bihin2 As String bihin2 = ws2.Range("C4").Value '開始日と終了日を取得 Dim startdate As Date, enddate As Date startdate = ws2.Range("C5").Value enddate = ws2.Range("C6").Value '検索項目が空欄か判定 Dim flag(4) As Boolean ' BooleanのDefault値はFalse If torihiki = "" Then flag(0) = True If rokasenn = "" Then flag(1) = True If kasyo = "" Then flag(2) = True If startdate = 0 Then flag(3) = True If enddate = 0 Then flag(4) = True '変数の初期化 Dim n As Long: n = 12 '条件に合致した行を抽出 Dim i As Long For i = 3 To cmax1 If flag(0) = False Then If InStr(1, ws1.Range("C" & i).Value, torihiki, vbTextCompare) = 0 Then: GoTo Continue End If If flag(1) = False Then If InStr(1, ws1.Range("E" & i).Value, bihin1, vbTextCompare) = 0 Then: GoTo Continue End If If flag(2) = False Then If InStr(1, ws1.Range("F" & i).Value, bihin2, vbTextCompare) = 0 Then: GoTo Continue End If If flag(3) = False Then If ws1.Range("J" & i).Value < startdate Then: GoTo Continue End If If flag(4) = False Then If ws1.Range("J" & i).Value >= enddate Then: GoTo Continue End If '条件に合致した行のデータのみを対象して分析 ws2.Range("A" & n & ":M" & n).Value = ws1.Range("A" & i & ":M" & i).Value n = n + 1 'プログラム9で条件に合致しなかった場合、ここへジャンプ Continue: Next '合計値と件数を出力 Range("C8").Value = Application.WorksheetFunction.CountA(Range("A12:A1048576")) 'プログラム終了 End Sub Sub delete() 'シート設定 Dim ws2 As Worksheet Set ws2 = ThisWorkbook.Worksheets("検索と抽出") Dim cmax2 As Long ws2.Range("C2,C3,C4,C5,C6,C8").ClearContents If Not cmax2 = 11 Then: ws2.Range("A12:M10000" & cmax2).ClearContents End Sub
また、再度のご質問となり申し訳ございませんが、下記コードで抽出・転記していると思うのですが、マスターデータのテーマを使用してすべてを貼り付けたいので、「xlPasteAllUsingSourceTheme」に書き換えたいのですが、うまくいきません…。
こちらも併せてご教示いただけますと嬉しく思います。
何卒宜しくお願い申し上げます。
'条件に合致した行のデータのみを対象して分析 ws2.Range("A" & n & ":M" & n).Value = ws1.Range("A" & i & ":M" & i).Value n = n + 1
追記2
tatsu99様
再度ご確認のほど、宜しくお願い申し上げます。
<検索用の画面の検索項目指定箇所>
着色部分が検索項目として使用するものになります。
<検索結果の表示部分>
同様の項目をタイトルとして、検索ワードに該当した1行が転記されるようにしています。
上記2枚の画像でよろしいでしょうか…?

回答3件
あなたの回答
tips
プレビュー