• 締切済み

エクセル マクロ 条件付csvデータ抽出

マクロ初心者ですが難易度の高い仕事を任され困っています。 ディスクトップのAというファイル(C:¥Users¥Desktop¥A)にタイトルが「店名」+「-」+「日付(yyyymmddhhmm)」のcsvファイルが大量にあります。 sheet1のセルA1に「店名」を入力し、sheet1のセルA2に「抽出対象開始期間(yyyymmdd)」を入力、sheet1のセルA3に「抽出対象終了期間(yyyymmdd)」を入力し、該当するcsvファイルのデータをsheet2のA2から順に抽出したい(該当なしの際は該当なしを表示したい)のですがご教授お願いします。 ※csvファイル名が日付(yyyymmddhhmm)となっている為、抽出条件(yyyymmdd)では重複する可能性がありますが、重複する全てのデータを抽出したい。 長文で申し訳ありませんがよろしくお願いします。

みんなの回答

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

添付図右のSheet2の右のようなデータを作ってみました。(これは画像です) Sheet1のA1~A3に抽出条件を入力し、マクロ「抽出」を実行します。 添付図右のように抽出されました。該当がなければ、一行「該当なし」が表示されます。 店名は漢字2文字と限定できないはずなので、「-」を使って店名を特定しています。漢字でも半角でも文字数は自由です。 些細なことですが、「抽出対象開始期間」という表現は「抽出対象期間開始日」というような表現がいいと思います。仕様書で時間や期間と時刻をはっきりしないとおかしなことが起きかねません。 当方、Excel2010です。なお、厳重なエラーチェックは省いています。 Sub 抽出()   Const myFolder = "C:\Users\nishi6\Desktop\A"  '// フォルダー   Dim TENMEI As String  '// 店名   Dim strDay As Double  '// 開始日   Dim endDay As Double  '// 最終日   With Worksheets("Sheet1")  '// 設定データの取り込み     TENMEI = .Range("A1")     strDay = .Range("A2")     endDay = .Range("A3")   End With   With Worksheets("Sheet2")  '// Sheet2をクリア     .Range(.Range("A2"), .Range("A" & Rows.Count)).ClearContents   End With   Dim fTenmei As String  '// CSVファイルの店名   Dim fYMD As Long    '// CSVファイルの年月日   Dim pot As Integer   '// CSVファイルの「-」の位置   Dim buf As String    '// 抽出ファイル   Dim rw As Long     '// 行カウンタ   buf = Dir(myFolder & "\*.csv")   rw = 2   With Worksheets("Sheet2")     Do While buf <> ""       pot = InStr(buf, "-")       fTenmei = Left(buf, pot - 1)       fYMD = Mid(buf, pot + 1, 8)       If fTenmei = TENMEI Then            '// 店名の判定         If strDay <= fYMD And fYMD <= endDay Then  '// 日付の判定           .Range("A" & rw) = buf           rw = rw + 1         End If       End If       buf = Dir()     Loop     If rw = 2 Then .Range("A2") = "該当なし"   End With End Sub

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.5

#4への追記です。 ごめんなさい、私が読み誤っているかもしれません。 >sheet1のセルA1に「店名」を入力し、 >sheet1のセルA2に「抽出対象開始期間(yyyymmdd)」を入力、 >sheet1のセルA3に「抽出対象終了期間(yyyymmdd)」を入力し、 ここまでは、マクロの作業ではなく、利用者が手作業で行う作業ですか?

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.4

サンプルコードを紹介したいものの、 期待する動作を読み取れないのです。 所定のフォルダー(C:¥Users¥Desktop¥AC:¥Users¥Desktop¥A)に 三河屋-201908101122.csv といったファイルが多数あることは理解できますが 三河屋-201908101122.csv 四河屋-201908030203.csv といったように複数の店名のファイルがあるんでしょうか? 複数あるとすれば、 >sheet1のセルA1に「店名」を入力し、sheet1のセルA2。。 この記述から、sheet1の結果は複数行になるんですね? 抽出対象開始期間、抽出対象終了期間は、 ファイル名から求めることのできる、 店ごとの最小の日付と最大の日付ということですか? 更に >該当なしの際は該当なしを表示したい これが意味不明です。 csvの中身が空だった場合のことでしょうか? 私だったら、 適当なシート(例えばSheet3)に ファイル名の一覧をリストアップするところから始めます。

  • kon555
  • ベストアンサー率51% (1842/3559)
回答No.3

>>「店名」のみや「日付」のみならデータ抽出できるのですが、両方を一緒にという複合形ができません 単独条件の時のif構文が理解できているなら、複合条件の時は「AND」でそれを複合すればすぐにできますよ。 https://www.relief.jp/docs/excel-vba-if-statement-greater-than-and-less-than.html またはif構文の後にifを追加する入れ子構造状の書き方でも対応できます。 if ~~~ then  if ~~~ then   ~~~~  endif endif という形です。初心者ならこちらの方が分かりやすいと思います。 ただ基本的にはANDを使うほうがスッキリするので、書き方としては嫌われますね。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.2

> 「店名」のみや「日付」のみならデータ抽出できるのですが でしたら 「店名」のみの条件 and 「日付」のみの条件 で抽出できるのではないでしょうか。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

回答者を、プログラムの下請け人のように、扱うのはこの質問コーナーの趣旨ではないだろう。 この課題は、WEB照会すれば、近い課題の例が簡単に手に入るのだから勉強すること。 ーー >Aというファイル Aという(ファイル・フォルダ」というべきだろう。 ーー ある1つの指定フォルダにあるファイル名をすべてエクセルシートのセルに書き出す。(サブフォルダはないものとする) 「エクセル VBA ファイルの一覧を取得する」 VBAはGoogleで照会すれば、出てくるだろう。 ーー ファイルの一覧を取得する 2通りある。 ・Dir 利用法 http://officetanaka.net/excel/vba/file/file07.htm https://h1r0-style.net/excelvba/howto-get-list-of-files-in-the-folder ・VBSを使う方法 https://www.sejuku.net/blog/34439 の後半に FileSystemObjectを使う方法 ーー そしてエクセルシート上で、エクセルの「フィルタ機能」(手操作やVBAで) で日付の条件をつけて、目指すものを抜き出してはどうだろう。 あえて、すべてをVBAで処理しない方法だが。 ーー その際日付部分を分離して、別列に書き出しておくと、考えやすい。 参考例 Sub test01() x = "店名-2019082399999" y = Mid(x, 4, 4) & "/" & Mid(x, 8, 2) & "/" & Mid(x, 10, 2) MsgBox y d = DateValue(y) '<-- 独立セルにセット MsgBox d End Sub 日付で、フィルタは データーフィルター詳細設定ー日付フィルター指定の範囲ーフィルタオプション ーカレンダーで始期と終期を(範囲)指定する。 この操作をマクロの記録を取って、出てきたコードを修正すれば、VBA化できる。条件をA2とA3の値に置き換えればよい。

hh5088
質問者

お礼

おっしゃるとおり自分で勉強し解決するのがいいのでしょうが、独学で始めたばかりなので「店名」のみや「日付」のみならデータ抽出できるのですが、両方を一緒にという複合形ができません。現在は「店名」のみを抽出し、オートフィルターを駆使しデータを加工しております。しかし、これでは時間が掛かり過ぎてしまい困っているところでした。ご指摘、ご指導ありがとう御座いました。

専門家に質問してみよう