【エクセルVBA】フォルダ内のすべてのブックから特定の行をコピー&貼り付けする方法

時計 2023.07.03 / 時計

【エクセルVBA】フォルダ内のすべてのブックから特定の行をコピー&貼り付けする方法

記事ではMicrosoftのエクセルにおける、VBAフォルダ内のすべてのブックから特定の行をコピーして、別のファイルへ貼り付けする方法について解説していきます。

多くの企業でエクセルは利用されており、業務効率化を図るためにVBAを活用している人もたくさんいらっしゃいます。VBAを用いることで様々なエクセル操作を可能とします。

ここではフォルダ内のブックを操作する方法として、すべてブックから特定の行をコピーし、別のエクセルに貼り付けるケースを解説していきます。本記事で解説する方法を知ることで、他の場面にも応用することができます。ぜひ本記事で紹介している方法について理解を深めてください。

作成するVBA(マクロ)の内容

私は会社で社内SE(システムエンジニア)をしており、日々様々な問い合わせの対応や、アプリケーションの開発を行っております。

業務効率化のためにエクセルのマクロを開発することも多々あります。今回解説するマクロは次のような問い合わせがあり、開発することになりました。

エクセルマクロの問い合わせ

フォルダ内にあるエクセルファイルから特定の行をコピーして、一つのファイルに貼り付けてほしい

マクロとは

マクロとはコンピューターやアプリケーションの操作を自動化する機能です。マクロというとエクセルを浮かべる方が多いですが、OutlookやWordなどでもマクロを作成することができます。

マクロとVBAを同じと考える方もいますが、厳密には異なります。マクロは操作を自動化する機能そのものを表し、VBAはオフィス製品のマクロを作成するためのプログラミング言語です。

マクロとVBAについて詳しく知りたい方は以下記事をご参照ください。

本記事で作成するVBAは次の流れで動きます。

  1. マクロを保存したブックのセル(1, 1)に記入したフォルダパスを取得する
  2. 取得したパスからフォルダ内に保存されているエクセル一覧をDir関数で取得する
  3. Do Whileでエクセル一覧から1つずつファイルを開く
  4. 開いたファイルから特定の行(ここでは5行目)をコピーして、元のエクセルに貼り付ける

作成したVBAのコード

実際に作成したVBAのコードを以下に記します。

Sub get_row_data()
    Dim folderPath As String
    Dim fileName As String
    Dim InputSheet As Worksheet
    Set InputSheet = Worksheets("Input")

    Application.ScreenUpdating = False

    folderPath = InputSheet.Cells(1, 1).Value
    fileName = Dir(folderPath & "\*.xls*")

    i = 1

    Do While fileName <> ""
        Workbooks.Open folderPath & "\" & fileName
        Sheets("Office54").Rows(5).Copy Destination:=InputSheet.Rows(i)
        i = i + 1
        Workbooks(fileName).Close SaveChanges:=False
        fileName = Dir()
    Loop

    Application.ScreenUpdating = True

End Sub

VBAコードの解説

上記VBAではまずセル(1, 1)に入力されているフォルダのパスを取得します。

folderPath = InputSheet.Cells(1, 1).Value

取得したフォルダパスからDir関数を使って格納されているエクセルをすべて取得します。

fileName = Dir(folderPath & "\*.xls*")

Dir関数とは

Dir関数は引数で指定した条件に一致するファイル名またはフォルダ名を返す関数です。

Dir関数の構文

Dir(pathname)

複数のファイルやフォルダを返したい場合はワイルドカード*を使って指定します。複数のファイルやフォルダが条件に一致した場合、Do WhileやDir()を使ってすべての要素に処理を行います。Do Whileで利用されるDir()では次の要素を返します。

すべてのエクセルファイルを取得したらDo Whileを使って各ファイルにアクセスしていきます。

Do While fileName <> ""
処理を記入
    fileName = Dir()
Loop

Do While内ではエクセルを開き、シート名Office54の5行目をコピーし、元のエクセルに貼り付けています。

Workbooks.Open folderPath & "\" & fileName
Sheets("Office54").Rows(5).Copy Destination:=InputSheet.Rows(i)

まとめ

本記事「【エクセルVBA】フォルダ内のすべてのブックから特定の行をコピー&貼り付けする方法」はいかがでしたか。

マクロを作成する際の参考として紹介したコードを利用してみてください。