約5分で読めます
Last updated on

【VBA】複数のExcelから値を取得する【なぜ手動でやってたのか】


目次

2020年に書いた記事を、2026年9月時点の情報で見直しました。当時のコードはそのまま残し、末尾に「2026年の見直し」として改良版と注意点を追記しています。

複数のExcelの中から値を取り出してまとめるという作業がありました。 以前はファイルを一つ一つ開いてちゃちゃっとやってましたが、考えを改めました。

どんなに簡単であろうと、VBAなどを活用して効率化することを考えるようにしましょう。 VBAを使った経験があることで今後に活かせるでしょうから。

今回のお題:複数のExcelから値を取り出して表にまとめる

複数のExcelファイル内のセルの値を取り出して、別のExcel表にまとめるというものです。

昔、Excelでシステム利用申請を受けていて、その申請書の内容をまとめてほしいという依頼があったので対応したという経緯です。

【イメージ】 1つ1つのExcelファイルから、特定のセルの値を取り出して、

1つのExcelに表形式でまとめます。

1つ1つExcelを開いて、手動でセルをコピーしてペーストするという方法でもOKですが、数が多いと大変ですし、手動による誤操作も気になります。こういう作業こそVBAの出番です。

VBAでExcelを処理するメリット

主に2点ですね。

1.作業の時間が短縮できる 2.ミスが減る

正直なところ、これはシステム関係者よりも事務処理が多い部署の人にメリットがあると思います。 是非使ってもらいたいところです。

実はVBAを業務で使うのは初めて

Webシステム開発で使うJavaや、ノーツ操作に使うLotusScriptは扱ったことがありますが、実はVBAを使うのは初めてです。10年以上仕事していて使う機会がなかったのはすごく稀なのかもしれません…

参考にしたサイト

VBAで色々できることは知っていましたので、Googleでサンプルを検索して以下サイトを参考にさせてもらいました。

レイアウトの異なる複数のExcelブックから特定のセルをデータ抽出して1つのシートにまとめるVBA | INFITH VBA Lab

他のプログラミング言語をやっていれば感覚でわかる

プログラムの全くの初心者にはハードルは高いと思いますが、他のプログラミング言語を使ったことがある人なら感覚でわかりますね。VBA。

変数、ループ、分岐、そしてマニュアルが読めれば(使えるモジュールを探せれば)ある程度の処理はできそうです。

初のVBAプログラム作成時間は 1時間程度

非常にシンプルなプログラムですが、実装方法を調べて、コードを書いてみて、テストして、としていると1時間くらいかかりました。

  • Excelファイルを開く方法は?
  • どうすればセルの値を取れる?
  • Excelファイルの数だけループ処理をかける方法は?

など一度やってみないと分からないところで時間がかかると思います。一度やったことがあれば次回以降はサクサク進められると思います。

実際に使ったプログラミング処理コード

フォルダ内のExcelファイルを開き、特定のセルを取り出し、まとめExcelファイルに転記するという単純な処理です。フォルダ内のExcelの数だけループ処理をかけます。

メイン処理(フォルダ内のExcel分ループ)

Sub 情報取得()
Dim excelFile   As String
Dim excelFilePath   As String
'Excelファイルが存在していたらファイル名取得
excelFile = Dir(ActiveWorkbook.Path & "\*.xlsx")
'セルに転記するための行カウントを指定
i = 2
'存在するExcelファイルをすべて読み込む
Do While excelFile <> ""
    '開くExcelファイルのフルパスを取得
    excelFilePath = ActiveWorkbook.Path & "\" & excelFile
    'データを取得
    ExcelData = Split(ExcelFileLoad(excelFilePath), "|")
    '取得したデータをセルに転記
    Cells(i, 1) = ExcelData(1)
    Cells(i, 2) = ExcelData(2)
    Cells(i, 3) = ExcelData(3)
    Cells(i, 4) = ExcelData(4)
    '次のExcelファイルを取得
    excelFile = Dir()
    'カウントアップ
    i = i + 1
Loop
End Sub

サブ処理(Excelを開いて値を取り出すプログラム)

