
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

No.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
こんな感じかな?
ブックは閉じていません。
ご回答ありがとうございます。
シンプルで判り易くて素晴らしいです。
ここが足りてないという指摘が端的に判って助かります!
他のご回答者の皆さまも、それぞれご丁寧にご回答いただきましたが、足りない箇所を判り易く指摘して頂くという一点が質問者としてありがたく、また素晴らしいと判断致しましたので、ベストアンサーとさせて頂きます。
No.4
- 回答日時:
こんばんは、
横から失礼します。
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
細かく書いて下さって、ありがとうございました。
判り易さと、質問者の足りないところを指摘して補足するという点で、他の回答者様をベストアンサーとさせて頂きましたが、頂いた案はとても参考になりました。
マクロを書いているシートを追加してそちらに結合というのも一つの案ではありますよね。
今回は各フォルダごとにデータをそれぞれ集計するという目的もありましたので、別のBookとしております。
ご丁寧なご回答をありがとうございました。
No.3
- 回答日時:
こんにちは
他の方のご指摘にもあるように、「添付の図」と「ご説明の文章」と「ご提示のコード」がそれぞれバラバラなので、何がどうなっているのか、どうしたいのかがわかりません。
回答者には質問欄に提示される情報が全てですので、その内容が矛盾していたり、意味不明だったりするとひたすら謎が深まるだけになります。
>あともう一息だと思うのですが、うまく動作してくれません。
ご提示のコードで気が付くのは、未定義の変数をいきなり使おうとしている部分が多いこと。
>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って、どこからでてきたのでしょうね?
・・・ 残念ですがあまり「あと一息」という印象は持てませんでした。
マクロを書いている時に参考にしたのがこちらのベストアンサーです。
https://detail.chiebukuro.yahoo.co.jp/qa/questio …
素直に、一つのフォルダの中のcsvファイルの結合が今回の質問の希望でした。
>未定義の変数
先の補足の通り、変数定義は端折ってます。
>変数cFilesには
Loopは入れるのを忘れた&順番間違えた部分を確認し、このあと修正してます。
>ActiveSheetはひとつのはず
これは参考のベストアンサーの案を元にしてますが、csvの使用済セルをコピー、GFBookとして定義したbookの指定箇所へペーストですから、別に矛盾はしてないと思います。使えてますし。
添付の図は結合してファイル化するフォルダのリストです。
>Cells(1, c)は、1行目は固定で列番号がc
作成したBookにcsvのデータを順番に列方向へ貼りつけするのですから、こうなります。
>読み込んだファイルの値はA列にだけ
別の機械から出力されたデータで、今後そのデータ数が増減する可能性があるのでこの方が安全という判断です。
ご丁寧にご回答いただき、ありがとうございました。
No.1
- 回答日時:
>複数のcsvファイルの列方向での結合
どう言うデータをどうしたいのか『可能なら』テキストエディタで開いた画像が見たいかな?
あと掲示している画像とコードの関係が良くわからない。
画像のデータは何を意味しているの?
>一つのサブフォルダにあるcsvファイル全てを
となっているのに画像ではサブフォルダは幾つもあるように感じるし。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
バッチでCSVを処理する時、空の...
-
【C#】パス名で無効な文字
-
csvファイルのデータの一部を取...
-
CSV形式での保存時に”文字列...
-
エクセルVBA 大容量CSVファイル...
-
複数のcsvファイルをExcelに一...
-
ACCESS CSVファイルをインポ...
-
特定文字を入ってるCSVの特定の...
-
Cでエクセルデータ作れますか?
-
vb2010でCSVファイルを並び替え...
-
ACCESS VBAで、CSVにデータを吐...
-
マクロから出力されるcsvのダブ...
-
COBOL85でのCSVファ...
-
VBScriptでcsvファイルの編集は...
-
VBS or BATでCSVファイルに入っ...
-
エクセル形式のファイルの読み込み
-
ADODBでSQL実行前にレコードセ...
-
VBSでソート&ファイル分割
-
複数のcsvファイルをフォルダご...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
バッチでCSVを処理する時、空の...
-
【C#】パス名で無効な文字
-
csvファイル 項目数取得
-
マクロから出力されるcsvのダブ...
-
CSV形式での保存時に”文字列...
-
エクセルVBA 大容量CSVファイル...
-
csvファイルでの日付設定「yyyy...
-
【ExcelVBA】UTF-8の文字コード...
-
CSVファイルの項目行を削除...
-
【エクセルVBA】お願いします。...
-
csvファイルを列数ごとに分割す...
-
VBAでCSVファイルのインポート...
-
【エクセル マクロ】読み込ん...
-
エクセル形式のファイルの読み込み
-
巨大なCSVの加工(指定列のみの...
-
Windowsのバッチファイルについ...
-
COBOLでCSVをインプットにして...
-
CSV出力して、MS/EXCELで開くと...
-
CSV形式のファイルを読み込んで...
おすすめ情報
ご回答ありがとうございます。
お察しの通り、メインフォルダの下に、サブフォルダが40程ありまして、かつその下にcsvファイルがある状態です。
ただ、他の作業については大体マクロを組み終えていて(ループ作業もそちらで組み込み済み)、このcsvの結合の部分だけが残ってしまっているので、余計なことはさておき、一つのフォルダの中の全てのcsvファイル結合として質問を出してみました。
ご回答ありがとうございます。
実は非常に長いマクロの一部を切り取ったものです。変数定義とか入れますと膨大な量になります。詳細説明を細かくしても長文読むのは厭な方もいらっしゃるだろうし、ざっくりとした感じが伝わればいいかなと端折って出した結果です。
今回のマクロの作業は、以下のような流れです。
1.グラフ化するサブフォルダの名称をリスト化する。←添付画像はこれ/マクロ作成済。
2.各サブフォルダごとにcsv結合してフォルダの名称を付けてエクセルとして保存。←ココが今回の質問の希望箇所
3.各サブフォルダの名前を付けたファイルをそれぞれグラフ化する。←マクロ作成済
4.これらを連結で完了です(1と3部分に組み込み済)。
あと一息なのは、前後が全て終わっているので、これが終われば終了!だからですね。
これはうっかりミスで抜けてる箇所とか順番間違えてる箇所も幾つかもありますが。
ご回答ありがとうございます。
> c = GFBook.ActiveSheet.UsedRange.Columns.Count + 1
ここが不要と書いていらっしゃいますが、必要です。
この前の段階でコピペしてあるので、GFBookにはデータが入った状態ですから、次に備えてcの変数に1を足さないと上書きされてしまうからです。
別の補足で書いていますが、この作業のあとグラフ化するマクロがあるので、このbookを閉じる必要がないので、閉じていません。
Loopの条件を考えるのが少し苦手だったのですが、頂いた案はその参考になりそうなので、また勉強したいと思います。