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

IT

複数の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 | Excel・Accessで楽々シゴト!INFITH VBA Lab
今回のエントリーは複数のExcelブックから必要な項目だけコピーして一つのシートに一覧でまとめるVBAコードを紹介します。例えば申込み用の単票Excelブックから必要な情報を拾って一覧を作成したい場合、ファイルを一つ一つ開いてコピーペーストするのは大変です。ファイルが多いほど作業もれや見落としなど人的なミスも発生する事...

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

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

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

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

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

・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

Function ExcelFileLoad(ByVal excelFilePath As String) As String

Dim ExcelBookName   As Variant
'Dim targetValue As String

'ファイルを開く
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

'MsgBox targetValue

'結果を返す
ExcelFileLoad = targetValue

'開いたExcelファイルを閉じる
Application.DisplayAlerts = False
Workbooks(ExcelBookName).Close
Application.DisplayAlerts = True

End Function

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

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

まとめ

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

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

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

コメント

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