はじめに
大量のテキストデータ(csvとか)をエクセルできれいに纏めたいとき、2、3個程度なら手動で全然いけるんですが、それが10個以上あると発狂しそうになるのでこの際マクロで効率化したいと思って調べた。
マクロ
ググってみると、Dir関数でファイルを調べて、それをOpen関数で開いていけばいけるぽい(簡単そう)。参考サイト・ブログについては最後に。
コード
今回は複数のCSVファイルから一括して取得しセルに表示させる。
Sub Read_csv()
'必要変数の定義(フォルダパス、ファイル名、セルの場所、配列)
Dim folderpath As String, arr
Dim file As String, FNo As Long, text As String
Dim i As Integer, address As String
'シートと出力される最初のセルを指定(アクティブセルなら、シート指定は不要)
Range("a1").Select
'csvファイルが存在するフォルダのパスを代入
folderpath = "X:¥XXXXX¥"
'正規表現で「*.csv」に該当するすべてのcsvファイルを指定
file = Dir( folderpath & "*.csv")
'ループ#1開始。
'複数ファイルがある場合の繰り返し処理
Do Until file = ""
FNo = FreeFile
'Dirでファイルを開く
Open folderpath & file For Input As #FNo
'ループ#2開始
'ファイルの終端まで(EOF)データを1行ずつ取り出す
Do Until EOF(FNo)
Line Input #FNo, text
'取り出したカンマで区切られた行のデータを配列に代入する
arr = Split(text, ",")
'データを貼り付ける直前のアクティブセルのアドレスを取っておく
address = ActiveCell.address
'配列に入っているデータを1つずつセルに代入していく
For i = 0 To UBound(arr)
ActiveCell.Value = arr(i)
ActiveCell.Offset(0, 1).Select
Next i
'アクティブセルを1行下に移動する。
Range(address).Offset(1, 0).Select
'ループ#2終了
Loop
'ファイルを閉じる
Close #FNo
'ダブルクォーテーションを空白に置換する(もしいらなければ省略可)
Cells.Replace What:="""", Replacement:=""
'Dirで次のファイルへ
file = Dir()
'ループ#1終了
Loop
End Sub
利用される場合は以下に注意。
・フォルダパスを自分用に変えてください。
・指定フォルダ配下に読み取りたいCSVファイルを置いてください。
やってみた感想
初めてVBAを勉強してみましたが、実務的にとても役立ちそう。VBA的にわからない部分も「マクロの記録」で一旦GUI操作をしてから、そのマクロのコードを確認すれば裏で何やってるかがわかって面白い。
参考資料
CSVファイルを読み込む:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug
https://www.adonetvb.com/Learning/DoUntilLoop.html
【Excel】シート内の文字列を置換するマクロ | ほそぼそプログラミング日記
qiita.com