ExcelVBA/マクロ

ExcelVBA/マクロで同じフォルダのcsvファイルから特定のセルの値を取得する

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/マクロでやりたいことを記載します。

  1. 同じフォルダにcsvファイルを入れる
  2. ExcelVBA/マクロブックを開く
  3. 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ファイルごとに列がバラバラな場合には、うまく集計することができませんので、注意してください。

同じフォルダのcsvファイルから特定のセルの値を取得する_v1_20210318

同じフォルダのcsvファイルから特定のセルの値を取得するマクロファイルです。
v1_2021/3/18

ExcelVBA/マクロファイルの解説

それではExcelVBA/マクロの解説を行っていきます。

全体の概要

まずは全体感を文章で記載します。

  1. 「取得したファイル名・最終行」シートの2行目以降を削除する(重複して取得しないようにするため)
  2. 「マクロ」シートからcsvファイルの取得したい列の番号を取得します(C列なら3など)
  3. 同じフォルダにあるExcelVBA/マクロブック以外のcsvを開く
  4. 開いたcsvファイルのファイル名と列(2で取得した列)の最終行のセルの取得する
  5. 4で取得したファイル名と最終行のセルをExcelVBA/マクロブックの「取得したファイル名・最終行」シートに転記する
  6. 転記した「取得したファイル名・最終行」シートの最終行を取得する(次のcsvファイルを転記する際に同じ行に転記しないようにするため)
  7. 3から6を同じフォルダのファイルの回数を繰り返す
  8. 終了

実際の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を探して開いて取得するため)

当事務所の免責事項

当事務所のホームページに掲載された内容について、その正確性について万全を期しておりますが、その内容について保証するものではありません。また、投稿時点での税法、会計基準、会社法、関連指針、ガイドライン、その他の法令等に従っていますので、閲覧時点の制度に対応していない可能性があります。

なお、当事務所のホームページの内容については、一般的なガイダンスに限定されています。また、閲覧者がスムーズに理解しやすいように簡潔、平易な記述で説明及び解説をしている箇所があり、その情報提供が遅れたり、欠落したり、また不正確である可能性もあります。

したがって、当事務所のホームページの執筆者または著者は、法令、会計、税務、その他の専門的なアドバイス、あるいは関連サービスを提供しているものではないという認識で、ホームページ上で各種情報の提供しています。そのため、当事務所のホームページに掲載されている情報について、専門的な会計、税務、法令等に関するアドバイスの代用として用いてはいけません。

当事務所のホームページに基づく各情報により実務を行う場合には、当税理士事務所または関連する専門家に必ず相談の上行うか、内容を十分に検討する必要があります。当税理士事務所との契約に基づく有料による相談、協議により実施した場合を除き、本情報の利用により損害が発生することがあっても、当事務所は一切責任を負いません。

当事務所サイトからのリンク

当事務所のホームページで掲載されている外部サイトへのリンクは、当税理士事務所に関係のない第三者が設置、運営しているサイトであり、当税理士事務所は、関与、管理は一切しておりません。

また、当税理士事務所が、リンク先のサイトに関する正確性や当該サイトに掲載されている情報などについてその内容の正確性、妥当性を保証ないし推奨していません。

また、当事務所のホームページのリンク元についても、上記と同様であり、当事務所がその内容の正確性、妥当性を保証ないし推奨しているものではありません。

コメントを残す

*