実践的まとめ①
操作対象として自由自在にセルを指定できることは、
VBAを扱う上での基本中の基本です。
Excelの階層構造に沿ったセルの指定方法について改めて理解しておきましょう。
ここでもイミディエイトウィンドウを使って、動きを見ながら説明します。
ブックを1つだけ開いている場合
まずは、ブックを1つだけ開いている場合です。
ブックが1つだけの時は単純です。
Range(“A1”)
が、今表示されているシートのA1セルを指します。
そして、
Range(“A1”).Value
がA1セルの値となります。
(Valueはそのセルの値を指すプロパティです)
イミディエイトウィンドウで確認してみましょう。
? Range(“A1”).Value
と入力すれば、A1セルの値を表示します。

Range(“A1”).Value = 200
とすれば、A1セルに「200」が入力されます。

いいですか?
この時、いきなり「Range」と入力していますが、実はRangeの前には省略されているモノがあります。
それは「ActiveSheet(アクティブシート)」と呼ばれています。
それを省略しないで書くと、
ActiveSheet.Range(“A1”).Value
となります。
ActiveSheetは、そのままの意味で、今アクティブになっているシートを指します。
1つのブックだけを開いている時には、選択されているシートのことです。
では、「Sheet1」がアクティブの時に、「Sheet2」を選択するとどうなるでしょうか?
Sheet2がアクティブになることで、ActiveSheetはSheet2を指すことになります。


ちなみに、イミディエイトウィンドウで
? ActiveSheet.Name
と入力してみると、今アクティブなのが、どのシートかわかります。
Sheet2がアクティブの時は「Sheet2」、
Sheet1がアクティブの時は「Sheet1」と表示されます。
このように、ActiveSheetはユーザーのシート操作で切り替わるため、プログラム上の問題を引き起こす原因となることがあるので使う際には注意が必要です。
Rangeとだけ書かれていた場合 & 書かれている場合、何かが省略されている。
それがActiveSheetであるということは意識しておきましょう。



アクティブでないシートのセルを指定する
今Sheet2がアクティブになっている(選択されている)状態で、
Sheet1のA1セルを、シート名を使って指定してみましょう。
今は、Sheet2がアクティブになっているので、単にRange(“A1”)と書くと、
Sheet2のA1セルを指定することになってしまいます。


なので、Sheet2がアクティブになっている状態でSheet1のセルを指定するには、
シート名を指定する必要があります。
Worksheets(“Sheet1”).Range(“A1”)
ですね。


Sheet2が選択されている状態でも、この書き方をすればSheet1のセルを操作することができます。
つまりシート名を指定すれば、ブック内のどのシートも操作対象として指定することができるのです。
また、シートはシート名ではなく数字で、次のように指定することもできます。
Worksheets(2).range(“A1”)
これは左から2番目のシートのA1セルを意味します。


この指定方法は、あくまでも左からのシートの位置(順番)を指定することになるので、シートを並び替えると順番が変わってしまいます。
どんな時に使うのでしょうか?
よくあるパターンとしては、ブックの全シートに対して処理をする時に使います。
数字のみの指定なので、シート名よりも扱いやすく処理しやすいことがあるのです。
ちなみに、WorkSheetsを指定した時も省略されているモノがあります。
それは「ActiveWorkbook」と呼ばれています。
省略しないで書くと、
ActiveWorkbook.Worksheets(“Sheet1”).range(“A1”)
ActiveWorkbook.Worksheets(2).range(“A1”)
となります。
ActiveWorkbookは、今アクティブになっているブックを指します。
1つのブックだけを開いている時には、その開いているブックを指すことになります。


ブックも含めて指定する
では、ブックも含めてセルを指定してみましょう。
「Book1.xlsm」の「Sheet1」の「A1セル」を指定するには
Workbooks(“Book1.xlsm”).Worksheets(“Sheet1”).Range(“A1”)
となります。


ブック、シートを含めてA1セルを指定して、A1セルに「1000」を入力するには、
Workbooks(“Book1.xlsm”).Worksheets(“Sheet1”).Range(“A1”).Value = 1000
となります。


複数のブックを開いている場合の指定方法
複数のブックが開いている場合、ブックを指定する/しないを意識する必要があります。
ブックを指定する場合は、先ほどと同様、ブック名を指定すればOKです。
つまりBook1.xlsm、Book2.xlsmの2つのブックが開いているとします。
それぞれのブックのSheet1のA1セルを指定するには、
「Book1.xlsm」の「Sheet1」の「A1セル」
Workbooks(“Book1.xlsm”).Worksheets(“Sheet1”).Range(“A1”)
「Book2.xlsm」の「Sheet1」の「A1セル」Workbooks(“Book2.xlsm“).Worksheets(“Sheet1”).Range(“A1”)
となります。


ブック名を指定しない時には、アクティブになっているブックがActiveWorkbookとなり、そのブックに対して処理が行われます。
また、ブックもブック名ではなく数字で、次のように指定することもできます。
Workbooks(1).Worksheets(“Sheet1”).Range(“A1”)
これは「1番目に開いたブック」の「シート名Sheet1」の「A1セル」を意味します。


Book1.xlsm、Book2.xlsm
の2つのブックを開いた時には、最初に開いたブックがworkbooks(1)となります。
この指定方法は、ブックを開いたり、閉じたりすると、順番が変わってしまうので使うときには注意が必要です。
その点、ブック名を使えば、ブックが3つ、4つと開いていても、どのブックでもブック名で指定できます。
他にもThisWorkbookというよく使われるモノがありますがここでは詳しく説明しません。
ThisWorkbookの使い方は、今後VBAのプログラムを書く中で学んでいきましょう。
全階層を使った指定方法
最後に、階層の一番上、Applicationから書いてみましょう。
Application.Workbooks(“Book1.xlsm”).Worksheets(“Sheet1”).Range(“A1”)
となります。
これが全階層を省略しない書き方になります。


操作対象の指定する時には、Applicationは省略されていること前提で、通常は書きません。
Applicationは省略されているんだということを頭の片隅においておけば大丈夫です。
では、次はこの操作対象の指定方法をどのように読み解くかを学びましょう。




