csvが大量にあって、最終行の値をまとめてExcelに一覧にまとめたいなど、そんなケースの場合にもExcelVBA/マクロを使って一括で処理することができます。
ExcelVBA/マクロのコードの解説は一度後回しにして、まずは前提とこのExcelVBA/マクロブックでできることをご紹介させていただきます。
前提
まずは取得したいファイルの前提です。
- 複数のcsvファイルから特定の列(D列とか、F列とか)の最終行の数値を取得したい
- csvファイルの特定の列はファイルごとに一定である
(AのcsvファイルはD列の最終行に取得したい数値がある、BのcsvファイルもD列の最終行に取得したい数値がある、CのcsvファイルもD列の最終行に取得したい数値があるということ。
AのcsvファイルはD列の最終行に取得したい数値がある、BのcsvファイルはG列に取得したい数値がある、CのcsvファイルもB列の最終行に取得したい数値があるという状態でない)
ExcelVBA/マクロでやりたいこと
ExcelVBA/マクロでやりたいことを記載します。
- 同じフォルダにcsvファイルを入れる
- ExcelVBA/マクロブックを開く
- ExcelVBA/マクロブックからマクロを起動すると特定の一つのシートにcsvファイルの名前と特定の列の最終行の数値を取得して、ExcelVBA/マクロブックの特定の一つのシートに記載する
前提の状況のcsvファイルの具体的な状況
実際の具体的にファイルの状況を記載していきます。
各支店の売上のcsvファイルが同じフォルダにある状況
csvのファイルの内容
各csvにデータがあり、C列の最終行に取得したい売上の合計が記載されています。
A支店のcsvファイル
B支店のcsvファイル
C支店のcsvファイル
実際に作成したExcelVBA/マクロを起動した結果
冒頭で記載させていただいた通り、実際に作成したExcelVBA/マクロを起動した結果どうなるかをご紹介させていただきます。
ExcelVBA/マクロを起動する前のフォルダの状況
取得したいcsvファイルと同じフォルダの階層にExcelVBA/マクロブックを保管します。
同じフォルダのcsvファイルから特定のセルの値を取得するExcelVBA/マクロを開いた状況
ExcelVBA/マクロを開くとこのようなファイルとなっています。
マクロシートでまずはC5セルに取得したい列の番号を入力します
(csvファイルのA列の最終行を取得したいなら、1と入力、仮にC列の最終行を取得したいならA,B,C(1,2,3)と数えて、3とします。)
上記のサンプルの例でいえば、C列の最終行のセルを取得したいため、3とします。
次に実行をクリックして、ExcelVBA/マクロを実行できるので、クリックして実行します。
クリックして実行した結果が以下の状況です。
実行した結果として、ファイル名のとC列の最終行のセルの内容が取得できています。
ダウンロードファイル
それでは同じフォルダのcsvファイルから特定のセルの値を取得するExcelVBA/マクロのダウンロードファイルです。ブックがこのまま使えるような状況の方はぜひ使ってみてください。
今回は最終行を取得しているので、最終行以外の特定のセルを取得する場合、もしくは複数のcsvファイルで列が一定であることを想定していますので、csvファイルごとに列がバラバラな場合には、うまく集計することができませんので、注意してください。
ExcelVBA/マクロファイルの解説
それではExcelVBA/マクロの解説を行っていきます。
全体の概要
まずは全体感を文章で記載します。
- 「取得したファイル名・最終行」シートの2行目以降を削除する(重複して取得しないようにするため)
- 「マクロ」シートからcsvファイルの取得したい列の番号を取得します(C列なら3など)
- 同じフォルダにあるExcelVBA/マクロブック以外のcsvを開く
- 開いたcsvファイルのファイル名と列(2で取得した列)の最終行のセルの取得する
- 4で取得したファイル名と最終行のセルをExcelVBA/マクロブックの「取得したファイル名・最終行」シートに転記する
- 転記した「取得したファイル名・最終行」シートの最終行を取得する(次のcsvファイルを転記する際に同じ行に転記しないようにするため)
- 3から6を同じフォルダのファイルの回数を繰り返す
- 終了
実際のExcelVBAのコード
上記の内容をコードで記載したのがこちらになります。
Option Explicit Sub 同じフォルダのcsvファイルから特定のセルの値を取得する() '変数宣言 Dim Starttime As Date '時間取得 Dim myFn As String 'ファイル取得 Dim wb As Workbook 'ファイル開く Dim g_col As Double '最終行の指定した列の番号格納 Dim g_cell As Variant '最終行のセルの格納 Dim sh_Lrow As Double Starttime = Now() Application.ScreenUpdating = False '画面更新一時停止 '取得するシートの値を消して初期化 If ThisWorkbook.Worksheets(2).Cells(2, 1) <> "" Then ThisWorkbook.Worksheets(2).Activate ThisWorkbook.Worksheets(2).Range(Cells(2, 1), Cells(1000, 1000)).ClearContents End If g_col = ThisWorkbook.Worksheets(1).Cells(5, 3) '最終行取得の列を取得 myFn = Dir(ThisWorkbook.Path & "\*.csv?") 'エクセルBOOK検索 Do While myFn <> "" '対象が存在する限り続行 If myFn <> ThisWorkbook.Name Then 'ファイル名が自分の名と違っていれば Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & myFn) '開く g_cell = Cells(Workbooks(myFn).Worksheets(1).Cells(Rows.Count, g_col).End(xlUp).Row, g_col) sh_Lrow = ThisWorkbook.Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Row ThisWorkbook.Worksheets(2).Cells(sh_Lrow + 1, 1) = myFn ThisWorkbook.Worksheets(2).Cells(sh_Lrow + 1, 2) = g_cell Workbooks(myFn).Close savechanges:=False End If myFn = Dir() '次検索 Loop '繰り返し Application.ScreenUpdating = True '画面更新停止解除 MsgBox "終了しました。処理時間は" & DateDiff("s", Starttime, Now()) & "秒です。", , "Success" End Sub
留意点
ExcelVBAマクロブックの概要やコードを記載したところで改めて留意点を記載します。
以下の場合には今回のExcelVBA/マクロブックではうまく取得することはできなかったり、失敗するケースもありますので、ので、留意してください。
- 最終行を取得しているので、最終行以外の特定のセル(最初のセルや列全体など)を取得する場合
- 複数のcsvファイルで列が一定であることを想定していますので、csvファイルごとに列がバラバラな場合(A支店は2列目、B支店はD列など)
- ExcelVBA/マクロブックと同じフォルダにあるファイルを取得して開くので、デスクトップにおいて起動してしまうケース(デスクトップのすべてのcsvファイルが開いて取得されてしまう)、同じフォルダにcsvファイルがないケース(開くcsvファイルがない)
- 取得したいファイルがcsvファイルではなくExcelファイル(csvを探して開いて取得するため)