VBA UserFormチェックボックス設置と文字列操作の最適化

前回、文字列内の「記号」を検索・判定できるようになったので、今回は判定結果を使ったPW文字列設定の最適化を図っていきます。文字列の範囲設定に「チェックボックス」を使って動作を切り替える方法もいっしょに勉強していきます。

くるみこ
くるみこ

今回は「チェックボックス」を設置して利用する方法を勉強します。「オプションボタン」の設定によるPW文字列選択動作の設定についてもあわせて勉強していきましょう(^^)/

「記号」のある位置を特定できるようになったので、それを使うやり方を勉強するんですね!よろしくお願いしますm(__)m

【この記事でわかること
・「チェックボックス」の設置とその利用方法がわかります
・オプション設定に従った文字列の操作と選択位置の調整方法がわかります

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

くるみこ
くるみこ

前回記事では、文字列内の「記号」など特定文字種を検索・判定する方法についての記事でした。この記事と関連しているので是非覗いてみてね(^^)/

「チェックボックス」の設置・活用方法

・「チェックボックス」の設置から利用方法までの基本を勉強しましょう。

「チェックボックス」を設置します

・「チェックボックス」を設置するためにレイアウトの調整を行いました。
・ついでにPW文字列の選択文字数がわかりにくかったので、テキストボックスを1つ追加しました。

「チェックボックス」と「テキストボックス」を追加
前回「オプションボタン」を設置した際の画像

設置方法は、ツールボックスから「チェックボックス」をクリックして、配置したい箇所でドラッグすると任意の大きさで配置できます。ただし、チェック部分のサイズは固定で変更できません
・今回は、狭い場所に設置したので「キャプション」は消しています。
・代わりに、見出しは「ラベル」を配置して「スライド」と表記させました。
・コントロール名は「CheckBox1」を「ChkB1」に変更しました。

・追加したテキストボックスは「文字数」を表示するために使用します。

「チェックボックス」とは

前回の「オプションボタン」は複数設置してその中の一つだけ「True」にする方法で動作方法を決めるためのコントロールでした。「チェックボックス」は単独で設定の有効・無効を切り替えるためのコントロールです。「チェックボックス」を複数設置して利用すれば、複雑なオプション設定も可能となります。

チェックボックスの状態を取得する

・CheckBoxの基本的な利用方法は、チェックボックスの状態を取得または設定して利用します。
CheckBoxの状態とは、基本的にはValueプロパティの状態を指します
・ValueプロパティがTrueの場合は「〇〇」する、Falseの場合「〇〇しないで△△」するなど・・・

設定値・戻り値
設定値・戻り値ChechBoxの状態
Trueチェックマークがついている状態
Falseチェックマークがついていない状態

文字列選択動作をチェックボックスで変更する

・PW文字列選択位置の動きを「チェックボックス」で「スライド」させるかどうか変更します。
スライド」とは、文字列選択数は変えずに位置を左右に移動させる設定方法です。

チェックボックスで選択位置を「スライド」に変更する

・「スピンボタン」のクリックイベントの動作を切り替える設定です。

'文字列終了位置変更および位置スライド用
Private Sub SpinB1_Change()
    Dim s As Long
    Dim d As Long
    d = Val(TxtBox1.Value) - Val(TxtBox0.Value) + 1 '選択文字数
    TxtBox2.Value = d
    If ChkBox1.Value = True Then 'Trueの場合「スライド」する設定
        If SpinB1.Value < d Then
            TxtBox1.Value = d
            SpinB1.Value = d
        Else: TxtBox1.Value = SpinB1.Value
        End If
        TxtBox0.Value = Val(TxtBox1.Value) - d + 1
    Else    'Falseの場合、範囲を増減する設定
        If SpinB1.Value < Val(TxtBox0.Value) Then
            TxtBox1.Value = SpinB1.Value
            '選択範囲が入れ替わってしまう場合
            If SpinB1.Value = 0 Then
                TxtBox0.Value = 0
            Else: TxtBox0.Value = 1
            End If
        Else
            '「0」から再び増加する場合
            If Val(TxtBox0.Value) = 0 Then
                TxtBox0.Value = SpinB1.Value
            End If
            TxtBox1.Value = SpinB1.Value
        End If
        d = Val(TxtBox1.Value) - Val(TxtBox0.Value) + 1
        If SpinB1.Value = 0 Then
            TxtBox2.Value = 0
        Else
            TxtBox2.Value = d
        End If
    End If
    If Val(TxtBox0.Value) < 0 Then TxtBox0.Value = 0
    If Val(TxtBox1.Value) < 0 Then TxtBox1.Value = 0
    With txtPW
        .SetFocus   'フォーカスを受ける
        If Val(TxtBox0.Value) = 0 Then
            .SelStart = Val(TxtBox0.Value)
        Else: .SelStart = Val(TxtBox0.Value) - 1
        End If
        .SelLength = Val(TxtBox1.Value) - .SelStart
        'ここから記号チェック
        If OptB2.Value = True Then
                '範囲内に「記号」がある場合は何もしない
                s = chkType(txtPW.Value) '「記号」チェック関数へ
                If s >= Val(TxtBox0.Value) And _
                    s <= Val(TxtBox1.Value) Then
                    Exit Sub
                Else
                    MsgBox "選択範囲に「記号」が存在しなくなります!" _
                        & vbCrLf & "設定を変更してください!", _
                        vbOKOnly + vbCritical
                End If
        End If
    End With
