プロが教えるわが家の防犯対策術!

NETや本を見ながら独学で勉強している者です。

今、複数のcsvファイルの列方向での結合のマクロを組んでいます。

1.filepickerを使用しない。
2.メインフォルダのパスをセルに予め入力しておく(B2セルにフォルダパス)。
3.結合するcsvファイルは全てサブフォルダ直下にあり、A列に数値のみ入力されていて、他の種類のファイルは入っていない。

作りたいのは、一つのサブフォルダにあるcsvファイル全てを列方向に結合するものです。
今考えているのは下記の通りです。あともう一息だと思うのですが、うまく動作してくれません。
アドバイスを頂けたら嬉しいのですが。

Sub merge()

     Set GFBook = Workbooks.Add

       Do Until cFiles = ""
       Workbooks.Open Filename:=cFiles
       ActiveSheet. UsedRange. Copy GFBook.ActiveSheet.Cells(1, c)
       ActiveWorkbook.Close False
       c = GFBook.ActiveSheet.UsedRange.Columns.Count + 1

       Loop

     GFBook.SaveAs Filename:=Path & GFName, FileFormat:=xlWorkbookDefault

End Sub

「複数のcsvファイルをフォルダごと指定し」の質問画像

質問者からの補足コメント

  • ご回答ありがとうございます。
    お察しの通り、メインフォルダの下に、サブフォルダが40程ありまして、かつその下にcsvファイルがある状態です。
    ただ、他の作業については大体マクロを組み終えていて(ループ作業もそちらで組み込み済み)、このcsvの結合の部分だけが残ってしまっているので、余計なことはさておき、一つのフォルダの中の全てのcsvファイル結合として質問を出してみました。

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/07/16 20:26
  • ご回答ありがとうございます。

    実は非常に長いマクロの一部を切り取ったものです。変数定義とか入れますと膨大な量になります。詳細説明を細かくしても長文読むのは厭な方もいらっしゃるだろうし、ざっくりとした感じが伝わればいいかなと端折って出した結果です。

    今回のマクロの作業は、以下のような流れです。
    1.グラフ化するサブフォルダの名称をリスト化する。←添付画像はこれ/マクロ作成済。
    2.各サブフォルダごとにcsv結合してフォルダの名称を付けてエクセルとして保存。←ココが今回の質問の希望箇所
    3.各サブフォルダの名前を付けたファイルをそれぞれグラフ化する。←マクロ作成済
    4.これらを連結で完了です(1と3部分に組み込み済)。

    あと一息なのは、前後が全て終わっているので、これが終われば終了!だからですね。
    これはうっかりミスで抜けてる箇所とか順番間違えてる箇所も幾つかもありますが。

    No.3の回答に寄せられた補足コメントです。 補足日時:2020/07/16 20:45
  • ご回答ありがとうございます。

    >       c = GFBook.ActiveSheet.UsedRange.Columns.Count + 1
    ここが不要と書いていらっしゃいますが、必要です。
    この前の段階でコピペしてあるので、GFBookにはデータが入った状態ですから、次に備えてcの変数に1を足さないと上書きされてしまうからです。

    別の補足で書いていますが、この作業のあとグラフ化するマクロがあるので、このbookを閉じる必要がないので、閉じていません。

    Loopの条件を考えるのが少し苦手だったのですが、頂いた案はその参考になりそうなので、また勉強したいと思います。

    No.4の回答に寄せられた補足コメントです。 補足日時:2020/07/16 21:23

A 回答 (5件)

補足読みました


サブフォルダごとにExcelファイルを作るのですね。

  For i = 1 To UBound(subFolPath, 1)
  GFName = subFolPath(i,1)
  Set GFBook = Workbooks.Add



    Loop
  GFBook.SaveAs Filename:=ThisWorkbook.Path & GFName, FileFormat:=xlWorkbookDefault
  Next
こんな感じかな?

ブックは閉じていません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

シンプルで判り易くて素晴らしいです。
ここが足りてないという指摘が端的に判って助かります!

他のご回答者の皆さまも、それぞれご丁寧にご回答いただきましたが、足りない箇所を判り易く指摘して頂くという一点が質問者としてありがたく、また素晴らしいと判断致しましたので、ベストアンサーとさせて頂きます。

お礼日時:2020/07/16 21:35

こんばんは、


横から失礼します。

GFBook.ActiveSheet.UsedRange.Columns.Count + 1
のUsedRang.Columns.Countは、不要だと思います。なぜなら、Set GFBook = Workbooks.Add で
新規作成だからシート内は空のはず、、

C=1
Workbooks.Open Filename:=cFiles

ActiveWorkbook.Close False
c=c+1 で成立するのではないでしょうか?

ActiveSheet. UsedRange. Copy GFBook.ActiveSheet.Cells(1, c) についても

GFBookは新規ブックなので、 GFBook.sheets(1).Cells(1, c) インデックス1のシートに貼り付ければ良いと思います。

