オプションボタン 2つのグループ化の使い分け

vbaopbtnformGroupeyecatch

フォームコントロールのオプションボタンを利用するための2つのグループ化の方法です。
GroupBoxオブジェクトとGroupメソッドについて説明します。

こんにちは、じゅんぱ店長(@junpa33)です。

先回で、フォームコントロールのオプションボタンを設置することが出来るようになりました。

今回は、次の課題の

  • ボタンをいくつ作っても「1個だけ」しか選択できない問題
  • ボタンを削除する時、例えば30個作ったボタンを削除する方法問題

のような、基本設定的な問題の解決方法を説明します。

オプションボタンのシート設置記事編成

オプションボタンの用途の違う2つのグループ化

vbaopbtnform014

上の①や②の問題は、

イメージとしては、「括りを作ってまとめて処理しましょう!」的な解決法かな、と想像が付くでしょう。

よく利用するActiveXのオプションボタンであれば、「GroupName」プロパティで解決します。けれども、フォームコントロールにはグループネームプロパティはありません。

代わりにフォームコントロールで使えるのは、「GroupBoxオブジェクト」と「Groupメソッド」になります。

2つのグループ

GroupBoxオブジェクト」によるグループ化は、グループの中でオプションボタンを選択できるようにします。

Groupメソッド」によるグループ化は、グループ化したボタンを纏めて処理をするときに利用します。

GroupBoxオブジェクトでのグループ化

「GroupBox(グループボックス)」は、ActiveXの「Frame(フレーム)」と同様に、複数のコントロール (オプション ボタンやチェック ボックスなど) を 1 つにまとめることができます。

この「GroupBox(グループボックス)」を利用することで、

  • ボタンをいくつ作っても「1個だけ」しか選択できない問題

を解決することが出来ます。

シート上からの操作では、リボン「挿入」からツールボックスを表示して選択する「グループボックス」の設置という形になっています。

ただし、VBAでは、そこまで単純ではなく、設置の構文を知っておくことが必要です。

「GroupBox(グループボックス)」はオプションボタンと同列のオブジェクトになりますので、チェックボックスとは別物として「GroupBox(グループボックス)」を設置する必要があります。

VBA
Sub フォームCNTLオプションボタン5()
'グループボックスを設置
        With Range(Cells(1, 2), Cells(10, 2))
             Worksheets("Sheet2").GroupBoxes.Add(.Left, .Top, _
                        .Width, .Height).Select
             With Selection
                 .Characters.Text = "グループ名1"
                 .Name = "選択グループ名1"
             End With
        End With
End Sub

チェックボックスの設置と同様な構文でグループボックスを設置します。

場所は「Sheet2」のセルB1からB10の範囲に設置しています。

  • グループ名は「.Name = 選択グループ1
  • グループ表題は「.Characters.Text = グループ名1

グループ表題を「空白」にすると何も表示されなくなります。

グループを囲む外枠は、このVBAコードだけでは消去できません。(調べていませんが、恐らく消去できないでしょう)セルに罫線を引いて覆い隠すのが良いかもしれません。

グループ名は、グループ識別になりますので、後々のため省略しないようにしましょう。

設置後はグループ内だけでこのように ” 5個中の1個の選択 ” を行えるようになりました。

vbaopbtnform011

同様にほかの2つのグループボックスも設置します。

VBA
Sub フォームCNTLオプションボタン6()
'グループボックスを設置
        With Range(Cells(1, 4), Cells(10, 4))
             Worksheets("Sheet2").GroupBoxes.Add(.Left, .Top, _
                        .Width, .Height).Select
             With Selection
                 .Characters.Text = "グループ名2"
                 .Name = "選択グループ名2"
             End With
        End With
End Sub

Sub フォームCNTLオプションボタン7()
'グループボックスを設置
        With Range(Cells(1, 6), Cells(10, 6))
             Worksheets("Sheet2").GroupBoxes.Add(.Left, .Top, _
                        .Width, .Height).Select
             With Selection
                 .Characters.Text = "グループ名3"
                 .Name = "選択グループ名3"
             End With
        End With
