VBAオジサンのらくがき帳

#13 別のワークブックを開いてつかう

2021-03-27 00:00:00

別のワークブックを開いてデータを取得したり、貼り付けするというのは、よくある作業ではないでしょうか。今回はマクロを使って別のワークブックを開く方法と、注意点などについて書きたいと思います。

ワークブックを開くにはWorkbooksオブジェクトのOpenメソッドを利用します。Openメソッドの引数には開くファイルのファイル名を指定しますが、ファイル名だけだと作業ディレクトリからの相対パスになりますので、絶対パス(C:\~などドライブ名から始まるパス)を使うのがおすすめです。

ata.xlsxのDataシートのA1:B10の範囲のセルを、現在のブックのSheet1のA1にコピーするコードは下のようになります。

Dim wb As Workbook
Set wb = Workbooks.Open("C:\data\data.xlsx")
wb.Sheets("Data").Range("A1:B10").Copy ThisWorkbook.Sheets("Sheet1").Range("A1")
wb.Close

※ActiveBookとActiveSheetについて

Excel VBAのコードでRange(“A1”)と書いたときには、暗黙に作業中のワークブック(ActiveBook)の作業中のワークシート(ActiveSheet)を指定したこととなります。Range(“A1”)をActiveBook.ActiveSheet.Range(“A1”)を短縮形だと考えることもできます。Workbooks.Openを使って別のワークブックを開くと、開かれたブックの方がActiveBookとなります。上のコードでThisWorkbook.Sheets(“Sheet1”).Range(“A1”)と指定しているのはそのためです。(ThisWorkbookはマクロが実装されているワークブックをあらわしています。)

ここで下のような書き方をするとコピー先が開いたブックとなってしまうので注意が必要です。

wb.Sheets("Data").Range("A1:B10").Copy Range("A1")
wb.Sheets("Data").Range("A1:B10").Copy Sheets("Sheet1").Range("A1")

ActiveBookやActiveSheetに着目すると上のコードは下のように書き換えることもできます。(ただし前述の書き方がおすすめです。)

Workbooks.Open ("C:\data\data.xlsx")
Sheets("Data").Activate 'ActiveSheetをDataに設定
Range("A1:B10").Copy
ThisWorkbook.Activate 'ActiveBookを元のワークブックにもどす
Sheets("Sheet1").Activate 'ActiveSheetをSheet1に設定
Range("A1").PasteSpecial
Workbooks("data.xlsx").Activate 'ActiveBookをdata.xlsxにもどす
ActiveWorkbook.Close

既存のファイルを開くのではなく、新規にブックを作成する際にはWorkbooksオブジェクトのAddメソッドを使います。新しいブックにワークブックのデータをコピーして、名前を付けて保存するコードは下のように書くことができます。

Dim wb As Workbook
Set wb = Workbooks.Add
ThisWorkbook.Sheets("Sheet1").Cells.Copy wb.Sheets(1).Range("A1") 'Sheet1のデータをすべてコピペする
wb.SaveAs "C:\data\data2.xlsx"
wb.Close