【簡単Excelマクロ・VBA】他のファイルからデータを取得する|ファイル操作 #005
いつもありがとうございます。
ノンプログラマー向け「Excelマクロ・VBA解説シリーズ」へようこそ。
本稿では、他のファイルからデータを取得する方法を解説いたします。マクロを記録しているファイルとは別のファイル(データソースとなるファイル)からデータを取得する方法です。
ことばの意味
- ノンプログラマー
プログラミングを主な仕事にしていない人たちのことです。 - マクロ
VBAを使って作成される「機能」のことです。 - VBA
Visusal Basic for Application の略で、プログラミング言語のことです。
関連記事
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)
' ソースから転記先にデータを転記(Copy and Paste)する
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 work book)に格納します。
Set swb_ws1 = swb.Worksheets(1)
ソースファイル swb
のワークシートを変数 swb_ws1 に格納します。swb.Worksheets(1)
のカッコの中の 1 は、1番目のシート、つまりソースファイル swb
内の左端のシートを意味します。
' データの転記先ファイルを開く
Set dwb = Workbooks.Open(ThisWorkbook.Path & "\destination.xlsx")
Set dwb_ws1 = dwb.Worksheets(1)
同様に ソースファイルから抜き出したデータを転記するためのファイル(destination.xlsx
)を開き、同時に変数 dwb に格納いたします。また、ソースファイルの時と同様に 転記先ファイル dwb の左端のシートを変数 dwb_ws1 に格納します。
' ソースから転記先にデータを転記(Copy and Paste)する
swb_ws1.Cells.Copy Destination:=dwb_ws1.Cells
ソースファイルのシートの内容を全てコピーし、転記先のファイルに貼り付けています。Destination:= の部分が、貼り付け先の指定です。
この方法では、値と書式すべてをコピーして貼り付けます。今回は、ソースファイルが csv であり書式情報を持っていないため、結果的に値だけの貼り付けとなりますが、もしソースファイルがExcelだった場合は、書式データも貼り付けられらことになります。
もし値だけを貼り付けたい場合は、この部分のコードは以下のように記述します。
' ソースから転記先にデータの値のみを転記(Copy and Paste Values Only)する
swb_ws1.Cells.Copy
dwb_ws1.Cells.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
2行目はシート内の全セルをコピーしています。
3行目は、貼り付け先と、貼り付けのオプションを指定しています。Paste
に xlPasteValues
を指定することにより値だけ貼り付けることができます。
4行目はコピー元セルの周辺に表示される点滅する枠線を消すコードです。しかし、今回の場合は貼り付けた後は data_source.csv
は閉じるだけですので、このコードの記述は必須ではありません。data_source.csv
を開いたまま続きの操作をする場合には、何かと煩わしいので本コードを記述しておいた方が良いでしょう。
'ソースファイルを"保存しないで"閉じる
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 ' 行番号変数
5行目の Dim swb_ws1_lastrow As Long
、9行目の Dim dwb_ws2 As Workshee
t 、11行目の Dim row_idx As Long
が追加されています。
5行目の Dim swb_ws1_lastrow As Long
は、ソースファイル(data_source.xlsx)のデータの最終行を格納するための変数です。特定のデータだけ抜き出しますので、抜き出すデータ範囲を指定するために使います。
9行目の Dim dwb_ws2 As Worksheet
は、ソースファイル(data_source.xlsx)から抜き出した特定のデータを転記するシートです。dwd_ws1(Sheet1)は前のセクションで解説した”全データ”の転記に使っていますので、今回の”特定のデータ”の転記先は dwd_ws2(Sheet2)にしたいと思います。
11行目の Dim row_idx As Long
は、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)
ここでは9行目の 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使用経験約20年
実務に使用するマクロを多数作成してきました。 - Python 3 エンジニア認定基礎試験
経済産業省が定めたガイドライン「ITスキル標準(ITSS)」に掲載されている民間資格です。
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。