End Sub
vbaopbtnform012

グループごとにボタンを選択できるようになりました。

Groupメソッドでのグループ化

Groupメソッドは、Shapesコレクションなどで使われます。指定したオブジェクトが一つのグループにまとめられます。

この「Group(グループメソッド)」を利用することで、

  • ボタンを削除する時、例えば30個作ったボタンを削除する方法問題

を解決することが出来ます。

シート上の操作では、「Ctrl」+左クリックでボタンを1つづつ選択 からの右クリックメニューの「グループ化」となります。

VBAコードで記述するについて、最初にグループのメンバーとなるオプションボタンそれぞれを1つづつ指定して行く必要があります。

1つづつ指定していくには、オプションボタンそれぞれに名前を付けていきます。

その上で、選択したボタンをグループ化することになります。

それぞれのオプションボタンに名前を付ける

「Sheet3」に見出し表示「ボタン1」(ボタン名botan1)から「ボタン15」(ボタン名botan15)までのオプションボタンを設置します。

VBA
Sub フォームCNTLオプションボタン8()
    Dim n, s, t As Long
'Sheet3のセルにオプションボタンを設置
        n = 1
        For s = 2 To 6 Step 2
            For t = 2 To 10 Step 2
                With Cells(t, s)
                    Worksheets("Sheet3").OptionButtons.Add(.Left, .Top, _
                                .Width, .Height).Select
                    With Selection
                        .Characters.Text = "ボタン" & n
                        .Name = "botan" & n
                    End With
                End With
                n = n + 1
            Next t
        Next s
End Sub
vbaopbtnform013

オプションボタン作成時に行うと便利なメソッドやプロパティについては、別記事にて説明をします。

特定のオプションボタンをグループ化する

次に、特定のオプションボタンをグループ化することになります。

どのような方法でオプションボタンを1つずつ追加選択していくかが問題。つまり、「Ctrl」ボタンを押しながら選択項目を追加していく選択と、同じ効果のあるVBAコード記述にしないといけません。

VBA
Sub フォームCNTLオプションボタン9()
    Dim n As Long
'グループにするボタンを選択します
    n = 1
        For Each ob In Worksheets("Sheet3").OptionButtons
            If ob.Characters.Text = "ボタン" & n Then
                ob.Select Replace:=False
            End If
            n = n + 1
            If n >= 6 Then Exit For
        Next ob
'        Selection.ShapeRange.Group.Name = "グループ名1"
        Selection.Group.Name = "グループ名1"
        Range("A1").Select
End Sub

それぞれのオプションボタンに「ボタン名」と「見出し」を付けていますが、以下のコードでは「見出し」を抽出要素として作成しています。

ボタンのみ見出し無しの場合も多くあるので、「ボタン名」を抽出要素にしておく方が良いかもしれません。

            If ob.Characters.Text = "ボタン" & n Then
                ob.Select Replace:=False
            End If

オプションボタンを1つづつ選択していくコードは以下のコードを使っています。

Shapeオブジェクト.Select.Replace:=(False または True)

Falseの場合はSelectによる選択範囲を広げます。

Trueの場合は選択範囲が移ります。

オプションボタンをすべて選択してから、以下のコードでグループ化を行います。

'        Selection.ShapeRange.Group.Name = "グループ名1"
        Selection.Group.Name = "グループ名1"
        Range("A1").Select
Selection.ShapeRange.Group

「ShapeRange」オブジェクトから「Group」メソッドを利用してグループ化します。

今回は名前を「グループ名1」としています。

また「ShapeRange」オブジェクトを利用しなくても同じ結果が得られます。

グループ化後は、フォーカスをセルA1にはずしておきます。

2つのグループ化のまとめ

vbaopbtnform015

オプションボタンを利用する場合は、グループ化が出来ないと利用価値が半減してしまいます。

この記事では、2種類のグループ化について説明しました。

どちらのグループ化も、オプションボタンを利用する上では非常に必要なことですので、是非覚えておきましょう。

次回は、

ボタンで選択した内容が値として何も反映されていません。」問題について説明したいと思います。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min