当サイト「えくとしょ」や多くの参考書でも、セルの値を調べたり、セットする時にRangeでセルの位置だけを指定してプログラムしています。
でもキビシイ見方をすると、
「セルの位置は指定しているけど、ファイルとシートは指定していない」
ということです。
その結果、このRangeだけでセルを指定したプログラムを実行すると、アクティブなシートのセルが対象となります。(アクティブなシートとは、パソコン画面の1番手前に表示されているシート)
でもプログラムを実行中にユーザがシートをクリックすると、アクティブなシートは変わる危険性があります。
今回はこのような危険性をなくすために、対象ファイルとシートを指定する方法を説明しています。今後セルを操作する時は、この方法でプログラムを書くようにしましょう。
セルのファイルとシートの指定方法
Workbooks(“ファイル名”).Worksheets(“シート名”).Range(“○○”)
※ファイル名・シート名はダブルクォーテーションで囲む
たとえば「セル練習.xlsm」ファイルの「Sheet1」シートの「A1」セルの場合は、次のように書きます。
1 2 3 |
Workbooks("セル練習.xlsm").Worksheets("Sheet1").Range("A1") |
Workbooksでファイルを指定
Workbooksは、開いているエクセルファイルの集まりです。そのため、最後に複数形のsが付いています。
「Workbooks(“ファイル名”)」と書くことで、「開いているエクセルファイルの中の、このファイル」という意味なります。
ファイル名を指定する時の注意点ですが、.xlsxや.xlsmなど拡張子まで指定します。まだ保存していない新規のエクエルファイルを指定する時は、拡張子がわからないので「Book1」などファイル名だけになります。
開いていないエクセルファイルを指定するとエラーになります。
Worksheetsでシートを指定
Worksheetsは、1つ前のWorkbooksで指定されたファイルの中にあるシートの集まりです。そのため、最後に複数形のsが付いています。
「Worksheets(“シート名”)」と書くことで、「シートの集まりの中の、このシート」という意味なります。
対象のファイルに存在しないシートを指定するとエラーになります。
ファイルとシートを指定してない時・した時の違い
「ファイル・シート名をする理由がよくわからない・・・」となっている人もいると思います。
せっかくなので、ファイル・シートを指定しない時・した時のプログラムを作って実際に動かしてみましょう。
- 新しいエクセルファイルを作成する
- ファイル名を「セル練習.xlsm」で保存する
- 「セル練習.xlsm」にシートを追加する(Sheet1とSheet2がある状態)
- Sheet2を選択して、Sheet2を表示した状態にする
次のプログラムは、どちらもA1セルに文字をセットするプログラムです。
ファイル・シートを指定してないVBA
1 2 3 4 5 6 7 |
Sub RensyuCell1() Range("A1").Value = "指定なし" End Sub |
実行後は、Sheet2のセルA1に「えくとしょ」と書き込まれてしまう。
↓
その時、アクティブになっているシートが処理の対象となる
ファイル・シートを指定したVBA
1 2 3 4 5 6 7 |
Sub RensyuCell2() Workbooks("セル練習.xlsm").Worksheets("Sheet1").Range("A1").Value = "指定した" End Sub |
実行後は、Sheet1のセルA1に「えくとしょ」と書き込まれる。
↓
どのシートがアクティブになっていても、指定したシートが処理の対象となる
オブジェクト変数を使って見やすく書く
ファイル名・シート名を指定するプログラムを見て「プログラムが横に長くなって見にくい・・・」と思わなかったですか?
見やすくするテクニックとして、オブジェクト変数を使った書き方があります。
変数については「変数の基本|宣言の書き方・使い方」で、文字型(String)と数値型(Long)の2つの方を説明しました。この変数は、文字や数値などの値を保存するものです。
今回のオブジェクト変数は、部品自体を保存する変数です。普通の変数に文字型(String)と数値型(Long)があるように、オブジェクト変数には、ワークシート型やセル型など保存したい部品に対応した型があります。
また、普通の変数と違い、保存する時にプログラムの先頭にSetと付けます。
Set オブジェクト変数 = 部品
ここでは、オブジェクト変数について細かく理解する必要はありません。「こんな書き方があるんだなぁ。見やすくていいな」くらいの感覚で真似をして使ってください。
実際に、さっきのセルA1に文字を書き込むプログラムを、オブジェクト変数を使って見やすくすると、次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub RensyuCell3() 'ワークシート型のオブジェクト変数 Dim wsTaisyo As Worksheet 'オブジェクト変数に部品(シート)を保存 Set wsTaisyo = Workbooks("セル練習.xlsm").Worksheets("Sheet1") 'オブジェクト変数でファイル・シートが指定できる wsTaisyo.Range("A1").Value = "オブジェクト変数をつかった" End Sub |
今回はRangeが1カ所しかないプログラムのため、「行数が増えただけでメリットないじゃん」と感じるかも知れません。
でも、実際のプログラムでは何回もRangeが出てきます。その時、このオブジェクト変数の使い方を知っていれば、すべてのRangeの箇所が短く見やすいプログラムで表現できます。
このオブジェクト変数のテクニックは、早い段階でマスターしておきましょう!
まとめ
- セルを操作する時は、どのファイル・どのシートか指定する
- オブジェクト変数を使うことで見やすくする