PR

Excel VBAでCsvを結合する方法 Part1

Excel

csv取り扱い方は色々ありますが今回はExcel内のVBAを使ってCsvを結合する方法を紹介します。

スポンサーリンク

VBAの準備

開発の表示

Excelの初期状態では開発の項目が表示されてないのでリボンのユーザー設定から表示しましょう。

開発が表示されたらVisual Basicをクリックします。

モジュールの追加

コードはシートごとにも記載出来ますが基本的にはモジュールを追加して記載します。
プロジェクト欄から挿入⇒標準モジュールをクリックしてモジュールを追加します。

モジュールが追加できたのでコードを書く準備ができました。

作業フォルダの生成

Csvを結合する取り込み元と出力先のフォルダを用意します。
Excelを配布したら使えるようにしたいのでVBAでフォルダ作成を行うようにしたいと思います。

VBAでフォルダ生成するには

フォルダを作成するのは意外と簡単で MkDir フルパスのフォルダ名 で記載します。
Excelの保存場所に生成する場合はフルパスはThisWorkbook.Pathで取得できるので
ThisWorkbook.Path & “\” & フォルダ名で作成できます。

このプログラムでImportとOutputのフォルダを作成することができます。
Sub 作業フォルダ生成()
Dim path0 As String
path0 = ThisWorkbook.Path

Dim importfolder As String
Dim outputfolder As String
importfolder = “Import”
outputfolder = “Output”

MkDir path0 & “\” & importfolder
MkDir path0 & “\” & outputfolder
End Sub

実行するだけで作業フォルダが作成されました!

Csv結合のコーディング

Csvの用意

サンプル用のCsvを下記サイトから入手したのでこちらを使ってやりたいと思います。

自由に使えるランダムなサンプルデータを生成する(Excel、無料テンプレート)|成川雄大
どなたでもご自由にご利用ください Excelで下記のようなサンプル注文データをランダムで自動生成するためのものを用意しました。例では会員のいる何らかのWebサービスを想定しています。 人に何かを教える時、プログラミングのテストを行う時、何に...

ダウンロードしたファイルは下記のように
2つ設置こちらを結合して一つのcsvを作りたいと思います。

Csv内容取得について

作業フォルダ作成で作ったところはそのまま使います。

Csvを取得するには下記のコードを使います。
Open フルパスのCsv名 For Input As #1
複数同時に読み込む場合は#2,#3と分けるとよいです。
行の読み込みはLine Input #1,格納する変数名と書きます。

Csvの取得について

フルパスのCsv名はCsvの名称が決まってない場合は別途取得が必要になります。
Import内のcsvを取り込む対象にしたいと思います。
ファイルの有無チェックはDir関数で取得することができます。
Dir(作業フォルダのフルパス)

これとCsvの情報抽出を組み合わせると下記のように記述することができます。
これで複数のCsvファイルを読み込むことができるようになりました。

csvname = Dir(path0 & “\” & importfolder & “\”)
Do While csvname <> “”
Open path0 & “\” & importfolder & “\” & csvname For Input As #1
Do Until EOF(1)
Line Input #1, csvstr
Debug.Print csvstr
Loop
Close #1 ‘Csvを閉じる
csvname = Dir() ‘次のcsvへ
Loop

Debug.Print csvstr の部分はイミディエイトウインドウに表示されるだけなので
結合用の出力分を最後に作成します。

この部分がフォルダ内のCsvを読み込む処理
Do While csvname <> “”
   csvname = Dir()
Loop

この部分がCsvの1行ごとのデータを取得している処理
Do Until EOF(1)
Line Input #1, csvstr
Loop

csvstrが1行分のデータを格納しているのでこれを出力に使うとよい

Csvの出力について

Csvの出力はOpen フルパスのCsv名 For Output As #2 のように記述します。
#1は使ってるので#2を使います。
書き出しはPrint #2, 変数名で変数内容のCsvを出力します。
これを毎行繰り返す

Open path0 & “\” & outputfolder & “\” & “結合したcsv.csv” For Output As #2
csvname = Dir(path0 & “\” & importfolder & “\”)
Do While csvname <> “” ‘フォルダ内繰り返し
Open path0 & “\” & importfolder & “\” & csvname For Input As #1 ‘csvを開く
Do Until EOF(1) ‘csv無いの繰り返し処理
Line Input #1, csvstr ‘csvの1行部分を変数へ格納
Print #2, csvstr
Loop
Close #1 ‘Csvを閉じる
csvname = Dir() ‘次のcsvへ
Loop
Close #2

この部分でCsv指定の場所へ出力できるようになります。
Open path0 & “\” & outputfolder& “\” & “結合したcsv.csv” For Output As #2
この部分で1行出力されます。
Print #2, csvstr

プログラムを起動するとoutputのフォルダにCsvが生成出来ました。
行数も2,000行と2つ分合体しています。

まとめ

今回作成したコードは下記のような感じです。そのままコピペで使えます!

Sub 作業フォルダ生成()
Dim path0 As String
path0 = ThisWorkbook.Path
Dim importfolder As String
Dim outputfolder As String
importfolder = “Import”
outputfolder = “Output”
MkDir path0 & “\” & importfolder
MkDir path0 & “\” & outputfolder
End Sub

Sub Csv結合()
Dim path0 As String
path0 = ThisWorkbook.Path
Dim importfolder As String
Dim outputfolder As String
importfolder = “Import”
outputfolder = “Output”
Dim csvname As String
Dim csvstr As String
Open path0 & “\” & outputfolder & “\” & “結合したcsv.csv” For Output As #2
csvname = Dir(path0 & “\” & importfolder & “\”)
Do While csvname <> “” ‘フォルダ内繰り返し
Open path0 & “\” & importfolder & “\” & csvname For Input As #1 ‘csvを開く
Do Until EOF(1) ‘csv無いの繰り返し処理
Line Input #1, csvstr ‘csvの1行部分を変数へ格納
Print #2, csvstr
Loop
Close #1 ‘Csvを閉じる
csvname = Dir() ‘次のcsvへ
Loop
Close #2
MsgBox “出力しました。”
End Sub

このままでもいいけど

このプログラムはこのままでも使えますがExcel VBAなのにExcelを全く使ってないんですよね。
なのでExcel側にも設定をしてExcel自体を配れるように改造したいと思います。
後日記載しますので少々お待ちください!

コメント