今回は別のエクセルファイルから値を参照していく方法を考えていきます。
以前は別のシートから値を参照する方法を扱いました。
それの少し応用したバージョンです。
このようにデータ.xlsxとマクロテスト.xlsmというファイルを用意しました。
マクロテストが読み込みを行うファイルで、データ.xlsxが読み込むデータが記載して
あるファイルとなります。
データ.xlsxの中身は以下のようになっています。
これを読み込んでマクロテストの中にある全体シートに追記していくには?というのを
考えていきましょう。
マクロテストの全体シートはこんな感じです。
ちょうどB16セルが開いているので16行目にデータを反映させたいですね。
■ポイント
別のブックからセルを参照する場合、すでに開いているのと何も開いていないのでは
処理がことなります。
すでに開いている場合はそのまま
Range("B16").Value = Workbooks("データ.xlsx").Worksheets(1).Range("B3").Value
のように記述することができますが、この場合は対象となるブックが開いていない場合、
読み込めなくてエラーとなってしまいます。
例えば、開いているかいないかというのを前もって確認してそれに
合わせて処理を記述する方法などありますが、今回はシンプルに
もともと開いていない場合を想定して、
対象のブックを開く → 特定のセルの値を参照する
という流れでマクロを作っていきましょう。
ブックを開くのは簡単です。
Workbooks.Open Filename:="絶対パス"
となります。ディレクトリによってはファイル名だけでも開くことができますので、
状況によって使い分けていきましょう。
■回答
Sub Q15_Answer()
Dim wb As Workbook
Set wb = ThisWorkbook
Dim ws As Worksheet
Set ws = wb.Worksheets("全体")
Workbooks.Open FileName:=("C:\Users\user\Desktop\work\VBAマクロ\データ.xlsx")
ws.Range("B16").Value = Workbooks("データ.xlsx").Worksheets(1).Range("B3").Value
ws.Range("C16").Value = Workbooks("データ.xlsx").Worksheets(1).Range("C3").Value
ws.Range("D16").Value = Workbooks("データ.xlsx").Worksheets(1).Range("D3").Value
ws.Range("E16").Value = Workbooks("データ.xlsx").Worksheets(1).Range("E3").Value
ws.Activate
Set wb = Nothing
Set ws = Nothing
End Sub
■解説
まず、 ワークブックとワークシートを格納する変数を宣言し、読み込み先である
全体シートを代入しています。
これは、シートを参照する記述をするときに短く見やすくする為です。
読み込み元も同様に変数に入れるとさらに見やすくなります。
次に Workbooks.Open FileName:=("C:\Users\user\Desktop\work\VBAマクロ\データ.xlsx")
で、読み込み対象となるブックを開いています。
パスは適宜、環境に合わせて変更してください。
ちなみに、すでに対象のブックを開いている状態で、この開く処理が実行されたと
してもエラーで止まるということはありません。そのまま後続の処理が流れます。
あとは、直接、対象のセルを参照するだけです。
最後のws.Activateは、データを代入したあとはデータ側のセルがアクティブになってしまうからです。
この1文を入れることで、最終的に全体シートをアクティブにしています。
実行結果はこのとおりです。無事にコピーできました。