ボタンの動作を切り替えて使う

中級VBA

はじめに

 1つのボタンで2つの動作を切り替えて使用したい場合は、フォームコントロールのコマンドボタンでは上手くいきません。
 そこでActiveXのコマンドボタンを利用する事で、ボタンの名称(キャプション名)を切替えながら2つのコマンドを交互に実行するプログラムを書いてみます。
 
 今回は以下のように 0 表示を非表示にしたり、再表示させるようなプログラムにしてみます。
 動作としては、セルの文字色を白にする事で見かけ上、空白にします。この方法ですと値はそのままですので数式マクロが関係していても問題ありませんし、印刷する場合などには便利です。

今回は上記のような状態でボタンを押すと下のような表示なるようにプログラムしてみます。0表示を消した後は、ボタンの表示が変化し、もう一度押すと前の状態に戻ります。

ActiveXのコマンドボタン

 フォームコントロールのコマンドボタンは、ボタンを配置して「マクロの登録」を行ってキャプション名を変更するだけの単純なものでしたが、プログラムでキャプション名を変更するような仕様には向いていません。
 コマンドボタンで多様な動作をさせたい時にはActiveXのコントロールを使う事になります。
 
 ActiveXのコントロールは色々な事ができる分、難しいと感じるかもしれませんが、今回のプログラムではキャプション名とコマンドを切り替えるだけなので、それほど複雑な事をするわけではありません。
 
 取りあえず以下の点を押さえておきましょう。
 ・ActiveXのコマンドボタンは、配置するシートモジュールにプロシージャを書く
 ・ActiveXのコマンドボタンのプロパティはプロパティウインドウで確認できる
 ・ActiveXのコマンドボタンは、デザインモードのオン・オフがある

コマンドボタンの設置

 ActiveXのボタンの設置は、「開発」タブ「挿入」からActiveXのコマンドボタンを選択してシート上にボタンを配置します。

 ボタンを右クリックして「プロパティ」を選択するとプロパティウインドウが開いて、コマンドボタンのプロパティを確認できます。プロパティウインドウ上で設定も可能です。

 今回は、Caption部分を変更してボタンの表示を変更します。”0を空白にする“と書き換えてください。

ボタンをクリックした時のイベント

ActiveXのコマンドボタンは、配置したシート上にオブジェクトとして存在します。VBEのプロジェクトウインドウからSheet1のシートモジュールをクリックして以下の様にCommandButton1のClickイベントを出します。

ここにプログラムを書くとコマンドボタンをクリックした際に実行されます。今回は以下のようなプログラムを書いてください。

Private Sub CommandButton1_Click()
    Dim rng As Range
    Dim cl As Object
    
    Set rng = Range("C3:E8")
    
    If Me.CommandButton1.Caption = "0を空白にする" Then
        For Each cl In rng
            If cl.Value = 0 Then
                cl.Font.ColorIndex = 2  '白
            End If
        Next cl
    
        Me.CommandButton1.Caption = "0を表示する"
        
    Else
        For Each cl In rng
            If cl.Value = 0 Then
                cl.Font.ColorIndex = xlAutomatic
            End If
        Next cl
        
        Me.CommandButton1.Caption = "0を空白にする"
    End If
    
End Sub

プログラム解説

 今回のプログラムは、0表示を消す部分の範囲を設定して、ボタンを押した時に値が0のセルの文字色を白にセットして見かけ上、表示を消しています。更にボタンの文字(キャプション)を変更する事で次の反対動作を準備します。ボタンの動作はキャプションで判断して非表示と表示を区別しています。

 最初に、Set rng = Range(“C3:E8”) として変更する範囲を指定しています。合計部分は0でも表示させたままにしたいので除外しています。

 次の、If Me.CommandButton1.Caption = “0を空白にする” Then でキャプション名から非表示にするかどうかを判断して処理を分岐します。

 For Each cl In rng は、rngの範囲から1つづつセルを取り出して cl に代入していきます。もし、値が0なら文字を白にし、続いて、セルの文字色を白にセットします。

 Else 部分では、先程とは逆の動作をさせています。

デザインモードを変更する

 ActiveXのコマンドボタンでは、デザインモードのオン・オフに注意する必要があります。デザインモードがオンの状態ですと編集状態なのでクリックしても動作はしません。

  上の状態がデザインモードオンの状態です。よく見るとメニューの表示が暗くなっており、ボタンのマウスポインターも十字があるのがわかります。下のデザインモード オフの状態と見比べてみましょう。

 ボタンを押しても動作しないと思ったら、デザインモードを確認するようにしましょう。

 デザインモードをオフにしてコマンドボタンを押せば、0表示が消えたり現れたりするのが確認できると思います。

まとめ

 今回はActiveXのコマンドボタンを使ってプログラムしてみました。フォームコントロールのボタンは手軽に使える便利さがありますが、ActiveXのコマンドボタンではプロパティイベントを操作する事ができるので複雑な動作が可能です。

 繰り返しになりますが、以下の点を押さえておくようにしましょう。
 ・ActiveXのコマンドボタンは、配置するシートモジュールにプロシージャを書く
 ・ActiveXのコマンドボタンのプロパティはプロパティウインドウで確認できる
 ・ActiveXのコマンドボタンは、デザインモードのオン・オフがある

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