超多忙中
ご飯を食べて寝るために帰ってきつつ,家でもやれることを仕事中。
息抜きに来ました。
今日から比較的大量なデータと本格的に向き合う時間になり,より具体化してきたので,細部にわたり作ってました。
いまだにここを参考に何度も戻る。本当に的確にアドバイスをいただいている記事でありがたい限りです。
集計がとても面倒なものも多く,クラスモジュール中で他のプロパティの値を使いたいなぁというケースに多々出会う。
そうか,そのために内部変数を持たせてあるのか。あんなんいらんやんと思って作ってませんでしたが,せっせと作り,これでうまくいくんじゃない?
実行してみると,うまくいくところとうまくいかないところがある。
あれれ。。?
そうか,プロパティプロシージャにも実行される順番があるのか。どうやって順番をうまく制御したらいいんだろう??
そんな悩みを持ったままお風呂に入ったら,
なんかコンストラクタとかいうのがあったぞ!! ← イマココ
なんかうまくできそうな気がしてきました。
あるべくしてあるんだなぁとしみじみ。
・・・
いちおう挙動を確認したくて次のようなことをしてみた。
標準モジュール
Sub test() Dim a As Class1 Set a = New Class1 Stop End Sub
Class1.cls
Option Explicit 'Class1 Private tmpValue As Long Property Get pA() As Long tmpValue = 1 Debug.Print tmpValue End Property Property Get pC() As Long tmpValue = 3 Debug.Print tmpValue End Property Property Get pB() As Long tmpValue = 2 Debug.Print tmpValue End Property
ローカルウィンドウを確認して,aの中身を見ようとしたタイミングでイミディエイトウィンドウに値が出力されました。
1
2
3
ふむふむ上から下にいくとは限らないのか。ローカルウィンドウにはアルファベット順に値が並ぶのでその順なのかなー。
Class1のpAをpDに書き換えてみた
Class1.cls
Option Explicit 'Class1 Private tmpValue As Long Property Get pD() As Long tmpValue = 1 Debug.Print tmpValue End Property Property Get pC() As Long tmpValue = 3 Debug.Print tmpValue End Property Property Get pB() As Long tmpValue = 2 Debug.Print tmpValue End Property
タイミングはさっきと同じタイミングで出力され,
2
3
1
やっぱりアルファベット順ぽいです。
ローカルウィンドウで確認しているからこの挙動なのかもしれませんが,
あきらかに実行される順番があるというのは確実に確認できた。(アタリマエデスネ)
他のプロパティを使いたいなら内部変数を使う必要はありそうだけど,コンストラクタとかをうまく使わないといけないみたいね。
勉強になりました。
原因がわかれば対処はできるから,引き続き仕事に戻ります。
気が済んだ(゚▽゚*)
追伸 思った通りいかない (・・? あれれ
さらに追伸 思った通りいきました。複雑な構造だったので,コンストラクタに値取得のコード書いたら,各パラメーターがまだ取得されてないという事態に・・(゚▽゚*)
標準モジュールからクラスを呼び出す → まだ値は取れていないのでコンストラクタでは作業をしない → パラメータ取得した → 値取得メソッドで自分がやりたい順番にきちんと値を入れていく→コレクションに詰める。
こんな順番できちんとやれました。解決解決。。
時間が無い時だとあせるけど,頭も痛いけどオモシロイナ。明日は何時に帰れるのだろうか(;´▽`A``
普段早く帰れてるから,やむを得ません(ΦωΦ)