【Excel VBA】複数シート、複数ブックを扱う時の注意点

Excel

ExcelのVBAにて、複数のシートが存在するブックを扱う場合や、複数のブックを同時に扱う場合の注意点について、説明いたします。
また、シート名・ブック名を変数で指定する方法についても説明いたします。

注意点

  1. RangeやCellsの前に、シート名の指定を忘れないようにする。
  2. 複数のブックを扱う際は、ブック名の指定も忘れないようにする。

どちらも言われてみれば当たり前なのですが、特に1.については、VBAで1つのシートしか触らないつもりでも、ブック内に複数のシートがあると、指定必須になります。
なので、普段から必ずシート名を指定するように、習慣づけておくと良いです。
※私はシート名の指定を忘れて、ブック内の他のシートを壊したことが何度あったことか・・・

シート名・ブック名の指定方法

1. シート名の指定方法

Sheets("Sheet1").Range("A1") = "あいうえお"
または
Worksheets("Sheet1").Range("A1") = "あいうえお"

2. ブック名の指定方法

Workbooks("Book1.xlsx").Sheets("シート名").Range("A1") = "あいうえお”

指定されたブックは、開かれていることが前提です。
※「Sheets」は「Worksheets」でも可です。

3. VBAが記述されているブック(自分自身のブック)の指定方法

ThisWorkbook.Sheets("シート名").Range("A1") = "あいうえお"

シート名の指定方法の補足

シート名の指定方法として、「Sheets」と「Worksheets」の2種類があります。
どちらを使うべきかですが、結論としては、どちらでも良いです。
違いは、以下の通りです。

  • Sheets:ワークシート以外にも、以下のシートを指定可能
    グラフシート(グラフ表示用のシート)
    モジュールシート(Excel4.0時代のマクロで使われていた)
    ダイアログシート(Excel95時代のマクロで使われていた)
  • Worksheets:ワークシートのみ指定可能

現在使われているのは「グラフシート」くらいかと思いますが、ワークシートとグラフシートに同じシート名を付けることは出来ませんし、グラフシートをVBAで操作することは、まれだと思います。
そのため、例えば「Sheetsにしておけば、コードが若干短くて済む」という理由で「Sheets」を使っても良いですし、「Sheetsだとグラフも混ぜて扱えてしまうので何となく気持ち悪い」という理由で「Worksheets」を使っても良いです。好みの問題でどちらでも良いかと思います。

シート名・ブック名を変数で指定する方法

上記の例の通り、シート名・ブック名を指定すると、コードが若干長くなり、場合によっては読みづらくなるかと思います。
そこで、「オブジェクト変数」というものを使う方法をご説明します。

Sheetsの場合

Dim Sh1 As WorksheetSheetsではないので注意!
Set Sh1 = Sheets("Sheet1")

Sh1.Range("A1") = "あいうえお"

上記のように、オブジェクト変数の場合は、先頭に「Set」を書く必要があります。「=」で代入するだけではエラーになります。以下のWorksheets・Workbooksの場合も同様です。

Worksheetsの場合

Dim Sh2 As WorksheetWorksheetsではないので注意!
Set Sh2 = Worksheets("Sheet2")

Sh2.Range("A1") = "かきくけこ"

Workbooksの場合

Dim Wb1 As WorkbookWorkbooksではないので注意!
Dim Sh3 As Worksheet

Set Wb1 = Workbooks("Book1.xlsx")
Set Sh3 = Wb1.Sheets("Sheet3")

Sh3.Range("A1") = "あいうえお"

ワークシート変数Sh3への代入時に、ワークブック変数Wb1を指定しているため、「Wb1.Sh3」のように書く必要はありません。(と言うより、「Wb1.Sh3」と書くとエラーになります。)

まとめ

  • ExcelのVBAでは、RangeやCellsを使う場合に、シート名を指定するように習慣づけておくと良いです。
  • シート名・ブック名を指定するとコードが長くなるため、変数を使う方法もあります。

コメント

タイトルとURLをコピーしました