エクセルのコマンドボタンが上下からにゅっと顔をだすプログラム
エクセルのVBAを使ってコマンドボタンがにゅうっと表示されるプログラムです
ダウンロードファイルを開くとSheet1に簡単な電卓が表示されます
上段と下段にそれぞれ数値入力用セルを二つ用意しその間に演算子を入力するセルを準備しました。そしてその横に入力した数値をクリアするコマンドボタンを一つ配置しました。
上段と下段の演算子用のセルにはそれぞれ、その下に縦に配置した演算子の候補セルをダブルクリックすることで入れ替えできるようにしてあります。
なぜ上下段に同じ電卓を用意?
上下段の電卓は同じように見えますが、それぞれセルの扱い方が違うのでその違いによってコードの書き方が変わることを表現しました。上段では単独のセルを使っていて下段では複数のセルを結合した状態を一つのセルに見せて作ってあります。
ある程度VBAを知っている方には大変つまらない記事だと思います。
コード全文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
Private Sub CommandButton1_Click() '上の段 ActiveSheet.Range("C4").ClearContents ActiveSheet.Cells(4, 5) = "" ActiveSheet.Cells(4, "G").ClearContents Range("C4").Select End Sub Private Sub CommandButton2_Click() '下の段(複数のセルを結合しているので、セル指定を扱うときは注意) ActiveSheet.Range("C8", "C11").ClearContents '列の指定を数字で ActiveSheet.Range(Cells(8, 5), Cells(11, 5)) = "" '列の指定を文字に変える ActiveSheet.Range(Cells(8, "G"), Cells(11, "H")).ClearContents Range("C8").Select End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column = 4 And Target.Row >= 14 And Target.Row <= 21 Then ActiveSheet.Range("D4") = Target.Value ActiveSheet.Range("D8") = Target.Value ActiveSheet.Range("D14", "D21").Interior.ColorIndex = 0 Target.Interior.ColorIndex = 36 Call keisann Cancel = True End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Column = 3 And Target.Row = 4) Or (Target.Column = 3 And Target.Row = 8) Then Target.Offset(0, 2).Select ElseIf (Target.Column = 5 And Target.Row = 4) Then Target.Offset(4, -2).Select Call keisann ElseIf (Target.Column = 5 And Target.Row = 8) Then Target.Offset(-4, -2).Select Call keisann End If End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) If (Target.Column = 3 Or Target.Column = 5) And (Target.Row = 4 Or Target.Row = 8) Then ActiveSheet.Range("C4", "E8").Interior.ColorIndex = 0 Target.Interior.ColorIndex = 36 Call keisann End If End Sub Sub keisann() Application.EnableEvents = False Select Case Range("D4") Case "たす", "+" Range("G4") = Range("C4") + Range("E4") Range("G8") = Range("C8") + Range("E8") Call botanderu Case "ひく", "-" Range("G4") = Range("C4") - Range("E4") Range("G8") = Range("C8") - Range("E8") Call botanderu Case "わる", "÷" '0で割り算するとエラーになるんで対処する If Range("C4") <> 0 Then Range("G4") = Range("C4") / Range("E4") Call botanderu Else Range("G4") = "" End If If Range("C8") <> 0 Then Range("G8") = Range("C8") / Range("E8") Call botanderu Else Range("G8") = "" End If Case "かける", "×" Range("G4") = Range("C4") * Range("E4") Range("G8") = Range("C8") * Range("E8") Call botanderu End Select Application.EnableEvents = True End Sub 'ボタンが上下からにゅうっと顔を出す動作 Sub botanderu() Dim i As Integer Dim btntakasa As Integer Dim topiti As Integer 'ボタン2のトップ位置を指定 topiti = 133 btntakasa = 40 With Sheet1 'ボタンの高さを指定 .CommandButton1.Height = btntakasa .CommandButton2.Height = btntakasa For i = 3 To btntakasa Step 3 'スピード倍速調整 '上から下へにゅうっとでる .CommandButton1.Height = i '下から上へにゅうっとでる .CommandButton2.Top = topiti + btntakasa - i .CommandButton2.Height = i 'スピード調整 Application.Wait [Now()] + 1 / 86400000 DoEvents Next i End With End Sub |
プロシージャ解説
電卓プログラムの説明
数字を入力するセルに数値を入力して演算子を入れると計算結果を表示するだけの簡単な電卓です
下の段に縦に並んだ演算子のセルをダブルクリックすると電卓の演算子セルが入れ替えて計算します。
特に動作は難しいものではありません。この電卓は完ぺきではありません。プログラムでは以下のような処理が不十分です。
●計算用セルに文字列を入力した場合のエラー処理
●割り算したときにボタンがにゅうっと出る動作が二回実行される
●演算子を直接手入力で入れた場合、想定外の記号や文字列を使った時のエラー処理
上段のコマンドボタン1をクリックしたときの処理
Sub CommandButton1_Click()の機能
電卓の数値入力セル値とその数値の計算結果表示セル値をクリアする
ー--------------------------------
上段の緑色ボタンをクリックで、電卓の数字部分のセル値をクリアする
一行目の書き方と二行目の書き方に注目。
一行目はセルC4の値を直接的にクリアする命令文です
二行目はセルの表現にcells()を使って、4行目、5列のセル値に未定義値、長さ0の文字列を設定するという意味になります
3行目はさらにcells()の列位置を文字列で表しています。4行目、G列という意味です
このように一つの動作を表現する方法として様々な書き方があるということです。
下段のコマンドボタン2をクリックしたときの処理
Sub CommandButton2_Click()の機能
電卓の数値入力セル値とその数値の計算結果表示セル値をクリアする
ー--------------------------------
上段の電卓では一つのセルをそのまま使用していますが
下段の電卓では複数のセルを結合して一つのセルとして扱っています
この場合は上段の電卓とは少し違ったセルの指定をしなければなりません。
一行目はRange()でセル範囲を表していますC8~C11の範囲の値をクリアするという意味です
二列目、三列目はRange()範囲のセル位置の指定をCells()を使っています。
演算子のセルをダブルクリックしたときの処理
機能
電卓の二つの数値セルを計算するとき、その演算子の種類を変化させる
ー--------------------------------
シートの4列目の14行~21行に設定している演算子の内のどれかをダブルクリックしたときそのセルの値を二つの電卓の演算子として採用する。(同時にそのせるのバックカラーを薄い黄色にセットする)
シートの特定のセルの値が変化したときの処理の読み方
Sub Worksheet_Change()の機能
ワークシートのセルの値を変化させたとき、それがどのセルなのかを知る必要があります。
If (Target.Column = 3 And Target.Row = 4) Or (Target.Column = 3 And Target.Row = 8) Then
Target.Offset(0, 2).Select
ElseIf (Target.Column = 5 And Target.Row = 4) Then
Target.Offset(4, –2).Select
Call keisann
ElseIf (Target.Column = 5 And Target.Row = 8) Then
Target.Offset(–4, –2).Select
Call keisann
End If
End Sub
コード群の2行目から3行目の読み方
Target.Column = 3 And Target.Row = 4 は変化したときのセル位置が3列目で、かつ4行目のセル
Target.Column = 3 And Target.Row = 8 は変化したときのセル位置が3列目で、かつ8行目のセル
をOrでつないでいるので3列4行目のセルか又は3列8行目のセルが変化したときにその下のコード群3行目 Target.Offset(0,2).Select が実行されます。
値の変化したセル位置が3列4行目セルか3列8行目のセルならのその列位置から二個右側にずらした位置のセル(次の入力位置のセル)を選択します。
コード群の4行目から6行目の読み方
Target.Column = 5 And Target.Row = 4 は変化したときのセル位置が5列目で、かつ4行目のセル
なら Target.Offset(4, –2).Select と
Call keisannを実行します
値の変化したセル位置が5列4行目セルならその行列位置から4行下で二個左の次の入力位置のセル)を選択し
keisannを呼び出しています。
keisannは、それらのセルに入力された数値と演算子の組み合わせで計算しその結果を表示させるサブルーチンプロシージャです。
コード群の7行目から9行目の読み方
Target.Column = 5 And Target.Row = 8 は変化したときのセル位置が5列目で、かつ8行目のセル
なら Target.Offset(–4, –2).Select と
Call keisannを実行します
値の変化したセル位置が5列8行目セルならその行列位置から4行上で二個左の最初の入力位置のセル)を選択し
keisannを呼び出しています。
ー-----------------------------------
実際にセルを入力して動作を確認していただくと、コードの理解が深まると思います。
シートのセルの選択位置を変更したときの処理
Worksheet_SelectionChange()の機能
シートの特定セルをクリック選択したときセルに色を付けて視覚化する処理です
ー---------------------------------------
クリックしたセルの位置が(3列か5列)又は(4行目か8行目)なら、シートのセル範囲C4からE8までについた前回までに付けたバックカラーを無に(消す)セットしたうえで、そのセル範囲のクリックしたセルに新しい薄い黄色を付けます。
そして更に計算処理を実行します
If (Target.Column = 3 Or Target.Column = 5) And (Target.Row = 4 Or Target.Row = 8) Then
ActiveSheet.Range(“C4”, “E8”).Interior.ColorIndex = 0
Target.Interior.ColorIndex = 36
Call keisann
End If
End Sub
計算サブルーチン(数値の計算処理)
Sub keisann()の機能
電卓の数値入力セル値同士を演算子で計算します。
ー-------------------------------------
Application.EnableEvents = False
Select Case Range(“D4”)
Case “たす”, “+”
Range(“G4”) = Range(“C4”) + Range(“E4”)
Range(“G8”) = Range(“C8”) + Range(“E8”)
Call botanderu
Case “ひく”, “-”
Range(“G4”) = Range(“C4”) – Range(“E4”)
Range(“G8”) = Range(“C8”) – Range(“E8”)
Call botanderu
Case “わる”, “÷”
‘0で割り算するとエラーになるんで対処する
If Range(“C4”) <> 0 Then
Range(“G4”) = Range(“C4”) / Range(“E4”)
Call botanderu
Else
Range(“G4”) = “”
End If
‘—————————————————–
If Range(“C8”) <> 0Then
Range(“G8”) = Range(“C8”) / Range(“E8”)
Call botanderu
Else
Range(“G8”) = “”
EndIf
Case “かける”, “×”
Range(“G4”) = Range(“C4”) * Range(“E4”)
Range(“G8”) = Range(“C8”) * Range(“E8”)
Call botanderu
End Select
Application.EnableEvents = True
End Sub
Select Caseケース処理の読み方
Select Case と
End Select の間に書かれているコード文を場合分けして実行します
具体的には
Case “たす”, “+”
セルD4に書かれている値が「たす」か又は「+」だったときは3,4行目の処理を実行するということになります。
Range(“G4”) = Range(“C4”) + Range(“E4”)
Range(“G8”) = Range(“C8”) + Range(“E8”)
計算結果をシートのセルに書き出したあと、ボタンがにゅうっと出る動作をまとめたサブルーチンを呼び出しています。
Call botanderu
botanderuの処理が終わると一連のケース処理が終わって(該当するcase処理が実行された段階でEnd Selectになりケースを抜け以降のcaseは実行しないでkeisann()を抜けます)
「たす」か又は「+」ではなかったときは次のcaseに処理を移します。ここでは、4っつの場合分けをしていますが、上から順に処理を移しどのcaseにも当たらなかったときは何もしないで処理が終了します。
ボタンが上下からにゅうっと顔を出す動作
Sub botanderu()サブルーチンの処理
このサブルーチンがここで一番に表現したかった処理になります。
ー---------------------------------
Sub keisann()サブルーチンの中で電卓の演算子が何であるかによって場合分け処理されたあと下のサブルーチンSub botanderu()が呼び出しています。
Sub botanderu()
Dim i As Integer
Dim btntakasa As Integer
Dim topiti As Integer
‘ボタン2のトップ位置を指定
topiti = 133
btntakasa = 40
With Sheet1
‘ボタンの高さを指定
.CommandButton1.Height = btntakasa
.CommandButton2.Height = btntakasa
For i = 3 To btntakasa Step 3 ‘スピード倍速調整
‘上から下へにゅうっとでる
.CommandButton1.Height = i
‘下から上へにゅうっとでる
.CommandButton2.Top = topiti + btntakasa – i
.CommandButton2.Height = i
‘スピード調整
Application.Wait [Now()] + 1 / 86400000
DoEvents
Next i
End With
End Sub
For~Nextでボタンの高さを変化させる
基本動作:ボタンの高さを繰り返す回数に指定する
For i=3 To 40
繰り返しの中でボタンの高さ変化をさせる
CommandButton1.Height = i
視覚的に捉えるために待ち時間調整をかける
Application.Wait [Now()] + 1 / 86400000
Next
以上が下上へにゅうっとでるコマンドボタンでした。
ファイルをダウンロードして試してみて下さい。
エクセルファイルダウンロード
クリアボタンを配置してボタンに注意を向ける簡単な電卓のプログラムです。
下記からダウンロードして試して下さい。
コメント