プログラミング初心者向けのVBA入門講座第8回です。
前回、前々回でオブジェクト式について紹介してきました。
→過去の入門講座目次はこちら
今回はそのオブジェクト式を実際に使ってみましょう。実際にVBAを記述して動かしてみることでより理解が深まると思います。
イミディエイトウィンドウ
オブジェクト式を使う前にVBEの機能のひとつであるイミディエイトウィンドウについて紹介します。
イミディエイトウィンドウではプロシージャを記述することなく1行のマクロを簡単にテストすることができます。またプロシージャから実行途中の情報をイミディエイトウィンドウに出力することもできます。

VBAを作成するうえで便利なウィンドウなので常に表示させておくことをおすすめします。
イミディエイトウィンドウの表示
VBEの「表示」メニューから「イミディエイトウィンドウ」を選択することで表示できます。

イミディエイトウィンドウはコードウィンドウの下側にドッキングしていますがタイトルバーをドラッグすることでウィンドウを独立することもできます。独立したウィンドウのタイトルバーをダブルクリックすると再びコードウィンドウの下にドッキングします。ウィンドウの境界をドラッグすることでウィンドウの大きさを変えることができます。
イミディエイトウィンドウを使ってみる
それではイミディエイトウィンドウに次の1行を入力してEnterキーを押してみてください。
msgbox “Hello”
メッセージボックスが表示されたと思います。
このように1行だけのマクロを簡単にテストすることができます。
この機能を使ってオブジェクト式を実行してみましょう。

ちなみにイミディエイトウィンドウではプログラム命令文の大文字、小文字は区別されません。すべて小文字で入力してもコードウィンドウのように自動で変換はされませんが小文字のままでも問題なく動作します。
オブジェクト式の実習
オブジェクト.プロパティ
イミディエイトウィンドウに次のコードを入力してEnterキーで実行してみてください。
range(“A1”).value = 123
セルA1に値が入力されたのが確認できますね。
この式は
オブジェクト.プロパティ = 値
のオブジェクト式です。
ここでの「=」は代入演算子なので右辺の値を左辺に代入するという意味です。

「123」という値をセルA1の値に代入した、ということです。
Value プロパティは指定されたセル範囲の値の設定および取得ができるプロパティです。(今の事例では「123」という値を設定しました)
では設定した値を取得してみましょう。
次のコードを実行してみてください。
msgbox range(“A1”).value
メッセージボックスに「123」という値が表示されましたね。これはValueプロパティで取得した値をメッセージボックスに表示したことを意味します。
では次のコードを実行してみましょう。
range(“B1”).value = range(“A1”).value
セルB1に「123」が入力されましたか?
これは右辺でセルA1の値を取得し、その値を左辺のセルB1の値に代入して設定したことを意味します。

ここでは右辺のValueプロパティは値を取得を、左辺のValueプロパティは値の設定を行いました
なお値に文字列を設定するときは「“(ダブルクォーテーション)」で囲います。
range(“C1”).value = “abc”
また複数のセル範囲に一度に値を設定することもできます。
range(“D1:D3”).value = 1
オブジェクト.メソッド
それではワークシートが3つ(例えば”Sheet1″,”Sheet2″,”Sheet3″)ある状態から次のコードを実行してみてください。
worksheets.add after:=worksheets(2)
ワークシートの左から3番目に新しいワークシートが挿入されましたね。
この式は
オブジェクト.メソッド 引数:=値
の式です。
オブジェクトとしてワークシートの集合体であるWorksheetsコレクションが指定され、シートを追加するAddメソッドが実行されています。
Addメソッドの引数のAfterは追加したシートの挿入位置を指定するための引数で、値で指定されたシートの後ろ(右側)に挿入します。ここではWorksheetsコレクションのインデックス番号2(左側から2番目のシート)の後ろ(右側)を挿入位置として指定しています。
オブジェクトの階層構造
それでは次は標準モジュールのコードウィンドウにプロシージャを記述してみましょう。
“Sheet1″をアクティブにした状態で次のプロシージャを実行してみてください。
Sub sample1()
Range("A1").Value = 10
Worksheets.Add
Range("A2").Value = 11
End Sub
どうなりましたか?
Sheet1のセルA1に「10」が入力され、新たに追加されたワークシートのセルA2に「11」が入力されていると思います。

Addメソッドで引数を省略するとアクティブなシートの左側に新しいシートが挿入されます。
これはセルのRangeオブジェクトの上位オブジェクト(親のオブジェクト)であるWorksheetオブジェクトの記述を省略したため、そのときアクティブなワークシートが指定されたためです。
最初はSheet1がアクティブになっていたのでSheet1のセルA1に値が代入されました。
次にWorksheets.Addによって新しいワークシートが挿入されると新しく挿入されたワークシートがアクティブな状態になります。
そのため次のRange(“A2”).Valueはそのときにアクティブになっている新しいワークシートのセルA2が指定されたことになったのです。
このようにマクロを実行している最中にアクティブなオブジェクトが変化すると省略された上位オブジェクトの意味も変わってくるので注意が必要です。
上位オブジェクトを省略せずに記述することでこのような影響を避けることができます。
Sub sample2()
Worksheets("Sheet1").Range("A1").Value = 10
Worksheets.Add
Worksheets("Sheet1").Range("A2").Value = 11
End Sub

このコードでもブックオブジェクトの記述を省略しています。ここで新しいブックを開いたりすればアクティブなブックが変化します。そのように複数のブックを取り扱うときはブックオブジェクトもきちんと記述したほうがよいでしょう。
まとめ
いかがでしたか?
イミディエイトウィンドウを使えば簡単にオブジェクト式をテストすることができるので、いろいろなオブジェクト式を試してみてください。
コメント