マクロ(Excel VBA)を勉強しだしてしばらくしてから、「オブジェクト」の壁にぶち当たりました。
「オブジェクト」という概念が何か? しばらくの間ほんっと〜に分からなかったのです。
今日は、自分自身が理解するのにかなり苦戦した「オブジェクト」について、自分なりの説明をしたいと思います。
1、オブジェクトとは
オブジェクト(object)というのは、「操作対象」のことを言います。
Excel VBA での「操作対象」としては、例えば以下のようなものがあります。
・ワークブック
・ワークシート
・セル
・図形
・グラフ
・インターネットエクスプローラー
上の例では、インターネットエクスプローラー以外はすべて Excel ファイル(ワークブック)の中のものということになります。
Excel のファイル(ワークブック)を開いて、ワークシートのセルに数値を入力したり、図形を挿入したり、グラフを描いたりすることがありますよね。
VBA を使って、これらに何らかの操作を行うこともできるわけです。
そして、VBA でプログラミングしてこれらの要素を操作対象とする場合に、「オブジェクト」と呼ぶわけですね。
2、セルに入力した値を使った計算でオブジェクトを意識したコードを書く場合
Excel VBA を勉強する人は、まずセルに入力した値を使って、何かしらの計算をするところから入る人が多いと思います。
セルに入力した値をいじって計算する場合には、オブジェクトという概念を意識しなくても問題ありません。
それに慣れた状態で、新たにオブジェクトを身に着けようとするから苦戦するわけです。
とは言え、VBA の学習の順序でいきなりオブジェクトから入るということは無いでしょう。
・セルに入力した値を使った計算
↓
・オブジェクト
という順番での学習は間違っていないと思います。
何とか1つ1つ整理しながら理解していくほかありません。
(Google Apps Script などでは、コードを習う前提としてオブジェクトの概念を理解していないと厳しい気がします。)
セルもオブジェクト
さて、先ほど「 VBA での操作対象の1つ1つがオブジェクト」という話をしました。
繰り返しになりますが、当然「セル」もオブジェクトということになります。
例えば、次のように「売上高」と「売上原価」から「売上総利益」を計算したい場合を考えてみます。
「売上総利益」の計算方法は ↓
売上総利益 = 売上高 - 売上原価
ですので、VBA でセル「C5」に売上総利益の計算結果を表示したい場合、
売上高としてセル「C3」に入力した値を、売上原価としてセル「C4」に入力した値を使って上記の計算を行うことになりますよね。
以下に VBA コードを示します。
オブジェクトを意識しない VBA コードと、意識した VBA コードを両方示します。
オブジェクトを意識しない VBA コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub UriageSourieki1() '売上高、売上原価、売上総利益の値を Doubleデータ型で定義' Dim Uriage As Double Dim Urigen As Double Dim UriageSourieki As Double '売上高、売上原価の値をセルから読み取り' Uriage = Cells(3, 3).Value Urigen = Cells(4, 3).Value '売上総利益の値を計算' UriageSourieki = Uriage - Urigen '売上総利益の値を書き出し' Cells(5, 3).Value = UriageSourieki End Sub |
上記のようなコードは VBA を習い始めて、すぐの方でも馴染みのある内容だと思います。
3つの変数 Uriage、Urigen、UriageSourieki は Doubleデータ型で定義しています。
数値として扱っているということですね。
変数 Uriage にはセル「C3」の値を入れ込んでいます。
セル「C3」の値は Cells(3, 3) の Value プロパティを使って指定します。
Value プロパティとは「値」を意味するプロパティなのですね。
Uriage = Cells(3, 3).Value
上記は Value プロパティを省略して以下のように記述しても問題ありません。
Uriage = Cells(3, 3)
これでも↑ 変数 Uriage にセル「C3」の値を入れ込んでることになるわけですね。
同様に Urigen にはセル「C4」の値を入れ込んでいます。
その後は、UriageSourieki を計算して、セル「C5」に書き出しています。
オブジェクトを意識した VBA コード
さて、上記のコードはセルは「オブジェクト」であるということを意識せずに書いたものです。
というか普通は上記のように書きます。
以下では「オブジェクト」というものを理解するために、あえて回りくどい書き方をしてみますね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Sub UriageSourieki2() '売上高のセル、売上原価のセルを Range型で定義' Dim Uriage_Cell As Range Dim Urigen_Cell As Range '売上高、売上原価、売上総利益の値を Doubleデータ型で定義' Dim Uriage As Double Dim Urigen As Double Dim UriageSourieki As Double '売上高のセル、売上原価のセルを代入' Set Uriage_Cell = Cells(3, 3) Set Urigen_Cell = Cells(4, 3) '売上高、売上原価の値を指定' Uriage = Uriage_Cell.Value Urigen = Urigen_Cell.Value '売上総利益の値を計算' UriageSourieki = Uriage - Urigen '売上総利益の値を書き出し' Cells(5, 3).Value = UriageSourieki End Sub |
オブジェクトを意識した書き方をすると、このように↑なります。
先とどこが異なるか、解説していきますね。
変数の定義
変数の定義から先とは違います。
Uriage_Cell 、Urigen_Cell は「セルそのもの」を入れる変数です。
「セルに入力する値」を入れる変数ではありません。
オブジェクト型の1つである Range 型(セルとして定義する型)で定義します。
1 2 |
Dim Uriage_Cell As Range Dim Urigen_Cell As Range |
Uriage、Urigen、UriageSourieki は「セルに入力する値」であり、先と同じように Doubleデータ型で定義しています。
1 2 3 |
Dim Uriage As Double Dim Urigen As Double Dim UriageSourieki As Double |
オブジェクト変数への代入
さて、Uriage_Cell、Urigen_Cell はセルそのものを入れる変数と説明しました。
このようにオブジェクトを入れ込む変数のことを、オブジェクト変数と呼びます。
オブジェクト変数へのオブジェクトの入れ込みは、以下のように記述します。
1 2 |
Set Uriage_Cell = Cells(3, 3) Set Urigen_Cell = Cells(4, 3) |
気を付けなければならないのは、Set を使うことです。
以下のように Set を使わずに記述したらエラーが出てしまいます。
Uriage_Cell = Cells(3, 3)
Urigen_Cell = Cells(4, 3)
売上高、売上原価の値を指定
売上高、売上原価の値を指定する箇所は以下のように記述します。
値を表す変数 Uriage は、セルを表す変数 Uriage_Cell の Value プロパティ(値を表すプロパティ)として指定しています。
Urigen も同様です。
1 2 |
Uriage = Uriage_Cell.Value Urigen = Urigen_Cell.Value |
3、まとめ
オブジェクトの概念は難しいです。
「セルもオブジェクト」と言われても、最初はわけがわかりませんでした。
ただ、VBA での「セルに入力した値を使った計算」の通常のコードの書き方が、
プログラミング全体の中では特殊と考えた方が良いでしょう。
他の言語では常にオブジェクトを意識した書き方をしなければならないものもあります。
自分自身の理解を整理する意味も込めて、今回の記事を書いてみました。