[[20220729144055]] 『フォルダ内のCSVを一つのブックにまとめたい』(CSVまとめたい) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『フォルダ内の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 >


とりあえず

https://search.yahoo.co.jp/search?p=csv%E7%B5%90%E5%90%88+%E3%83%90%E3%83%83%E3%83%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB&fr=top_ga1_sa&ei=UTF-8&ts=13927&aq=0&oq=CSV%E3%81%91%E3%81%A4%E3%81%94%E3%81%86&at=s&ai=09e187cf-36dc-4411-b115-af802ee50427
(DOS) 2022/07/29(金) 15:04


Excel2019とのことなので、きっとPowerQueryや新しい手法があるのでしょうが、私は詳しくないので古いテクニックで。

「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


それぞれのCSVファイルを開いて、必要な行をコピーして、
「CSVまとめ.xlsx」へ貼り付ければできるでしょう。

ご参考。
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

DOS様 もこな2様 わからん様 ねむねむ様
レスありがとうございます

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になってしまったのが残念ですが、これが自分の限界っぽいです

まとめたい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


即席ですが(パワークエリは勉強中なのでVBAで)

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様

ありがとうございます

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


もこな2様 マナ様 ホタルイカ様
レスありがとうございます

マナ様のマクロを実行すると
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


マナ様
ありがとうございました
無事やりたいことができました
(CSVまとめたい) 2022/08/10(水) 16:46

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.