エクセルのVBAでロールオーバーが実現できないのか | 白ウサギのIT情報局~元プログラマーがIT情報を発信中~

白ウサギのIT情報局~元プログラマーがIT情報を発信中~

IT関連情報やパソコン・プログラミングについて元プログラマーが情報発信!
得意分野はエクセル・ワードやC言語、PL-SQL、PHP等。
今は業務でエクセルを使っているので、無駄にエクセルに詳しくなりました^-^/

こんばんは、白ウサギです。

実は今エクセルVBAを使ってちょっとしたゲームを作っていて、ロールオーバーの機能が必要になったのですが、意外に難しいことに気づきました。

折角色々調べたので記事にしてみます^-^/


※ ロールオーバーとは
マウスを画像などの上に持ってきた場合に、別の画像に切り替わる機能。
WEB上でボタンの上にマウスを持っていくと、色が変わったりする機能になります。


さて、普通に考えると、ロールオーバーしたいオブジェクトの上に
 1 マウスカーソルがきた
 2 マウスカーソルが外れた
という2つの状態がイベントで取れれば、そのタイミングで画像を入れ替えることで実現できそうです。
マウスカーソルがボタンの上にきたら、色の違うボタンの画像を表示。
マウスカーソルがボタンの上から外れたら、元の色のボタン画像を表示。
これでロールオーバー完成です^-^/やったー



しかし、なんとエクセルのVBAには上記2を実現するイベントがありません
オブジェクトからマウスが外れたタイミングを取得することができないんです(>_<)

そこで調べてみたところ、上記1については、「Mouse_Move」というイベントがあるので、このイベントだけでなんとかするのが主流のようです。


※Mouse_Moveイベント
マウスポインタがオブジェクトに入ると発生するイベント

具体的には、マウスオーバーの画像オブジェクトを2枚重ねておいて、ボタンにマウスが入ったら上の画像を非表示にして、フォームにマウスが入ったら上の画像を表示することで実現します。

こんな感じ

'--  フォームのマウスムーブ
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
    'スタートボタンの表示
    StartButton.Visible = True
End Sub

'-- スタートボタンのマウスムーブ
Private Sub StartButton_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
    'ボタンの上をマウスが通過した際に、表示を変える
    StartButton.Visible = False
End Sub


なぜ、画像オブジェクトを2枚用意して重ねる方法を取るかというと、1枚の画像オブジェクトの画像を切り替える方法だと速度の関係だと思うのですが、マウスオーバーの際にちらつくんです。

2枚のオブジェクトを用意する方法だと、マウスオーバーが綺麗に表示されますので、この方法を採用しています。

しかし、この方法にも弱点があります。

長くなりましたので、そこについてはまた別の機会に^-^/