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

Excel

今回は前回作成したVBAを少し改造してExcel上で設定を持たせたいと思います。

スポンサーリンク

Excel側の設定について

マクロ起動ボタンの設置

前回作ったのはVBA部分のみなのでVBA側からしか起動できません
この二つの処理の起動ボタンを用意します。

開発⇒挿入⇒フォームコントロールにボタンが有るのでクリックします。
シート上に設置ができるので大きさを指定して設置します。

設置するとマクロの登録画面が開くので
使用するマクロを選択します。
今回は作業フォルダ生成を選びました。

初期の名前なので分かりやすい名称へ変更しておきます。

図形に対して右クリックでマクロの登録も可能です。

結果はどちらも同じです。
ちなみにフォーム用のボタンは調整などを行う時は
デザインモードへ変更する必要が有る場合が有ります。
図形は形を色々作れるので使い分けましょう。

前回のマクロのカスタマイズ

作業フォルダ作成のマクロ

作業フォルダ作成部分で変数にできそうなのはフォルダ名ですね。
Excelのセル上にフォルダ名の設定値を設けます。

今回はC列に設定値を作りました。これに合わせてVBAを改良します。

この部分を変更します。

各設定値を読み込むように設定します。

作業フォルダ作成ボタンをクリックすると
設定値のフォルダが作成されました。

作成したマクロを2回クリックした場合

2回クリックすると現状のプログラムだと下記のエラーが発生してしまいます。
すでにフォルダが作成されているためです。

設定値のフォルダが既にある場合はフォルダ作成をスキップする処理へ変更します。

フォルダすでに存在するかのチェックは
DIR(フォルダまでのフルパス, vbDirectory)で確認ができます。
先ほどの部分をこのように記述するとフォルダが無い時だけ作成することができます。
If Dir(path0 & “\” & importfolder, vbDirectory) = “” Then
  MkDir path0 & “\” & importfolder
End If

また、作成後は終了のメッセージを出すようにしましょう。
下記を追加します。
MsgBox “フォルダを作成しました。”

修正後のマクロ

修正後のマクロはこのような感じとなりました。コピペで使えると思いますので
是非ご活用ください!

Sub 作業フォルダ生成()
Dim path0 As String
path0 = ThisWorkbook.Path
Dim importfolder As String
Dim outputfolder As String
importfolder = ActiveSheet.Range(“C3”).Value
outputfolder = ActiveSheet.Range(“C4”).Value

If Dir(path0 & “\” & importfolder, vbDirectory) = “” Then
MkDir path0 & “\” & importfolder
End If
If Dir(path0 & “\” & outputfolder, vbDirectory) = “” Then
MkDir path0 & “\” & outputfolder
End If

MsgBox “フォルダを作成しました。”
End Sub

Csv結合のマクロ

作業フォルダ名を同一の設定に変える

まずは作業フォルダ作成で変数にしたフォルダ名部分は同様の設定へ変更します。
importfolder = ActiveSheet.Range(“C3”).Value
outputfolder = ActiveSheet.Range(“C4”).Value

Csvのタイトル行についての設定を作る

Csvファイルはタイトル列がある場合とない場合が有りますが
タイトル行がある場合は2ファイル名以降のタイトルは取り込まないようにしたいです。
今回はその設定を設けます。
C5が有りの場合は2ファイル名以降はタイトルを取り込まないようにマクロを修正します。

設定の方法として
1ファイル目を読んだ後にタイトルフラグを1にする
・タイトルフラグが1の場合1行目は行読み込み(Line Input)だけ行ってスキップさせる

こんな感じの処理にします。

VBAだとこのように記述します。
赤枠部で変数の宣言
青枠部で1ファイル目はタイトルフラグ1を立てて
2ファイル目以降はタイトル行を1行読み込み出力はしないようにします。

修正後のマクロ

Sub Csv結合()
Dim path0 As String
path0 = ThisWorkbook.Path
Dim importfolder As String
Dim outputfolder As String
importfolder = ActiveSheet.Range(“C3”).Value
outputfolder = ActiveSheet.Range(“C4”).Value
Dim csvname As String
Dim csvstr As String
Dim titleflg As Boolean
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を開く
 If titleflg = False Then
   titleflg = True
 Else
   Line Input #1, csvstr
 End If

 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の部分を変更せずに設定を変えて利用できるようになります。
他にも需要有りそうだなぁと思うマクロが有れば記事にまとめて行きたいと思いますので
是非ご活用いただけたらと思います。

コメント

タイトルとURLをコピーしました