【簡単エクセル/Excel VBA マクロ】別のファイルからデータを取得する|ファイル操作 #005


いつもありがとうございます。
皆さん、こんにちは。ご覧いただきありがとうございます。
“日々の業務にちょうどいい自動化を”──
業務改善アプリケーションの開発を行っている ソフトデザイン工房 です。
この記事では、他の「ファイルからデータを取得する方法」を解説します。
マクロを記述しているブックとは”別のファイル”からデータを取得する方法です。
VBAにおけるファイル操作の全体像
VBAにおける「ファイル操作」の全体像は、以下の記事で解説しています。
この記事では「ファイル操作」の一部である「他のファイルからデータを取得する方法」を解説します。
VBAで他のファイルからデータを取得する方法

全データを取得する方法
シナリオ
下図のように、data_source.csv
からデータを抜き出し、destination.xlsx
に転記するマクロを例に取ります。
コードは"ソースファイルのデータを転記する.xlsm
"に記述し、そこからdata_source.csv
と destination.xlsx
を操作します。

data_source.csv
には、以下のようなデータが入っています。
気象庁のウェブサイトからダウンロードした気象データです。(出典:気象庁、URL: https://www.data.jma.go.jp/gmd/risk/obsdl/index.php)

コード
コード全文と、その実行結果を示します。
このコードでの処理の流れは以下のようになっています。
ソースファイルと転記先のファイルを開きます。
ソースファイルから転記先のファイルにデータを転記します。
ソースファイルと転記先にファイルを閉じます。
【コード】
Sub Sample()
'変数宣言
Dim swb As Workbook ' Source Workbook ; データソース
Dim swb_ws1 As Worksheet ' swb の Worksheet1
Dim dwb As Workbook ' Destination Workbook ; データの転記先
Dim dwb_ws1 As Worksheet ' dwb の Worksheet1
' ソースファイルを開く
Set swb = Workbooks.Open(ThisWorkbook.Path & "\data_source.csv")
Set swb_ws1 = swb.Worksheets(1)
' データの転記先ファイルを開く
Set dwb = Workbooks.Open(ThisWorkbook.Path & "\destination.xlsx")
Set dwb_ws1 = dwb.Worksheets(1)
' ソースから転記先にデータを転記する
swb_ws1.Cells.Copy Destination:=dwb_ws1.Cells
'ソースファイルを"保存しないで"閉じる
swb.Close SaveChanges:=False
' 転記先ファイルを"保存して"閉じる
dwb.Close SaveChanges:=True
End Sub
【実行結果】



順を追って解説していきます。
' 変数宣言
Dim swb As Workbook ' Source Workbook ; データソース
Dim swb_ws1 As Worksheet ' swb の Worksheet1
Dim dwb As Workbook ' Destination Workbook ; データの転記先
Dim dwb_ws1 As Worksheet ' dwb の Worksheet1
ここでは、このプログラムを通して使う変数をあらかじめ宣言しています。
変数はDim 変数 As データ型
の構文で宣言します。これにより、各変数は As
以降で指定したデータ型の値を格納できるようになります。
なお、Workbook
はワークブック型、Worksheet
はワークシート型を意味しています。
' ソースファイルを開く
Set swb = Workbooks.Open(ThisWorkbook.Path & "\data_source.csv")
ここでは、ソースファイル(data_source.csv
)を開き、同時に変数 swb
(source workbook)に格納しています。
Set swb_ws1 = swb.Worksheets(1)
次に、ソースファイル swb
のワークシートを変数 swb_ws1
に格納しています。
wb.Worksheets(1)
のカッコの中の 1 は、1番目のシート、つまりソースファイル swb
内の左端のシートを意味します。
' データの転記先ファイルを開く
Set dwb = Workbooks.Open(ThisWorkbook.Path & "\destination.xlsx")
Set dwb_ws1 = dwb.Worksheets(1)
ここも同様にファイルを開く処理です。
ここでは、ソースファイルから抜き出したデータを転記するためのファイル(destination.xlsx
)を開き、同時に変数 dwb
に格納しています。
また、上述のソースファイルを開くときと同様に 、転記先ファイル dwb
の1番目(左端)のシートを変数 dwb_ws1
に格納しています。
' ソースから転記先にデータを転記する
swb_ws1.Cells.Copy Destination:=dwb_ws1.Cells
ここでは、ソースファイルのシートの内容をすべてコピーし、転記先のファイルに貼り付けています。Destination:= の部分が、貼り付け先の指定です。
この方法では、値と書式の両方をコピーして貼り付けます。
今回は、ソースファイルが CSV 形式であり、書式情報を持っていないため、結果的に値だけの貼り付けとなります。
ただし、ソースファイルが Excel ファイルの場合は、書式データも同時に貼り付けられることになります。
もし値だけを貼り付けたい場合は、この部分のコードは以下のように記述します。
' ソースから転記先にデータの値のみを転記する
swb_ws1.Cells.Copy
dwb_ws1.Cells.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
このコードは、次のような流れで動作します。
- シート内の全セルをコピーする。
- 貼り付け先と、貼り付けのオプションを指定して貼り付ける。
Paste
にxlPasteValues
を指定することで、値のみを貼り付けることができます。 - コピー元セルの周辺に表示される点滅する枠線を消す。(※)
'ソースファイルを"保存しないで"閉じる
swb.Close SaveChanges:=False
' 転記先ファイルを"保存して"閉じる
dwb.Close SaveChanges:=True
最後に、ソースファイルと転記先のファイルを閉じています。
通常、ソースファイルを保存する必要はありませんので、保存せずに閉じます。
一方、転記先のファイルは、マクロ実行結果を保存する必要がありますので、保存して閉じます。
ファイルを閉じる方法に関しては、こちらの記事でも解説しております。よろしければあわせてご覧ください。

以上が、他のファイルから全データを転記先ファイルに転記する方法です。ぜひ活用してみてください。
特定のデータだけ取得する方法

実際の業務では、すべてのデータを転記したいこともあれば、特定のデータだけ転記したいこともありますよね。
ここからは、特定のデータだけ抽出して転記先ファイルに転記する方法を紹介します。
ファイル構成は、前節と同じです。
【コード】
Sub Sample3()
' 変数宣言
Dim swb As Workbook ' Source Workbook ; データソース
Dim swb_ws1 As Worksheet ' swb の Worksheet1
Dim swb_ws1_lastrow As Long ' swb_ws1 の最終行番号
Dim dwb As Workbook ' Destination Workbook ; データの転記先
Dim dwb_ws1 As Worksheet ' dwb の Worksheet1
Dim dwb_ws2 As Worksheet ' dwb の Worksheet2
Dim row_idx As Long ' 行番号変数
' ソースファイルを開くと同時に変数に格納
Set swb = Workbooks.Open(ThisWorkbook.Path & "\data_source.csv")
Set swb_ws1 = swb.Worksheets(1)
' データの転記先ファイルを開くと同時に変数に格納
Set dwb = Workbooks.Open(ThisWorkbook.Path & "\destination.xlsx")
Set dwb_ws1 = dwb.Worksheets(1)
Set dwb_ws2 = dwb.Worksheets(2)
' ソースから八王子のデータだけ転記(Copy and Paste)する
swb_ws1_lastrow = swb_ws1.Cells(Rows.Count, 5).End(xlUp).row
For row_idx = 1 To swb_ws1_lastrow
dwb_ws2.Cells(row_idx, 1) = swb_ws1.Cells(row_idx, 5)
Next row_idx
'ソースファイルを"保存しないで"閉じる
swb.Close SaveChanges:=False
' 転記先ファイルを"保存して"閉じる
dwb.Close SaveChanges:=True
End Sub
【実行結果】
このコードを実行すると、次の結果が返ります。



解説していきます。
これは、前節で紹介した「全データを転記するコード」を、「特定のデータだけを転記するコード」に変更したものです。
変更内容は最小限にとどめています。
具体的には、destination.xlsx
の Sheet1 に全データを転記していたコードを、Sheet2 に特定のデータのみ転記するように変更しています。
順を追って解説していきます。
' 変数宣言
Dim swb As Workbook ' Source Workbook ; データソース
Dim swb_ws1 As Worksheet ' swb の Worksheet1
Dim swb_ws1_lastrow As Long ' swb_ws1 の最終行番号
Dim dwb As Workbook ' Destination Workbook ; データの転記先
Dim dwb_ws1 As Worksheet ' dwb の Worksheet1
Dim dwb_ws2 As Worksheet ' dwb の Worksheet2
Dim row_idx As Long ' 行番号変数
前節のコードに対して、以下のコードを追加しています。
Dim swb_ws1_lastrow As Long
Dim dwb_ws2 As Worksheet
Dim row_idx As Long
swb_ws1_lastrow
は、ソースファイル(data_source.xlsx
)のデータの最終行を格納するための変数です。この値は、抜き出すデータの範囲を指定する際に使います。
dwb_ws2
は、ソースファイル(data_source.xlsx
)から抜き出した特定のデータを転記するシートです。
dwd_ws1
(Sheet1)は前節で解説した”全データ”の転記に使用しているため、今回の”特定のデータ”の転記先はdwd_ws2
(Sheet2)としています。
row_idx
は、1行ずつデータを取得して転記していくために必要となる行番号変数です。
' ソースファイルを開くと同時に変数に格納
Set swb = Workbooks.Open(ThisWorkbook.Path & "\data_source.csv")
Set swb_ws1 = swb.Worksheets(1)
' データの転記先ファイルを開くと同時に変数に格納
Set dwb = Workbooks.Open(ThisWorkbook.Path & "\destination.xlsx")
Set dwb_ws1 = dwb.Worksheets(1)
Set dwb_ws2 = dwb.Worksheets(2)
ここでは、 前節のコードに対してSet dwb_ws2 = dwb.Worksheets(2)
を追加しています。
これは、データの転記先を Sheet2 にする設定です。
' ソースから八王子のデータだけ転記(Copy and Paste)する
swb_ws1_lastrow = swb_ws1.Cells(Rows.Count, 5).End(xlUp).row
For row_idx = 1 To swb_ws1_lastrow
dwb_ws2.Cells(row_idx, 1) = swb_ws1.Cells(row_idx, 5)
Next row_idx
ここでは、特定のデータだけを抜き出して転記するロジックを記述しています。
ソースファイルの1行目から最終行(swb_ws1_lastrow
)までを1行ずつ走査し、転記先ファイル(destination.xlsx
)の Sheet2 にデータを転記しています。
具体的には、ソースファイルの5列目(八王子)のデータを転記先ファイルに書き出しています。
なお、For…Next ループの使い方については、こちらの記事で解説しています。よろしければあわせてご覧ください。
'ソースファイルを"保存しないで"閉じる
swb.Close SaveChanges:=False
' 転記先ファイルを"保存して"閉じる
dwb.Close SaveChanges:=True
最後に、ソースファイルと転記先ファイルを閉じています。
この部分は、前節の内容と同じで変更ありません。
ソースファイルは保存せずに閉じ、転記先ファイルは保存して閉じます。

以上が、他のファイルから特定のデータだけを抜き出し、転記先ファイルに転記する方法です。
VBAスキルアップの参考情報
近年は、ChatGPTをはじめとするAIの登場によって、学習のスタイルが大きく変わりました。
分からないことがあれば、AIに尋ねれば答えがすぐに見つかる時代です。
とはいえ、AIを使いこなすには、自分自身の基本的な知識や理解力が欠かせません。
全体像をつかむためには、やはり書籍などで体系的に学んでおくことが今でも有効です。
そのうえでAIを活用すれば、自分の理解度に合わせた的確な解説や、応用のヒントを得ることができます。
「学んで基礎を築く → AIで補い発展させる」──このサイクルを重ねることで、VBAスキルは着実に高まっていくでしょう。
VBAのスキルアップ
VBAを学び始めるなら
入門書は、どれを選んでも大きな差はないように感じます。
どれを選ぶかに悩むことに時間をかけるよりも、まずは手頃な一冊を手に取って進めてみるのがおすすめです。
もし迷ったときには、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
基礎を超えて力をつけたいなら
私は上級者を目指していましたので、入門書にとどまらず、このような内容の濃い一冊を選んで学んでいました。
今は誰でもAIを活用できる時代になりましたが、上級者を目指す方にとっては、AIをより上手に活用するという意味でも、こうした本は今なお価値があります。
このレベルの本を一冊持っておくことに、損はないでしょう。
資格で能力を証明したいなら
VBAのプログラミング能力を客観的に示したい場合には「VBAエキスパート試験」があります。
特に「スタンダード」の方は上級者向けです。
あなたが社内業務の改善を行う立場であっても、VBAで作成したシステムをお客様に納める立場であっても、この資格は信頼や安心につながるでしょう。
以下の公式テキストが販売されています。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。
これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
今はAIにコードを尋ねれば、答えが返ってくる時代です。
しかし、この本からは「コード」以上に、プログラミングに向き合う姿勢や考え方を学ぶことができるでしょう。
こちらの記事でも紹介しています。もしよろしければご覧ください。
【初心者歓迎】無料相談受付中

いつもありがとうございます!
限られた時間をより良く使い、日本の生産性を高めたい──
みんなの実用学を運営するソフトデザイン工房では、業務整理や業務改善アプリケーション作成のご相談を承っております。
お気軽にご相談ください。
こちらの記事でも紹介しております。
おわりに


ご覧いただきありがとうございました!
今回の記事では、「ファイル操作」の中の「他のファイルからデータを取得する方法」を解説しました。
お問い合わせやご要望がございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。
この記事が皆様のお役に立てれば幸いです。
なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。
この記事を書いた人
- ソフトデザイン工房|日々の業務にちょうどいい自動化を
- ■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房運営(個人事業者) - 業務改善アプリケーションをご提供 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成にチャレンジ。