End Sub

・7~13行目、チェックボックスが True の場合選択範囲を「スライドさせる処理です。
・スピンボタンの動作に応じて、選択文字数を変更せずに位置を移動させる設定です。
・14~35行目は、チェックボックスが False の場合選択範囲を増減させる処理です。
・ともに、限界まで進んだ場合の処理を考慮したコード設定にしています。
・36,37行目は、選択範囲の値がマイナスになる場合「0」に設定するためのコードです。
・46行目からはオプションボタンで「記号」指定の場合の処理です。
・48行目で、記号の位置を返す「記号」チェック用ユーザー定義関数にPW文字列を渡しています
・53行目は、選択範囲に「記号」を含まなくなった場合、設定変更を促すメッセージを表示するようにしています。

'BASE64形式文字列内の記号がある位置を返す関数
Function chkType(str As String) As Long
    Dim i As Long
    Dim a As String
    For i = 1 To Len(str)
        a = Mid(str, i, 1)
        'BASE64形式の文字列はアルファベットと数字以外
        If Not (a Like "[A-Za-z0-9]") Then
            chkType = i
            Exit Function
        End If
    Next
End Function

・動作状況のGIF画像がこちらです。
これら以外を、「記号」など(特殊文字や環境依存文字なども含む)とすることができると思います。
特定の一文字ならば[*一文字*]のようにワイルドカードで指定できますが、それは出来ないので次のサンプルコードのように1文字づつ調べていく必要があります。

保存PW設定から分類を選択できるように調整

・前回までは「名称」選択コンボボックスで、選択された「名称」の重複だけをチェックしていました。その結果、最初の設定が自動的に選択されることになっていました。
・「名称」が重複していたら「分類」を選択できるようにコードを調整しました。

該当文字種を調べるサンプルコード

