Excel VBA業務効率化

あなたのExcel定型業務をVBAで効率化、省力化をお手伝いします。

詳細はこちら

エクセルVBA練習帳、超初心者向けコード解説、コマンドボタンが上下からにゅっと出て注意を向ける

エクセルVBA
この記事は約14分で読めます。

エクセルのコマンドボタンが上下からにゅっと顔をだすプログラム

エクセルのVBAを使ってコマンドボタンがにゅうっと表示されるプログラムです

ダウンロードファイルを開くとSheet1に簡単な電卓が表示されます

上段と下段にそれぞれ数値入力用セルを二つ用意しその間に演算子を入力するセルを準備しました。そしてその横に入力した数値をクリアするコマンドボタンを一つ配置しました。

上段と下段の演算子用のセルにはそれぞれ、その下に縦に配置した演算子の候補セルをダブルクリックすることで入れ替えできるようにしてあります。

このプログラムの目的はコマンドボタンに注意をうながすための表示をどう表現するか工夫したところです。数値入力セルをマウス選択したり、数値を入力するたびに、コマンドボタンがにゅうっと表示されるようにしてみました。
なぜ上下段に同じ電卓を用意?

上下段の電卓は同じように見えますが、それぞれセルの扱い方が違うのでその違いによってコードの書き方が変わることを表現しました。上段では単独のセルを使っていて下段では複数のセルを結合した状態を一つのセルに見せて作ってあります。

VBA超初心者向け解説のためプログラムでは一つの結果を表現するためのコードの書き方が複数あることを知っていただきたいと思い、このような書き方をしました。

ある程度VBAを知っている方には大変つまらない記事だと思います。

コード全文

 

プロシージャ解説

電卓プログラムの説明

数字を入力するセルに数値を入力して演算子を入れると計算結果を表示するだけの簡単な電卓です

下の段に縦に並んだ演算子のセルをダブルクリックすると電卓の演算子セルが入れ替えて計算します。

入力セルをマウスでクリックしたり計算が実行されると、クリアボタンが上下からにゅうっと顔をだす動作をします。(クリアボタンを注目させるため。この電卓プログラムで一番に表現したかった動作の一例です)

特に動作は難しいものではありません。この電卓は完ぺきではありません。プログラムでは以下のような処理が不十分です。

●計算用セルに文字列を入力した場合のエラー処理

●割り算したときにボタンがにゅうっと出る動作が二回実行される

●演算子を直接手入力で入れた場合、想定外の記号や文字列を使った時のエラー処理

 

上段のコマンドボタン1をクリックしたときの処理

Sub CommandButton1_Click()の機能

電卓の数値入力セル値とその数値の計算結果表示セル値をクリアする
ー--------------------------------

上段の緑色ボタンをクリックで、電卓の数字部分のセル値をクリアする

一行目の書き方と二行目の書き方に注目。

一行目はセルC4の値を直接的にクリアする命令文です

二行目はセルの表現にcells()を使って、4行目、5列のセル値に未定義値、長さ0の文字列を設定するという意味になります

3行目はさらにcells()の列位置を文字列で表しています。4行目、G列という意味です

このように一つの動作を表現する方法として様々な書き方があるということです。

Private Sub CommandButton1_Click()
‘上の段
 ActiveSheet.Range(“C4”).ClearContents
 ActiveSheet.Cells(4, 5) = “”
 ActiveSheet.Cells(4, “G”).ClearContents
 Range(“C4”).Select
End Sub

下段のコマンドボタン2をクリックしたときの処理

Sub CommandButton2_Click()の機能

電卓の数値入力セル値とその数値の計算結果表示セル値をクリアする
ー--------------------------------

上段の電卓では一つのセルをそのまま使用していますが

下段の電卓では複数のセルを結合して一つのセルとして扱っています

この場合は上段の電卓とは少し違ったセルの指定をしなければなりません。

一行目はRange()でセル範囲を表していますC8~C11の範囲の値をクリアするという意味です

二列目、三列目はRange()範囲のセル位置の指定をCells()を使っています。

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

演算子のセルをダブルクリックしたときの処理

機能

電卓の二つの数値セルを計算するとき、その演算子の種類を変化させる
ー--------------------------------

シートの4列目の14行~21行に設定している演算子の内のどれかをダブルクリックしたときそのセルの値を二つの電卓の演算子として採用する。(同時にそのせるのバックカラーを薄い黄色にセットする)

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
一番最後の行から3行上にある Cancel = True について
一般的にエクセルではシートの任意のセルをダブルクリックするとそのセル内にカーソル点滅して編集可能状態(CPUを占有)になり編集操作以外の他の操作ができなくなりますが Cancel = True
を指定することで、このカーソル点滅を解除します。(他の操作が可能になる)

シートの特定のセルの値が変化したときの処理の読み方

Sub Worksheet_Change()の機能

ワークシートのセルの値を変化させたとき、それがどのセルなのかを知る必要があります。

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

コード群の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までについた前回までに付けたバックカラーを無に(消す)セットしたうえで、そのセル範囲のクリックしたセルに新しい薄い黄色を付けます。

そして更に計算処理を実行します

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 
Application.EnableEvents = True についての説明
ー-------------------------------
5行目の Range(“G4”) = Range(“C4”) + Range(“E4”) のコードはセルRange(“C4”) の値と Range(“E4”)の値を計算してその結果をセルRange(“G4”)に表示させるコードです。
エクセルは、このコードを実行した瞬間にセルRange(“G4”)の値がチェンジしたことを感知して、即座にCPUの処理をSub Worksheet_SelectionChange(ByVal Target As Range)サブルーチンを呼び出してそこに書かれている処理を実行します。
通常そのサブルーチンに書かれている処理に矛盾が無ければ特に問題なく瞬時にそのルーチンを抜けだして元の処理に戻りますが、そこに何らかの計算結果に影響がある処理が書かれていると、思わぬ結果を実行してしまいます(又はエラーでストップすることもあります)
Application.EnableEvents False を指定することでエクセルはチェンジイベントを感知しなくなり、これを回避することができます。
Sub keisann()ではこの計算結果を表示するコードでチェンジイベントが発生しないように最初にApplication.EnableEvents = Falseを入れて
最後にApplication.EnableEvents = Trueで元に戻します(この文を忘れるとすべてのイベントが停止したままになるのでVBAが動作しなくなります
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 
の間に書かれているコード文を場合分けして実行します
具体的には

Select Case Range(“D4”)
  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

以上が下上へにゅうっとでるコマンドボタンでした。

ファイルをダウンロードして試してみて下さい。

エクセルファイルダウンロード

クリアボタンを配置してボタンに注意を向ける簡単な電卓のプログラムです。

下記からダウンロードして試して下さい。

コメント

タイトルとURLをコピーしました