Excel VBA UserForm オプションボタンの利用方法

UserForm を使ったパスワード生成ツールの作成をとおして勉強を継続しています。今回は、コントロールのうち「オプションボタン」の使い方について勉強します。

くるみこ
くるみこ

スピンボタンの次は「オプションボタン」の使用方法について勉強しましょう。どのように活用できるのかを勉強していきます(^^)/

「オプションボタン」はどういうものなのか、しっかり勉強します。
よろしくお願いしますm(__)m

【この記事でわかること
・UserFormに設置した「オプションボタン」の利用方法がわかります
オプションボタンの設定をセルに保存する方法がわかります

前回記事のおさらいは、下のカードをクリックすれば開きます(^^ゞ

くるみこ
くるみこ

前回記事は、ユーザーフォームに設置したスピンボタンの利用方法についての記事でした。よければ覗いてみてね(^^)/

UserFormにオプションボタンを設置します

オプションボタンとは

オプションボタンはフォーム上に2つ以上設置して使います。複数設置したオプションボタンの中から1つだけを選択するために使用するコントロールです。

オプションボタンの特徴は、一つのボタンを操作すると他のオプションボタンの Value プロパティが変わることにあります。複数設置したオプションボタンのうち Value プロパティに True を設定できるのは1つだけです。True となったオプションボタン以外のオプションボタンは全て自動的に False となります。(Value プロパティに「NULL」を設定することは可能です)

フレームでオプションボタンをグループ化

オプションボタンは「フレーム」を使ってグループ分けすることが多いです。

フォームでグループ化】
・フォームに直接配置した場合、フォーム全体でグループ化されています。
GroupNameプロパティを使用すれば複数のグループ分けが可能です。

フレームでグループ化】
・「フレーム」内に配置した場合は、そのフレーム内でグループ化されます。
「フレーム」を使用すれば複数のグループ分けが可能です
・「フレーム」を使えばGroupNameプロパティ無しでグループ化できます。

オプションボタンの利用方法を検討します

・前回と同じように「PW生成ツール」のどこで利用するかを検討します。
・まずは「パスワード管理」について過去記事を参照して検討ました。

文字列の右側(後ろ)から選択する必要があったのは、パスワードに「記号」の使用が必須という場合があるときに指定できるようにしていたからです
・この部分を「オプションボタン」を使って選択できるようにしてみましょう。

「設定値」保存シートも変更しました

・E~G列を追加しています。
・E列見出しは、Leftの「L」で左側テキストボックス「SelStart」値を保存します。
・F列見出しは、Rightの「R」で右側テキストボックス「SelLength」値を保存します。
・G列見出しは、symbolの「S」でTrueな「オプションボタン」の「Caption」を保存します。

オプションボタンを設置してみます

・「フレーム」を設置してその中に「オプションボタン」を3つ設置しました。

・オプションボタンのオブジェクト名を「OptB1」Captionを「任意」に変更しました。
・他の二つもオブジェクト名「OptB2」は「指定」に「OptB3」は「禁止」変更しました。
・フレームのCaptionは「記号」に変更しています。

・ついでに、スピンボタン左側にテキストボックスを一つ追加しています。二つのテキストボックスで文字列選択位置を左側「SelStart」と右側「SelLength」で表示するようにするためです。

オプションボタンに関連するコード

UserFormを開く際に初期値設定

・「UserForm_Initialize」イベントにオプションボタンの初期値を設定するコードを入れました。

'最初(表示前)に実行される
Private Sub UserForm_Initialize()
    'TextBoxをイニシャライズするプロシージャを呼び出す
    Call TextBox_Initialize
    'ComboBoxをイニシャライズするプロシージャを呼び出す
    Call ComboBox_Initialize
    'ComboBoxのItemをセットするプロシージャを呼び出す
    Call cbmBox_ItemSet
    OptB1.Value = True  '初期値は「任意」を選択
    TxtBox0.Value = 0   'SelStartの初期値
    TxtBox1.Value = 44  'SelLengthの初期値
End Sub

・9行目、オプションボタンの一つだけに「True」を設定しています
     これで他の二つのオプションボタンは「False」になります
・10行目「TxtBox0」はスピンボタン横左側のテキストボックスに初期値「0」を代入
・11行目「TxtBox1」はスピンボタン横右側のテキストボックスに初期値「44」を代入

コマンドボタン「登録」のコード変更

・ワークシート「設定値」のセルにUserFormで設定した「値」を書き込むコードを変更しました。

'重複をチェックして設定値をワークシートに書き込む
Private Sub cmdSave_Click()
    Dim eRow As Long    '最終行
    Dim i As Long       'ループカウンター用
    Dim rng1 As Range, rng2 As Range 'セル範囲
    Dim strSet As String    'Key文字列(A+B+C+D+E+F+G)
    Dim strName As String   '名称文字列(B列)
    Dim OptName As String   '記号オプション設定
    Dim re As Long
    Call cmdPW_Click    'PW生成する
    With Worksheets("設定値")
        eRow = .Cells(Rows.Count, 2).End(xlUp).Row + 1
        strName = Cmb1.Text & Cmb2.Text
        If strName = "" Then MsgBox "「名称」がありません!": Exit Sub
        Select Case True
            Case OptB1.Value: OptName = OptB1.Caption '任意
            Case OptB2.Value: OptName = OptB2.Caption '指定
            Case OptB3.Value: OptName = OptB3.Caption '禁止
        End Select
        strSet = Cmb1.Text & Cmb2.Text & Cmb3.Text & Cmb4.Text & _
                            TxtBox0.Value & TxtBox1.Value & OptName
        If strSet = "" Then MsgBox "「Key」がありません!": Exit Sub
        Set rng1 = Range(.Cells(2, 5), .Cells(eRow, 5))
        '同じItemが存在するかチェックする
        For i = 1 To rng1.Count
            If rng1(i).Value = strSet Then
                MsgBox "重複データのため登録しませんでした!"
                Exit Sub
            End If
        Next
        'Keyに重複が無かった場合、分類+名称で再チェック
        Set rng1 = Range(.Cells(2, 1), .Cells(eRow, 1))
        Set rng2 = Range(.Cells(2, 2), .Cells(eRow, 2))
        '同じ名称が存在するかチェックする
        For i = 1 To rng1.Count
            If rng1(i).Value & rng2(i).Value = strName Then
                re = MsgBox("同じ名称があります!書き換えますか?", _
                                        vbYesNo + vbExclamation)
                If re = vbYes Then
                    'データを上書きさせるため
                    eRow = i + 1 'eRowにセルの行番号を代入
                Else: Exit Sub
                End If
            End If
        Next
        '指定セルにデータを書き込む(追加は最下部)
        .Cells(eRow, 1).Value = Cmb1.Text
        .Cells(eRow, 2).Value = Cmb2.Text
        .Cells(eRow, 3).Value = Cmb3.Text
        .Cells(eRow, 4).Value = Cmb4.Text
        .Cells(eRow, 5).Value = TxtBox0.Value
        .Cells(eRow, 6).Value = TxtBox1.Value
        .Cells(eRow, 7).Value = OptName
        .Cells(eRow, 8).Value = strSet
    End With
End Sub

・8行目、「Dim OptName As String」で記号オプション設定用の変数を宣言しています。
・15~19行目、Select Caseで「True」なオプションボタンを探し「Caption」を変数に代入
・20行目で、strSet に「TxtBox0」「TxtBox1」「OptName」を連結した文字列を代入
・47行目以降で各設定値をセルに書き込んでいます。

コンボボックス「名称」のChangeイベントのコード変更

'テキスト部の文字列を重複せずにItemに登録
Private Sub Cmb2_Change()
    Dim i As Long       'ループカウンター用
    Dim flg As Boolean  '重複チェック用フラグ
    Dim strSet As String
    Dim eRow As Long
    Dim rng As Range
    strSet = Cmb2.Text
    If strSet = "" Then Exit Sub
    With Worksheets("設定値")
        eRow = .Cells(Rows.Count, 2).End(xlUp).Row
        Set rng = Range(Cells(1, 2), .Cells(eRow, 2)) '2列目
        '同じItemが存在するかチェックする
        For i = 2 To rng.Count
            If rng(i).Value = strSet Then
                flg = True  '存在時はflgをTrueに
                Exit For    'ループを抜ける
            End If
        Next
        If i > rng.Count Then Exit Sub
        'flgがTrueの場合はセットする
        If flg = True Then
            Cmb1.Text = .Cells(i, 1).Value
            Cmb3.Text = .Cells(i, 3).Value
            Cmb4.Text = .Cells(i, 4).Value
            If .Cells(i, 5).Value <> "" Then _
                TxtBox0.Value = .Cells(i, 5).Value
            If .Cells(i, 6).Value <> "" Then
                TxtBox1.Value = .Cells(i, 6).Value
                SpinB1.Value = TxtBox1.Value
            End If
            Select Case .Cells(i, 7).Value
                Case OptB1.Caption: OptB1.Value = True '任意
                Case OptB2.Caption: OptB2.Value = True '指定
                Case OptB3.Caption: OptB3.Value = True '禁止
            End Select
        End If
    End With
    Call cmdPW_Click
    Call SpinB1_Change
End Sub

・26~31行目、TxtBox0とTxtBox1の「値」をセルに保存された「値」から代入しています。
       エラーを回避するためセルが「空欄」の場合は代入しないようにしています。
・32~36行目、Select Case でセルの「値」と同じ「Caption」の Value を「True」にしています。

オプションボタン選択時のイベントのコード

・オプションを変えるためにはオプションボタンをクリックします。
・そのときに発生するイベントに記入したコードです。

Private Sub OptB1_Click()
    txtPW.SetFocus   'フォーカスを戻す
End Sub
Private Sub OptB2_Click()
    txtPW.SetFocus   'フォーカスを戻す
End Sub
Private Sub OptB3_Click()
    txtPW.SetFocus   'フォーカスを戻す
End Sub

「txtPW.SetFocus」だけです。
これを書いておかないと、「txtPW」で選択している文字列からフォーカスがオプションボタンに移ってしまうため。再び「txtPW」にフォーカスを戻しています
・これでうまくいきました\(^o^)/

・今回はここで終了とします。

スポンサーリンク

まとめ(おわりに)

・いかがでしたでしょうか?
・今回も、記事内で使用したコードのサンプルファイルを登録していますのでご利用ください。
今までの記事のサンプルも登録していますのでよろしければお使いください(^^)

まとめと感想など

くるみこ
くるみこ

「オプションボタン」の設置方法と「オプションボタン」利用してオプションを設定する方法を勉強しました。これでパスワード管理の記号指定をするための準備ができました(^^)

「オプションボタン」の使い方はわかりました。でも、パスワードに記号を含めるかどうかを指定できるようになったけど、記号を設定する部分はどうするんですか?

くるみこ
くるみこ

そうです! 次回はその「記号」を指定または指定しない処理の部分について勉強しましょう! まだ使っていないコントロールを使うかもしれませんが、どうなるのか楽しみにしていてね(^^♪

【今回わかったことは】
・フレームを利用した「オプションボタン」の設置方法がわかりました
・「オプションボタン」利用方法がわかりました

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にもご期待ください(^^)/

記事のサンプルファイルをダウンロードできます

今回の記事のサンプルをダウンロードできるようにしています
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください