はもちくわ

コードについて自分なりの解釈を書いてます。

【ExcelVBA】ボタンを自作する方法

f:id:hamochikuwa440:20220303211138p:plain

f:id:hamochikuwa440:20220310114431p:plain

ExcelのフォームコントロールActiveXコントロールには様々なボタンが準備されており、社内の通常業務をExcelを使ってシステム化するだけならこれだけで十分すぎる機能です。
でも、もう少し遊び心を入れたい、デザインを凝ったものにしたい、別ソフトみたいにしたい、なんて思っている方、ここに面倒な方法でちょっと作ってみた馬鹿な私がおります(笑)参考にしていただければ、そんな私も救われますのでぜひ見ていってください!!

ボタンを動いているように見せる仕組みとしては、オートシェイプで押される前後のボタンの画像を作り、その2つをVBAで作ったマクロで交互に表示と非表示をさせて動いているように見せるようにします。
このボタンデザインのとき、私が気をつけているポイントを下に画像と一緒にまとめてみます。

f:id:hamochikuwa440:20220225145514p:plain

f:id:hamochikuwa440:20220225145738p:plain

こんな感じです。
さらに、押された後のものを押される前の右下に少しずらします。ホントにほんの少しですよ。
以上の事を気をつけて、実際に動いているものを作成し、下にGifアニメで作ってみました。

f:id:hamochikuwa440:20220225150339g:plain

わかりにくい(笑)でも少しは伝わりますかね??Gifアニメ画像の下ボタンは押すと光る丸ボタンのイメージです。ここではやってませんが、押すと光って、もう一度押すと消えるのような使い方がベストです。バスの降車ボタンの感じです。
このへんは自由にデザインできるので、みなさんもいろいろ試してみたらよいかと思います。

CSSとHTMLでExcelに寄せてつくってみると、

押して!

こんな感じかな。。。Excelとはそもそも仕組みも作りも違うのですが、見せ方、考え方は一緒です。

(ここではHTMLのP要素にclassでデザイン指定して、CSS側のactiveで変化させています)

 

そして動いている感じにするために肝心な事がもう一つあります。それは動きをしっかり見えるように画面更新させ、コンマ何秒かの待ち時間をつくることです。オートシェイプの画像の表示、非常時の切り替えだけですと、動いているように見えません。

今回のGifアニメで動いているコードをそのまま紹介します。

Sub on_off_button()

'ボタンのOffを非表示、Onを表示
With ActiveSheet
   .Shapes("Off").Visible = False
   .Shapes("On").Visible = True
End With

’画面の変更を更新させて0.1秒待つ
With Application
   .ScreenUpdating = True
   .Wait [now()] + 100/86400000
End With

’オートシェイプのWindowを指定の位置にずらして青文字で指定文字列を表示
With Activesheet.Shapes("Window")
   .Top = 85
   .Left = 150
   With .TextFrame.Characters
      .Text = "□ボタンが押されました"
      .Font.Color = RGB(0,0,255)
   End With
End With

'ボタンの画像の表示を入れ替える
With ActiveSheet
   .Shapes("Off").Visible = True
   .Shapes("On").Visible = False
End With

’画面の更新
Application.ScreenUpdating = True

End Sub

このコードをボタンOffの方にマクロ登録させて、Onの方はシート側で非表示させておきます。同じように丸ボタン分も別にコードを作っておけばGifアニメのように動きます。ただ、このような同じような処理をさせるならFunctionで関数化したほうが効率的ですね。
また、このサンプルではオートシェイプの指定に名前を使っています。このようにわかりやすい名前をつけておくと後々見るときに便利です。コードを作成する前に変更させておくと良いです。
オートシェイプの名前変更や、表示・非表示の仕方は、リボンの双眼鏡「検索と選択」の「オブジェクトの選択と表示」を使うと便利ですよ。

 

また、このサンプルではWindowと名前をつけたオートシェイプの文字列と位置を変えてます。こんなふうに移動したり、文字を変えたりして使えるのでMsgBoxだけじゃなぁと感じている方はオートシェイプをウインドウの代わりにする方法も凝ったデザインを使えますので面白いですよ。
ボタン付きで使えないのでは?とご心配の方、ご安心あれ!オートシェイプにボタンを配置してグループ化し、グループの名前をVBAで指定すれば、単体のオートシェイプと同じように使えます。
なので、先にボタン付きのウインドウを作っておいて、常には消しておき、表示、移動をさせるキッカケを作ればいいわけです。
「でも、表示させる場所の指定が数値だけじゃなぁ。。。」と考えちゃいますよね。確かにこのサンプルはTopとLeftを数値でしてますが、実はセルの場所でも設定できます!

例えば、小技1で使ったダブルクリックしたら、、、と合わせて使うと、

f:id:hamochikuwa440:20220225155532g:plain

ダブルクリックでついてくるWindowの出来上がりです!
サンプルコードは簡単で、ワークシートのBeforeDoubleClickにコードを入れます。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
With Activesheet.Shapes("Window")
   .Top = Range(Target.Address).Top
   .Left = Range(Target.Address).Left
   With .TextFrame.Characters
      .Text = "ダブルクリックされました"
      .Font.Color = RGB(0,0,0)
   End with
End With

Cancel = True

End Sub

先程のサンプルとほぼ一緒ですね。ただ、指定方法がRangeとセルを指定しているだけです。このサンプルではダブルクリックをキャンセルしていますが、通常のExcelのように使うならCancelは外しましょう。

また、このサンプルのままですと、オートシェイプが消されたり、変更されてしまう恐れがあります。
なので、それを回避するために、VBA側でオートシェイプを保護してしまいましょう。コードを変えずにシート側で保護してしまうと、このサンプルのままですとエラーになるので注意しましょう。

保護するにはどのようにするかといいますと、サンプルコードの始まりに

Activesheet.Protect DrawingObjects:=False

と入れて、最後に

Activesheet.Protect DrawingObjects:=True

とします。あら、簡単(笑)これでオートシェイプは保護され、マクロだけ反応します。オートシェイプにカーソルが載った時の移動矢印も出なくなるのでよりシステムらしくなります。

まあ、、、、正直、Excelでここまでする需要はないですかね(笑)

また何か思いついたら書きま〜す。

 

【追記】
2020年3月10日
タイトル画像もボタンにしてみました!

日本では「押すな」は「押せ」ですかね(笑)こんなボタンが業務にあると楽しいのにな〜