
こんにちは。ネコヲです。最近VBAを勉強し始めた40代事務員です。
2021年6月23日に行われた、ノンプロ研のVBA初心者講座第4回講義。
今回は「オブジェクトとコレクション」です。

めっちゃくちゃ内容盛りだくさんだったぞ!
さっそく、いってみましょう!
オブジェクトとコレクション

オブジェクトとコレクションを直訳すると「物体と集合」?
オブジェクトとは、例えば、
「Workbook」だったり、
「Worksheet」だったり、
一個一個のセルだったり、
VBAで操作できる対象物のことをいいます。

ふむふむ、オブジェクトというのはVBAで操作できる対象物か。オブジェクトに対して色んな操作を行うんだな!
オブジェクトのプロパティとメソッド
オブジェクトは、プロパティとメソッドによって操作を行います。
プロパティとは、オブジェクトが持つデータのことです。
名前とか、サイズとか、色とか、画面上の位置、値などなどです。
一方メソッドは、オブジェクトが持つプロシージャ(手続き)です。

オブジェクトが持つプロシージャ(手続き)?
例えば、セルを選択したり、シートを追加したりなどなど、メソッドで動的な操作を行います。

ふむふむ、オブジェクトは、プロパティとメソッドで操作するんだな!
プロパティとメソッドはめちゃくちゃ種類があって、オブジェクトブラウザという画面で確認できます。
VBEの画面からF2キーを押すと、オブジェクトブラウザが登場し、
各オブジェクトに紐づくプロパティとメソッドを確認することができます。
アイコンでプロパティかメソッドかを区別できます。
画像引用:Microsoft
コレクションはオブジェクトの集合体
コレクションは複数のオブジェクトの集合体です。
例えば、一つ一つのWorkbookが集まると、Workbooksコレクションとなります。
引用画像:ノンプロ研講座資料より

ふむふむ。オブジェクトが複数集まるとコレクションなんだな!ザックリだけど理解したぞ!
オブジェクト式とオブジェクト変数
次に、オブジェクトを指定するためのオブジェクト式を見ていきましょう。

お!知ってるぞ!オブジェクト式って、
「Range(”A1”).value = 5」
こういうやつだろ?よく見るぞ~。
実はこの「Range(”A1”).value = 5」という式ですが、正確に書くとこうなります。
※〇にはインデックス番号や、ブック名、シート名が入ります。

ずいぶん長いな!
オブジェクトは階層構造が存在する!
VBAのオブジェクトは階層構造になっています。
ExcelというApplicationの配下にWorkbookがあり、Workbookの配下にWorksheetがあります。さらにWorksheetの配下にRangeがある、という階層構造です。

ん?下の階層に行けば行くほどドンドン数が増えていくな!
Rangeってセルのことだろ?セルはいっぱいあるぞ!
そうなんです。なので、例えばWorksheetが複数存在するWorkbookにおいて、Range(”A1″)(※A1のセル)の操作を行う場合、ちゃんとどのWorksheetのA1セルなのかを指定する必要があるんですね。

でも、実際色んなコードみてるけど、Application~から書いてる長ったらしい記述なんて見ないぞ!
上位のオブジェクトの指定を省略できる!
実はVBAでは、上位オブジェクトの指定を省略できるんです!
引用画像:ノンプロ研講座資料より
Application.Workbooks(〇).Worksheets(〇).Range(”A1”).value = 5の場合、いきなり上位オブジェクトをすっとばして、Rangeから書き始めることができるんですね。

おお、ラクチンだぞ!
ただし、この場合注意が必要です。すっ飛ばして書くと、今現在使用しているアクティブなシート上で処理が行なわれます。
シート1のRange(”A1”)に5と代入したかったのに、シート2を選択した状態で、プログラムを実行すると、シート2のRange(”A1”)に5が代入されてしまいます。

え!そうなのか、それは危険だな!
また、例えば、「Worksheets(”4月”).Range(”A1”).value = 5」という記述があったとします。

シート名「4月」のA1セルに5を代入する、という意味だな。
でも、もしもユーザーが勝手にシート名を「4月」から「5月」にかえたとしたら・・・
当然、エラーとなってしまいます!

なんと・・・じゃあどうすればいいんだ?
オブジェクト名を使って式をかく!
解決策は、オブジェクト名にあります。

オブジェクト名?なんだそれは?
オブジェクト名とは、コード内で使えるオブジェクトの名前で、シート名とは別物になります。
オブジェクト名を変えるにはVBEの画面を開かないといけないので、シート名と違ってユーザーの干渉を受けにくくなります。
先ほどの記述ではシート名で指定しているので、当然ながらシート名を変えてしまうとエラーとなってしまいます。
そこで「Worksheets(”4月”)」の部分を、オブジェクト名の「Sheet1」に変更して実行すると、
↓
シート名が変更されたとしても、ちゃんとA1セルに「5」が入力されております!
オブジェクト名で指定するとユーザーの干渉を受けないのでオブジェクト名を指定しよう!
書きやすいうえにシンプルでユーザーの干渉もほぼ受けない!#ノンプロ研 #VBA講座— alice (@alice37308108) June 23, 2021
ActiveCell
ActiveSheet
ActiveWorkbook
など、アクティブな、はユーザー操作の干渉受けるのでなるべく使わないように。
(使うときはオブジェクト変数に入れればOK)
#ノンプロ研 #VBA— 根岸 (@2a9SouLnhptnIqG) June 23, 2021
オブジェクトも変数として使いまわせる!
オブジェクトは変数に格納して使いまわすことができます。
変数の宣言は、「Dim 変数 As 型」です。
講座1回目で習った文字列や整数値の変数宣言と同じですが、型については、オブジェクト固有の型になります。
Workbooksコレクションを変数に格納 | Workbooks型 |
Workbookを変数に格納 | Workbook型 |
Worksheetを変数に格納 | Worksheet型 |
Rangeを変数に格納 | Range型 |

そのまんまだから覚えやすいな!
オブジェクトを変数に格納するときは「Set」を付ける必要があります。
サンプルコード
オブジェクトを省略できる便利なWithステートメント

とにかく書くのだるいんだよな~。
そんなときに便利なのが「Withステートメント」です。
書き方はこちら!
.メンバー(プロパティorメソッド)
End With

なんだこれは?
サンプルコードを見てみましょう。

なるほど、with~End With間は、「.メンバー(プロパティorメソッド)」から書けていけばいいのか!
コレクションのループ
複数のオブジェクトの集合体であるコレクション。
コレクションに対して、一つ一つのオブジェクトを取り出してループさせるやり方があります。
For Each~Next文
For Each~Next文の書き方は、次の通り。
’処理
Next 変数
サンプルコード
シートがたくさん存在するので、シート名をすべて取り出しています。

これは実務でめちゃくちゃ使えそうだぞ!
第4回の講義を追えて

いや~、今回もかなりボリューミーな講義でした!
生講義1回目参加時→五感をつかい情報を浴びている状態。聞くのと写経で必死。
動画2回目視聴時→宿題に取り組むことで、なんとなく感覚をつかむ
動画3回目視聴時→この段階でやっとブログに落とし込める

ほんと、1回だけでは40代の脳みそおっつかねえでげす!
ですが、復習を重ねると、「おお!そういうことか!」と気がつくことが増えてくる。
やっぱり、アウトプット前提だと学習効果が高いなと実感しております!ほんと、アウトプットは偉大です。

インプット→アウトプット→実務用ツールを作る。ホップステップジャンプの3段階でVBAを習得してくど~!