'テキスト部の文字列を重複せずにItemに登録
Private Sub Cmb2_Change()
    Dim i As Long       'ループカウンター用
    Dim c As Long       'HIT列保存用
    Dim flg As Long     '重複チェック用フラグ
    Dim strSet As String, strC() As String
    Dim eRow As Long
    Dim rng1 As Range, rng2 As Range
    strSet = Cmb2.Text
    If strSet = "" Then Exit Sub
    With Worksheets("設定値")
        eRow = .Cells(Rows.Count, 2).End(xlUp).Row
        Set rng1 = Range(Cells(1, 1), .Cells(eRow, 1)) '1列目
        Set rng2 = Range(Cells(1, 2), .Cells(eRow, 2)) '2列目
        '同じItemが存在するかチェックする
        For i = 2 To rng2.Count
            If rng2(i).Value = strSet Then
                flg = flg + 1
                ReDim Preserve strC(flg) As String
                strC(flg) = rng1(i).Value & "/" & i
            End If
        Next
        '「名称」が重複している場合「分類」を選択させる
        Dim re As Long
        If flg > 1 Then
            For i = 1 To flg
                strSet = Left(strC(i), InStr(strC(i), "/") - 1)
                re = MsgBox("複数の分類が設定されています!" & vbCrLf _
                    & "対象の分類を選択してください!" & vbCrLf & vbCrLf _
                    & "分類は【" & strSet & "】" & "でよろしいすか?", _
                    vbExclamation + vbYesNo, "分類選択")
                If re = vbYes Then Exit For
            Next
            If re = vbNo Then Exit Sub
            flg = i
        End If
        c = Mid(strC(flg), InStr(strC(flg), "/") + 1, Len(strC(flg)))
        Cmb1.Text = .Cells(c, 1).Value
        Cmb3.Text = .Cells(c, 3).Value
        Cmb4.Text = .Cells(c, 4).Value
        If .Cells(c, 5).Value <> "" Then _
            TxtBox0.Value = .Cells(c, 5).Value
        If .Cells(c, 6).Value <> "" Then
            TxtBox1.Value = .Cells(c, 6).Value
        End If
        TxtBox2.Value = Val(TxtBox1.Value) - Val(TxtBox0.Value) + 1
        'PW文字列設定へ
        Call cmdPW_Click
        'Option設定を反映させる
        Select Case .Cells(c, 7).Value
            Case OptB1.Caption: OptB1.Value = True '任意
            Case OptB2.Caption: OptB2.Value = True '指定
            Case OptB3.Caption: OptB3.Value = True '禁止
        End Select
    End With
    SpinB1.Value = TxtBox1.Value 'スピンボタンの値を初期化
End Sub

【変更点】
・13,14行目、保存シートの「分類」と「名称」列のセル範囲をRangeオブジェクトにしています。
・17~21行目は、「名称」を重複チェックして重複があった場合、「分類」とセルの行数を配列に代入していきます。
・23~36行目が、「名称」が重複している場合「分類」を選択させる処理です。
・28行目で、配列から「分類」を選択するかメッセージを順番に表示させています。
・32行目で、「はい」で「分類」が選択された場合ループを抜けます。
・35行目は、選択された「分類」の配列番号を変数「flg」に代入しています。
・37行目で、配列データから、選択設定が保存された行番号を取り出して変数に代入しています。

・動作GIF画像がこちらです。

「記号」禁止オプションの動作設定

・オプションボタンで「記号禁止」が選択された場合のコード設定

'禁止チェック
Private Sub OptB3_Click()
    Dim s As String
    With txtPW
        'txtPWの「記号」を削除して表示する
        s = Replace(.Text, "+", "")
        s = Replace(s, "/", "")
        s = Replace(s, "=", "")
        .Text = s
        'txtPWの選択表示を再設定
        .SetFocus   '再度フォーカスをあてる
        .SelStart = TxtBox0.Value - 1
        .SelLength = .SelStart + Val(TxtBox2.Value)
        'スピンボタンの最大値を修正
        SpinB1.Value = TxtBox1.Value
        SpinB1.Max = Len(s)
    End With
End Sub

・難しく考えずに、PW文字列から「記号」を削除してしまうだけの設定です。
Replace 関数で「+」「/」「=」の3種類を「””」に置き換えてしまいます
・15行目で、字数が減った分「スピンボタン」の最大値を変更しています。
テキストボックスの文字列は、分割して選択できないのでこの方法しか思いつきませんでした
・これを設定したので、再び他のオプションが選択された時には「記号」を再表示するように要所変更を加えています

・今回は「チェックボックス」設定と選択文字列の調整ができたので、ここで終了とします。

スポンサーリンク

まとめ(おわりに)

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

まとめと感想など

くるみこ
くるみこ

「チェックボックス」の基本的な使い方と選択文字列の色々な調整方法を勉強しました。「チェックボックス」は難しくありませんでしたが、文字列操作は何度も動作テストしながら設定変更したので疲れましたね(^^)

選択位置が限界点になった時の動作なんかもすごく難しかったです。実際に動作させながら調整していく方法もすごく勉強になりました(^^♪

くるみこ
くるみこ

今回で大体「パスワード生成ツール」の動作は出来上がってきましたがもう少しです。次回は「リストボックス」コントロールについて勉強しましょう!
次回も楽しみにしていてね(^^)/

【今回わかったことは】
・「チェックボックス」の基本的な利用方法がわかりました
・オプション設定に従った文字列の操作と選択位置の調整方法がわかりました

今後の記事について

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

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

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

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