こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

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

マクロ初心者ですが難易度の高い仕事を任され困っています。

ディスクトップのAというファイル(C:¥Users¥Desktop¥A)にタイトルが「店名」+「-」+「日付(yyyymmddhhmm)」のcsvファイルが大量にあります。
sheet1のセルA1に「店名」を入力し、sheet1のセルA2に「抽出対象開始期間(yyyymmdd)」を入力、sheet1のセルA3に「抽出対象終了期間(yyyymmdd)」を入力し、該当するcsvファイルのデータをsheet2のA2から順に抽出したい(該当なしの際は該当なしを表示したい)のですがご教授お願いします。

※csvファイル名が日付(yyyymmddhhmm)となっている為、抽出条件(yyyymmdd)では重複する可能性がありますが、重複する全てのデータを抽出したい。

長文で申し訳ありませんがよろしくお願いします。

投稿日時 - 2019-08-22 11:15:08

QNo.9648186

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.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

投稿日時 - 2019-08-29 06:21:49

ANo.5

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

投稿日時 - 2019-08-27 08:45:13

ANo.4

サンプルコードを紹介したいものの、
期待する動作を読み取れないのです。

所定のフォルダー(C:¥Users¥Desktop¥AC:¥Users¥Desktop¥A)に
三河屋-201908101122.csv
といったファイルが多数あることは理解できますが
三河屋-201908101122.csv
四河屋-201908030203.csv
といったように複数の店名のファイルがあるんでしょうか?

複数あるとすれば、
>sheet1のセルA1に「店名」を入力し、sheet1のセルA2。。
この記述から、sheet1の結果は複数行になるんですね?

抽出対象開始期間、抽出対象終了期間は、
ファイル名から求めることのできる、
店ごとの最小の日付と最大の日付ということですか?

更に
>該当なしの際は該当なしを表示したい
これが意味不明です。
csvの中身が空だった場合のことでしょうか?

私だったら、
適当なシート(例えばSheet3)に
ファイル名の一覧をリストアップするところから始めます。

投稿日時 - 2019-08-27 06:41:35

ANo.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を使うほうがスッキリするので、書き方としては嫌われますね。

投稿日時 - 2019-08-23 07:09:26

ANo.2

> 「店名」のみや「日付」のみならデータ抽出できるのですが

でしたら
「店名」のみの条件 and 「日付」のみの条件
で抽出できるのではないでしょうか。

投稿日時 - 2019-08-22 20:44:51

ANo.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の値に置き換えればよい。

投稿日時 - 2019-08-22 14:24:38

お礼

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

投稿日時 - 2019-08-22 16:24:55

あなたにオススメの質問