Excelでアドベントお手紙カレンダーを作ろう-その5-
はじめに
今回は前回に引き続き、
クリスマスっぽいものを記事を通して作ってみよう!
という企画の続きです。
...そろそろ飽きてきちゃいましたか?
前回は、
VBAを使って、クリックしたときに反応する仕組みをつくる
という回でした。
今回は、前回のクリック判定を使って、
各オーナメントにお手紙を持たせる
ところまで進める予定でした。
が、
その前に。
実際に触っているうちに、
ちょっと無視できない疑問が出てきました。
疑問発生
本当にオーナメント単位で判定できているの?
前回の記事では、
・図形(オーナメント)をクリックできる
・クリックした図形の名前を取得できる
というところまで実装できました。
「おお、Excelが反応した!」
と、かなりテンションは上がったのですが...
少し触っているうちに、「あれ?」と思う挙動に気づきます。
今回のオーナメントは、
・日付が書かれたテキストボックス
・装飾用の図形
といった 複数の図形をグループ化したもの です。
見た目は完全に「1つのオーナメント」なのですが、
実際にクリックしてみると、
押す場所によって表示される図形名が変わる
という挙動が起きました。
つまり、
同じオーナメントのはずなのに
VBA的には別物として扱われている可能性がある
ということです。
このまま進めてしまうと、
あとから処理がややこしくなりそうな予感しかしません。
設計の見直し
そこで、ここで一度立ち止まって
ChatGPT先生に相談してみました。
すると、「Excelの図形あるあるです。設計を少し変えた方が安全かもです。」という返答が返ってきました。
何度かためしたけどだめだったこと
最初は、
・グループにマクロを登録する
・グループ名を ornament_01 のように統一する
という方針で進めました。
しかし、
マクロはグループに登録しているのに、
Application.Caller で取得できるのは中の「楕円」や「テキストボックス」の名前という状態がどうしても解消できませんでした。
「グループ名で判定したいのに、なぜかパーツ名が返ってくる……」
という状況です。
ということで、ここで前回作ったマクロはいったん全部消します...
判定用の図形を足そう
そこで採用したのが、判定用の図形を別で用意するという方法です。
考え方はとてもシンプルです。
・見た目用のオーナメント(装飾)は今まで通り
・その上に、透明な図形を1枚重ねる
・クリック判定は、その透明図形だけに任せる
この透明図形にだけマクロを登録し、
名前を ornament_01 , ornament_02 のように設定します。
これで、どこをクリックしても必ず「ornament_○○」が取得できる
という状態を作れます。
人の認識と、VBAの判定を無理やり一致させるイメージです。
判定用図形の設定
判定用の図形は、以下の設定にします。
・塗りつぶし:なし
・枠線:なし
・最前面に配置
見た目には一切影響しませんが、クリック判定だけはしっかり拾ってくれます。
お手紙の実装
設計が固まったので、改めて「お手紙」を表示する処理を書いていきます。
今回はまず、
MsgBoxでメッセージを表示するところまで
をゴールにします。
VBAコードを書く
前回と同じく、標準モジュールにコードを書きます。
処理の流れは以下の通りです。
・クリックされた図形名を取得
・名前から日付を取り出す
・日付に応じたメッセージを表示
コードは以下のようになります。
※実際には、[Case "03"]以降も記載を追加しておりますが、長くなってしまうため割愛しております。
Sub Ornament_Click()
Dim groupName As String
Dim dayNumber As String
Dim message As String
' クリックされたオーナメント名を取得
groupName = Application.Caller
' ornament_05 → 05
dayNumber = Replace(groupName, "ornament_", "")
Select Case dayNumber
Case "01"
message = "12月1日のお手紙です。はじめまして!"
Case "02"
message = "12月2日のお手紙です。少しずつ寒くなってきましたね。"
Case "03"
message = "12月3日のお手紙です。今日もお疲れさまです。"
Case Else
message = "まだ準備中のお手紙です。"
End Select
MsgBox message, vbInformation, "アドベントお手紙"
End Sub
動かしてみる
そんなこんなで、無事に動作するようになりました。
試しに押してみましょう!
こんな感じで、お手紙を開くことができました!
これでやっと、
「このオーナメントには、このお手紙」
という対応付けができた感じです。
おわりに
今回は、
新たに発生した問題の解消や、
各オーナメントにお手紙を持たせる
ところまで進めることができました。
次回は、
・日付制御(当日まで開けない仕組み)
・見た目も含めた完成形のお披露目
をやっていく予定です。
次回はおそらく最終回です。
のんびりですが、最後まで一緒に作っていきましょう!