Function ExcelFileLoad(ByVal excelFilePath As String) As String
Dim ExcelBookName   As Variant
'ファイルを開く
Workbooks.Open excelFilePath
'開いたExcelファイル名を取得
ExcelBookName = Application.ActiveWorkbook.Name
'値初期化
targetValue = ""
'依頼部署(G4セル)
targetValue = targetValue & "|" & Range("G4").MergeArea(1, 1).Value
'依頼者(G5セル)
targetValue = targetValue & "|" & Range("G5").MergeArea(1, 1).Value
'システム名(D10セル)
targetValue = targetValue & "|" & Range("D10").MergeArea(1, 1).Value
'利用目的(D12セル)
targetValue = targetValue & "|" & Range("D12").MergeArea(1, 1).Value
'結果を返す
ExcelFileLoad = targetValue
'開いたExcelファイルを閉じる
Application.DisplayAlerts = False
Workbooks(ExcelBookName).Close
Application.DisplayAlerts = True
End Function

たったこれだけですが、ボタンをポチっと押すと、Excelファイルを1つ1つ開いて値を取得してまとめていってくれます。

数十ファイル程度なら手動で作業してもよさそうですが、数百、数千とあるファイルを処理するにはこういった自動化が効果を発揮すると思います。

2026年の見直し

当時のコードは今のExcel(Microsoft 365)でもそのまま動きます。ただ、あとから読み返すと気になる点があったので、改良版と注意点をまとめておきます。

改良版のコード

当時のコードは「いま前面にあるブック・シート」(ActiveWorkbook や修飾なしの Range・Cells)に頼っているため、途中で別のブックがアクティブになると、違うシートに書き込んでしまう危険があります。書き込み先と読み取り元をはっきり指定し、申請書は読み取り専用で開くようにしました。

Option Explicit

Sub 情報取得()
    Dim folderPath As String, fileName As String
    Dim wb As Workbook, ws As Worksheet
    Dim i As Long

    Set ws = ThisWorkbook.Worksheets(1)          'まとめ先(このマクロのブックの1枚目)
    folderPath = ThisWorkbook.Path & "\"
    fileName = Dir(folderPath & "*.xlsx")
    i = 2

    Application.ScreenUpdating = False
    Do While fileName <> ""
        Set wb = Workbooks.Open(folderPath & fileName, ReadOnly:=True)
        With wb.Worksheets(1)                    '申請書のシート(1枚目の場合)
            ws.Cells(i, 1).Value = .Range("G4").MergeArea(1, 1).Value   '依頼部署
            ws.Cells(i, 2).Value = .Range("G5").MergeArea(1, 1).Value   '依頼者
            ws.Cells(i, 3).Value = .Range("D10").MergeArea(1, 1).Value  'システム名
            ws.Cells(i, 4).Value = .Range("D12").MergeArea(1, 1).Value  '利用目的
        End With
        wb.Close SaveChanges:=False
        i = i + 1
        fileName = Dir()
    Loop
    Application.ScreenUpdating = True
End Sub
  • Option Explicit で変数の宣言を必須にし、打ち間違いを防ぎます
  • 申請書を ReadOnly:=True で開き、SaveChanges:=False で閉じるので、元のファイルを書き換える心配がありません
  • 値を「|」でつないで分割し直す処理が不要になり、セルの中に「|」が入っていても崩れません
  • マクロを書くブックは .xlsm で保存し、申請書(.xlsx)と同じフォルダに置きます。*.xlsx だけを探すので、まとめ用のブック自身は読み込み対象になりません

マクロが動かないときは

メールやWebからダウンロードしたマクロ付きファイルは、Microsoft 365では既定でマクロがブロックされます(2022年に変わった仕様です)。自分で作ったファイルなら問題ありませんが、人から受け取った .xlsm が動かないときは、ファイルのプロパティで「許可する」にチェックを入れるか、社内の管理者に確認してください。

ほかの選択肢

まとめたい元データが表の形(1行1件)になっているなら、Excelの「データ」→「データの取得」→「ファイルから」→「フォルダーから」(Power Query)で、コードを書かずに複数ファイルを結合できます。今回のような申請書(単票)形式から決まったセルだけを拾う用途では、VBAのほうが素直です。

まとめ

1.単純なExcel処理はVBAを活用することで効率化できます。

2.今までやったことがなくても諦めて手動で作業を進めるのではなく、効率的にできる方法を調べてみましょう。

3.システム関係者だけでなく、パソコンを使って業務している人は全員知っておいて損はないと思います。