UserForm を使ったパスワード生成ツールの作成をとおして勉強を継続しています。今回は、コントロールのうち「オプションボタン」の使い方について勉強します。
スピンボタンの次は「オプションボタン」の使用方法について勉強しましょう。どのように活用できるのかを勉強していきます(^^)/
「オプションボタン」はどういうものなのか、しっかり勉強します。
よろしくお願いしますm(__)m
【この記事でわかることは】
・UserFormに設置した「オプションボタン」の利用方法がわかります
・オプションボタンの設定をセルに保存する方法がわかります
前回記事のおさらいは、下のカードをクリックすれば開きます(^^ゞ
前回記事は、ユーザーフォームに設置したスピンボタンの利用方法についての記事でした。よければ覗いてみてね(^^)/
UserFormにオプションボタンを設置します
オプションボタンとは
オプションボタンはフォーム上に2つ以上設置して使います。複数設置したオプションボタンの中から1つだけを選択するために使用するコントロールです。
オプションボタンの特徴は、一つのボタンを操作すると他のオプションボタンの Value プロパティが変わることにあります。複数設置したオプションボタンのうち Value プロパティに True を設定できるのは1つだけです。True となったオプションボタン以外のオプションボタンは全て自動的に False となります。(Value プロパティに「NULL」を設定することは可能です)
フレームでオプションボタンをグループ化
オプションボタンは「フレーム」を使ってグループ分けすることが多いです。
オプションボタンの利用方法を検討します
・前回と同じように「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
【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にもご期待ください(^^)/
記事のサンプルファイルをダウンロードできます
今回の記事のサンプルをダウンロードできるようリンク先に登録しています!
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください
【今回わかったことは】
・フレームを利用した「オプションボタン」の設置方法がわかりました
・「オプションボタン」利用方法がわかりました