ExcelのVBAにて、複数のシートが存在するブックを扱う場合や、複数のブックを同時に扱う場合の注意点について、説明いたします。
また、シート名・ブック名を変数で指定する方法についても説明いたします。
注意点
- RangeやCellsの前に、シート名の指定を忘れないようにする。
- 複数のブックを扱う際は、ブック名の指定も忘れないようにする。
どちらも言われてみれば当たり前なのですが、特に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 Worksheet ‘Sheetsではないので注意!
Set Sh1 = Sheets("Sheet1")
Sh1.Range("A1") = "あいうえお"
上記のように、オブジェクト変数の場合は、先頭に「Set」を書く必要があります。「=」で代入するだけではエラーになります。以下のWorksheets・Workbooksの場合も同様です。
Worksheetsの場合
Dim Sh2 As Worksheet ‘Worksheetsではないので注意!
Set Sh2 = Worksheets("Sheet2")
Sh2.Range("A1") = "かきくけこ"
Workbooksの場合
Dim Wb1 As Workbook ‘Workbooksではないので注意!
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を使う場合に、シート名を指定するように習慣づけておくと良いです。
- シート名・ブック名を指定するとコードが長くなるため、変数を使う方法もあります。
コメント