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

アフィリエイト広告を利用しています。
Information
運営者・ポテ

いつもありがとうございます。

皆さん、こんにちは。ご覧いただきありがとうございます。

“日々の業務にちょうどいい自動化を”──

業務改善アプリケーションの開発を行っている   ソフトデザイン工房 です。

この記事では、他の「ファイルからデータを取得する方法」を解説します。

マクロを記述しているブックとは”別のファイル”からデータを取得する方法です。

Information

ブック
Excel ファイルのことです。

VBAにおけるファイル操作の全体像

VBAにおける「ファイル操作」の全体像は、以下の記事で解説しています。

この記事では「ファイル操作」の一部である「他のファイルからデータを取得する方法」を解説します。

VBAで他のファイルからデータを取得する方法

全データを取得する方法

シナリオ

下図のように、data_source.csv からデータを抜き出し、destination.xlsx に転記するマクロを例に取ります。

コードは"ソースファイルのデータを転記する.xlsm"に記述し、そこからdata_source.csvdestination.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

このコードは、次のような流れで動作します。

  1. シート内の全セルをコピーする。
  2. 貼り付け先と、貼り付けのオプションを指定して貼り付ける。
    Paste xlPasteValues を指定することで、値のみを貼り付けることができます。
  3. コピー元セルの周辺に表示される点滅する枠線を消す。(※)
Information


今回の場合、データを貼り付けた後は 、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         ' 行番号変数

前節のコードに対して、以下のコードを追加しています。

  • 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にコードを尋ねれば、答えが返ってくる時代です。

しかし、この本からは「コード」以上に、プログラミングに向き合う姿勢や考え方を学ぶことができるでしょう。


こちらの記事でも紹介しています。もしよろしければご覧ください。

【初心者歓迎】無料相談受付中 

運営者・ポテ

いつもありがとうございます!

限られた時間をより良く使い、日本の生産性を高めたい──

みんなの実用学を運営するソフトデザイン工房では、業務整理や業務改善アプリケーション作成のご相談を承っております。

お気軽にご相談ください。


こちらの記事でも紹介しております。

おわりに

運営者・ポテ

ご覧いただきありがとうございました!

今回の記事では、「ファイル操作」の中の「他のファイルからデータを取得する方法」を解説しました。

お問い合わせやご要望がございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。

この記事が皆様のお役に立てれば幸いです。

なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。

この記事を書いた人

運営者・ポテソフトデザイン工房|日々の業務にちょうどいい自動化を
■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房運営(個人事業者) - 業務改善アプリケーションをご提供 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成にチャレンジ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です