[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フォルダ内のCSVを一つのブックにまとめたい』(CSVまとめたい)
よろしくお願いします
デスクトップの 作業CSV というフォルダに3、4個のCSVがあります
これを CSVまとめ.xlsx という名前のエクセルにまとめたいと思います
CSVの内容は
A B C D
1 いろいろ見出し行
2 2行目からデータの羅列
3 100行ほどデータが続きます
4 見出し行は全てのCSVで同じなので
5 最初のCSVの見出しがあれば、2個めのCSVからは2目からで大丈夫です
CSVまとめ.xlsx
A B C D
1 1個めのCSVの見出し行
2 1個めのCSVのデータ
100 2個めのCSVのデータ
250 3個めのCSVのデータ
よろしくお願いします
< 使用 Excel:Excel2019、使用 OS:Windows10 >
「QueryTables.Add」という方法をつかうと、CSVファイルなどのテキストファイルを制御しながらインポートできます。
よって、
(1)出力セルをA1セルとして覚える 初回のみ1行目を読み込むためのフラグを用意する (2)デスクトップの 作業CSV というフォルダを巡回してCSVファイルをかたっぱしから (3)QueryTables.AddでA1セル以降にインポートする / フラグをTrueにする (4)A1セルから100行ほど下がったセルを主力先セルとして覚え直す (5)QueryTables.Addで出力先セル以降にインポートする(もしもフラグなら2行目から読み込むことにする) / フラグをTrueにする
※4〜5を繰り返す
とすればよいでしょう。
※なお、「QueryTables.Add」を使った事例は過去ログにそれなりに蓄積されているとおもうので、興味があれば検索してみるとよいでしょう。 [[20220501221715]] 『セル内容の転記ミスについて』(hoge22) [[20211102112449]] 『vba ファイル seek 先頭に戻る』(hiro) [[20210909165158]] 『csvを結合するマクロで1つ目以外の1行目を消したい』(レッドル)
(もこな2) 2022/07/29(金) 15:16
ご参考。
https://www.wanichan.com/pc/excel/2019/1/03.html
https://excel-excel.com/beginner/beginner9.html
(わからん) 2022/07/29(金) 15:19
EXCELで直接CSVファイルを開いた場合、予期せぬデータの変換が行われる可能性がある。 (0001→1、1/2→2022/1/2、1E2→100など) その点は大丈夫だろうか? (ねむねむ) 2022/07/29(金) 15:42
https://excelkamiwaza.com/csvmerge.html
上記サイトを参考にして(コピペして)マクロを動かしましたが文字化けをしてしまいました
Sub csvmerge()
wpath = Range("B3")
wfile = Dir(wpath & "\")
flag = 0
Do While wfile <> ""
If InStr(wfile, ".csv") Then
flag = flag + 1
If flag = 1 Then
FileCopy wpath & "\" & wfile, ThisWorkbook.Path & "\output.csv"
Open ThisWorkbook.Path & "\output.csv" For Output As #1
Close #1
End If
Open ThisWorkbook.Path & "\output.csv" For Append As #1
Open wpath & "\" & wfile For Input As #2
Do Until EOF(2)
Line Input #2, w_str
Print #1, w_str
Loop
Close #2
Close #1
End If
wfile = Dir()
Loop
MsgBox "マージ完了", vbInformation
End Sub
現状CSVをエクセルで直接開いています
ねむねむ様
>EXCELで直接CSVファイルを開いた場合、予期せぬデータの変換が行われる可能性がある。
CSVを見てみましたが、変換はありませんでした
予期しない変換が発生するならエクセルでCSVを編集したりしないほうが良いのでしょうか
わからん様
CSVを開く、シフト+コントロール+矢印キーで範囲選択、コピー、CSVまとめ.xlsxを開く、貼り付け
をどうにかして短縮したいのです
もこな2様
過去ログのリンクありがとうございます
QueryTables.Add、PowerQuery調べてみます
DOS様
エクセルを使わない方法は思いもしませんでした
調べてみます
(CSVまとめたい) 2022/07/29(金) 16:35
まとめたいCSVをメモ帳で開くとUTF-8 BOM付となっていました
@echo off
powershell -c "$csvfiles=dir -file '*.csv';$csvfiles|%%{ipcsv $_ -encoding utf8}|epcsv 'comb.csv' -NoTypeInformation -encoding utf8"
メモ帳に上記をコピペ
保存して拡張子を.txtから.batに変更
ダブルクリックで実行
(CSVまとめたい) 2022/07/29(金) 17:16
Dim wpath As String
Dim wfile As String
Dim flag As Long
Dim w_str As Variant
wpath = ThisWorkbook.Path
wfile = Dir(wpath & "\")
flag = 0
Do While wfile <> ""
If InStr(wfile, ".csv") Then flag = flag + 1 If flag = 1 Then FileCopy wpath & "\" & wfile, ThisWorkbook.Path & "\output.csv" Open ThisWorkbook.Path & "\output.csv" For Output As #1 Close #1 End If Open ThisWorkbook.Path & "\output.csv" For Append As #1 Open wpath & "\" & wfile For Input As #2 Do Until EOF(2) Line Input #2, w_str Print #1, w_str Loop Close #2 Close #1 End If wfile = Dir() Loop MsgBox "マージ完了", vbInformation (まっち) 2022/07/29(金) 21:34
>まとめたファイルがまたCSVになってしまったのが残念ですが
CSVファイルはCSVファイルであって、何に変身すると思っているんですかね? ウルトラCSV、仮面CSVにはならないと思う。
https://search.yahoo.co.jp/search?p=csv%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%AF&fr=top_ga1_sa&ei=UTF-8&ts=4457&aq=0&oq=CSV&at=s&ai=a67e88f7-a372-41ab-83f6-461054dacc48
(DOS) 2022/07/29(金) 22:32
ありがとうございます
DOS様
>CSVファイルはCSVファイルであって、何に変身すると思っているんですかね?
> ウルトラCSV、仮面CSVにはならないと思う。
CSV→xlsxにしたいのが当初の目的でした
CSV→CSVになってしまい残念だという趣旨で発言しました
誤解を招くような発言で申し訳ありません
まっち様
ありがとうございます
出勤したら確認してみます
(CSVまとめたい) 2022/07/30(土) 11:15
>CSV→xlsxにしたいのが当初の目的でした 以下の記事を参考にしてワークシートに読み込むとか。 http://officetanaka.net/excel/vba/file/file10.htm
1行目を読み込まないようにするには、 Sample2 のコードでReadTextする前に、 SkipLine を用いればできます。 (ホタルイカ) 2022/08/01(月) 07:45
Sub test() Dim p As String, fn As String Dim wbk As Workbook Dim csv As Workbook
p = CreateObject("wscript.shell").specialfolders("desktop") & "\作業CSV\" fn = Dir(p & "*.csv") Set wbk = Workbooks.Open(p & fn)
Do fn = Dir() If fn = "" Then Exit Do Set csv = Workbooks.Open(p & fn)
csv.Sheets(1).Cells(1).CurrentRegion.Offset(1).Copy _
wbk.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Offset(1) csv.Close False Loop
wbk.SaveAs p & "CSVまとめ.xlsx", FileFormat:=xlOpenXMLWorkbook End Sub
(マナ) 2022/08/01(月) 11:17
■1
残念ながら今回はQueryTables.Addメソッドは不採用だったようですが、[[20210909165158]]のコードに軽く手を入れるだけで希望は満たせそうな気がします。時間があるときに研究されてみてはどうですか?
(3個めのファイルが250行目から始まる理由はわかりませんが・・・) Sub 手を入れてみた() Dim 対象フォルダ As String Dim ファイル名 As String Dim dstRNG As Range Dim 読込行 As Long
対象フォルダ = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" '★追加 Workbooks.Add Template:=xlWBATWorksheet '★追加 With Workbooks(Workbooks.Count).Worksheets(1) '★変更 読込行 = 1 Set dstRNG = .Range("A1") ファイル名 = Dir(対象フォルダ & "\*.csv") '★フォルダを変更
Do Until ファイル名 = "" With .QueryTables.Add(Connection:="TEXT;" & 対象フォルダ & "\" & ファイル名, Destination:=dstRNG) '★フォルダを変更 .TextFilePlatform = 65001 '★追加 .TextFileCommaDelimiter = True .TextFileStartRow = 読込行 .Refresh .Delete End With 読込行 = 2 Set dstRNG = dstRNG.Offset(100) '★変更 ファイル名 = Dir() Loop .Move End With With Workbooks(Workbooks.Count) .SaveAs Filename:=対象フォルダ & "結果出力" '★変更 .Close End With End Sub
■2
>CSVを見てみましたが、変換はありませんでした
ねむねむさんの心配されているようなことが起こらないのであれば、
(1)普通に【ブックとして開く】 (2)データのある(使用している)セル範囲をコピーする (3)まとめ用のシートに貼り付ける (4)(1)のブックを閉じる
※(1)〜(4)を繰り返す
(5)まとめ用のシートがあるブックを名前を付けて保存する
ということをすればよいはずです。
このアプローチであれば、繰り返しの部分はともかくとして、必要な命令は【マクロの記録】で調べることができます。
こちらも時間があるときに研究されてみては如何でしょうか。
(もこな2) 2022/08/01(月) 11:41
マナ様のマクロを実行すると
CSVまとめ.xlsxが作成されるのですが、一番最後に読み込んだCSVの内容だけCSVまとめ.xlsxにある状況です
CSV sheet1
A B C D E F G 1 見出し行 2 空 空 空 空 絶対に入力される 3 空 空 空 空 絶対に入力される 4 空 空 空 空 絶対に入力される 5 空 空 空 空 絶対に入力される
E列は絶対入力されます
マナ様のマクロの以下を変えれば動くのだろうと思いますが、どこをどのような数値に変えればよいのかわかりません
csv.Sheets(1).Cells(1).CurrentRegion.Offset(1).Copy _
wbk.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Offset(1)
いろいろ検索しましたが、Cells(Rows.Count, 1).End(xlUp).Row は最終行取得の方法なので、Cells(Rows.Count, 5).End(xlUp).Row でE列の最終行が取得できると思うのですが、これ以降はどうするのでしょうか
(CSVまとめたい) 2022/08/09(火) 17:09
csv.Sheets(1).Cells(1).CurrentRegion.Offset(1).Copy _ wbk.Sheets(1).Cells(Rows.Count, 5).End(xlUp).Offset(1) ^^^
(マナ) 2022/08/09(火) 17:56
(マナ) 2022/08/09(火) 18:05
csv.Sheets(1).Cells(1).CurrentRegion.Offset(1).Copy _ wbk.Sheets(1).Cells(Rows.Count, 5).End(xlUp).Offset(1, -4) ^^^ ^^^
(マナ) 2022/08/09(火) 18:08
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.