サブフォルダすべてからCSVを抽出するのであれば、すべてのパスを取得して 
cFiles = Dir(パス&ファイル名
Do Until cFiles = ""
のような感じになると思います。

>A列に数値のみ入力されていて  A列のみコピーすれば良いでしょうか?

サンプルを書きますが、やり方は、色々あります。
掲示されているコードを参考にDirで。変数名は変えました。
csv、Excelで開く形なのでそのまま
あくまでサンプルなので、すでに出来ているところなどは、変更してください。
不具合や解らない所は、補足してください。

Sub Sample()
Dim GFBook As Workbook
Dim subFolPath
Dim FolPath As String
Dim TargetCSV As String, GFName As String
Dim i As Long, c As Long

  With ThisWorkbook.Sheets(1) '添付の画像のシートが不明の為、VBAを実行するブックのインデックス1のシート
    FolPath = .Range("B2").Text & "\"
    subFolPath = .Range("D2:D" & .Cells(Rows.Count, "D").End(xlUp).Row)
  End With
  GFName = "CSV集計TEST"
  Set GFBook = Workbooks.Add
  For i = 1 To UBound(subFolPath, 1)
    TargetCSV = Dir(FolPath & subFolPath(i, 1) & "*.csv")
    Do Until TargetCSV = ""
      c = 1
      Workbooks.Open FolPath & subFolPath(i, 1) & TargetCSV
      With ActiveSheet
        .Range("A1:A" & .Cells(Rows.Count, "D").End(xlUp).Row).Copy GFBook.Sheets(1).Cells(1, c)
        ActiveWorkbook.Close False
      End With
      c = c + 1
      TargetCSV = Dir
    Loop
  Next
  GFBook.SaveAs Filename:=ThisWorkbook.Path & GFName, FileFormat:=xlWorkbookDefault

End Sub
この回答への補足あり
    • good
    • 0
この回答へのお礼

細かく書いて下さって、ありがとうございました。
判り易さと、質問者の足りないところを指摘して補足するという点で、他の回答者様をベストアンサーとさせて頂きましたが、頂いた案はとても参考になりました。
マクロを書いているシートを追加してそちらに結合というのも一つの案ではありますよね。
今回は各フォルダごとにデータをそれぞれ集計するという目的もありましたので、別のBookとしております。
ご丁寧なご回答をありがとうございました。

お礼日時:2020/07/16 21:46

こんにちは



他の方のご指摘にもあるように、「添付の図」と「ご説明の文章」と「ご提示のコード」がそれぞれバラバラなので、何がどうなっているのか、どうしたいのかがわかりません。
回答者には質問欄に提示される情報が全てですので、その内容が矛盾していたり、意味不明だったりするとひたすら謎が深まるだけになります。

>あともう一息だと思うのですが、うまく動作してくれません。
ご提示のコードで気が付くのは、未定義の変数をいきなり使おうとしている部分が多いこと。

>Workbooks.Open Filename:=cFiles
変数cFilesにはどこで初期値が与えられて、ループではどう変化していくのかまったく見えません。

>ActiveSheet. UsedRange. Copy GFBook.ActiveSheet.Cells(1, c)
ActiveSheetはひとつのはずなのですが??
変数cも初期値が与えられていないので、デフォルトの0を期待しているのか?
一方で、セルの行列の番号は1がスタートなので、0ではエラーになるだけ。

Cells(1, c)は、1行目は固定で列番号がcという意味になるけれど、添付の図と合致しているとは到底思えない。

読み込んだファイルの値はA列にだけあるのかも知れないけれど、UsedRangeだと(もしかすると)A列だけとは限らない可能性がありそうですが、問題ないのでしょうか。

>GFBook.SaveAs Filename:=Path & GFName
いきなり変数GFNameって、どこからでてきたのでしょうね?


・・・ 残念ですがあまり「あと一息」という印象は持てませんでした。
この回答への補足あり
    • good
    • 1
この回答へのお礼

マクロを書いている時に参考にしたのがこちらのベストアンサーです。
https://detail.chiebukuro.yahoo.co.jp/qa/questio …

素直に、一つのフォルダの中のcsvファイルの結合が今回の質問の希望でした。

>未定義の変数
先の補足の通り、変数定義は端折ってます。

>変数cFilesには
Loopは入れるのを忘れた&順番間違えた部分を確認し、このあと修正してます。

>ActiveSheetはひとつのはず
これは参考のベストアンサーの案を元にしてますが、csvの使用済セルをコピー、GFBookとして定義したbookの指定箇所へペーストですから、別に矛盾はしてないと思います。使えてますし。
添付の図は結合してファイル化するフォルダのリストです。

>Cells(1, c)は、1行目は固定で列番号がc
作成したBookにcsvのデータを順番に列方向へ貼りつけするのですから、こうなります。

>読み込んだファイルの値はA列にだけ
別の機械から出力されたデータで、今後そのデータ数が増減する可能性があるのでこの方が安全という判断です。

ご丁寧にご回答いただき、ありがとうございました。

お礼日時:2020/07/16 21:42

D列にあるのが『一つのサブフォルダ』って事なのでしょうかね?


そしてD列に書かれている分だけ同じ作業を行なう?
それともA6:B7に記載されているサブフォルダだけに絞り込む?
この回答への補足あり
    • good
    • 0
この回答へのお礼

二つお書き頂いているので、こちらに。
質問の内容を意図してピンポイントにしたのですが、却って混乱のもとになってしまったようですみません。
ご回答ありがとうございました。

お礼日時:2020/07/16 21:36

>複数のcsvファイルの列方向での結合



どう言うデータをどうしたいのか『可能なら』テキストエディタで開いた画像が見たいかな?

あと掲示している画像とコードの関係が良くわからない。
画像のデータは何を意味しているの?

>一つのサブフォルダにあるcsvファイル全てを

となっているのに画像ではサブフォルダは幾つもあるように感じるし。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています