VBA 文字列から「記号」など特定の文字種を判定する方法を検証

スポンサーリンク

前回「オプションボタン」でパスワードの設定に「記号」を使うかどうかを選択できるようにしました。指定どおりに動作させるには、生成したパスワード文字列内の「記号」を検索する必要があります。その方法と利用方法を勉強します。

くるみこ
くるみこ

「オプションボタン」で「記号」ありを指定した場合、PW文字列内の「記号」を見つけて含める必要があります。その見つけ方を勉強しましょう(^^)/

「記号」のある位置をどうやって特定するのかすごく気になります!

よろしくお願いしますm(__)m

【この記事でわかること
・文字列内に「記号」などの特定文字種を検索・判定する方法がわかります
・Like演算子を使う方法とInStr関数を使った方法の違いがわかります

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

くるみこ
くるみこ

前回記事は、オプションボタンの設置方法と使い方についての記事でした。よければ覗いてみてね(^^)/

スポンサーリンク

「記号」の存在を確認するには

今回やりたいことはパスワード文字列内の「記号」がある位置を確認することです

Like演算子で「記号」などの特定文字種を調べる

文字列の中から「記号」だけでなく特定文字種を調べる方法としてLike演算子を使ってみます。

Like 演算子とは

文字列の中に特定の文字列が含まれているかどうかを判定するときは、InStr関数を使うことが多いと思います。ただ、今回は「記号」を調べるのでこの方法以外で考えます。

Like 演算子は2つの文字列を比較するために使用するもので、文字列と文字列パターンを比較して、その結果をTrueまたはFalseで返してくれます。

Like 演算子は、InStr関数では判定できない「*」「?」などのワイルドカードを使用できたり、パターンに「文字リスト」「文字範囲」のような指定ができます。

Like 演算子の構文

result = string Like pattern

パーツ説明
result必須。戻り値
string必須。対象となる任意の文字列式
pattern必須。パターンマッチング規則に準拠する任意の文字列式

string が patternに一致する場合、result はTrue。一致しない場合、resultFalse になります。 string または pattern が Null の場合、result も Null になります。

「記号」を調べるには

「記号」のパターンというものが無いので、その他のパターンにマッチングしないものが「記号」に該当するとういうような考え方をしましょう。「文字リスト」や「文字範囲」を組み合わせて、文字列に一致しないものを探す方法を検討します。

・漢字[亜-熙] (Shift-JIS環境の場合)
・ひらがな[ぁ-ん]
・カタカナ[ァ-ヶ]
・アルファベット大文字[A-Z]小文字[a-z]
・数字[0-9]

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

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

Sub TestStr()
    MsgBox chkstr("くるみこ\Kurumico")
End Sub
Function chkstr(str As String) As Boolean
    Dim i As Long
    Dim a As String
    For i = 1 To Len(str)
        a = Mid(a, i, 1)
        If Not a Like "[亜-熙ぁ-んァ-ヶA-Za-z0-9]" Then
            chkstr = True
            Exit Function
        End If
    Next
End Function

・調べるコードを Function ステートメントでユーザー定義関数としています。
・TestStrからスタートして、chkStr関数に文字列 “くるみこ\Kurumico” を引数に渡しています。
・7行目、文字列の長さ(Len)分のループ開始
・8行目、一文字分を変数に代入
・9行目、Not Like演算子で文字が「文字範囲リスト」に該当していないものを探します。
「Not」を使わなければ、「該当するもの」ということになります。
・10行目、該当しない文字があった場合「True」を代入し、11行目で Function を抜けます。
・2行目の呼び出し元に戻り、結果(この場合)「True」を表示します。

文字列の「記号」位置を返すようにコードを変更

このコードを使う目的は、BASE64形式で変換したパスワード文字列の「記号」探しに使います。
・BASE64形式の文字列は、アルファベットの大文字と小文字(52文字)、数字(10文字)と「+」「/」の2つの記号とさらに規定の文字数に達しない場合につかう「=」が使用されています。
・これを踏まえてコードを書き換えます。

'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

・変更点は次の通りです。
・2行目、戻り値を「Long」に変更しています。(元はBoolean)
・8行目、「文字範囲リスト」をBASE64形式の文字列用に変更しています。(日本語は不要)
・この部分は次のようにも変更できます。
 If Not (a Like “[A-Za-z0-9]”) ThenIf a Like “[+/=]” Then
・「記号リスト」で直接探す場合は「Not」は不要です。
・9行目、「記号」があった位置を関数に代入しています。(Trueから変更)
Base64について解説している記事はこちらです↓

InStr 関数を使った方法

・BASE64形式の文字列で使う「記号」は、「+」「/」「=」だけです。
・これなら、InStr 関数でも対応できそうですのでコードを書いてみます。

Sub TestStr()
    MsgBox chkInStr("11111+111/11=")
End Sub
Function chkInStr(str As String) As String
    Dim a As String
    a = InStr(str, "+") & vbCrLf
    a = a & InStr(str, "/") & vbCrLf
    a = a & InStr(str, "=")
    chkInStr = a
End Function

・このコードの実行結果は、 となります。
InStr関数は、文字列の中から指定した文字列を検索して最初に見つかった位置を返す関数です。
「記号」の種類別に位置が特定できています
InStr関数では、見つからなかった場合は「0」を返します
・この特徴を利用すれば、こちらも使えそうですね!

・今回は「記号」の探し方がわかったので、ここで終了とします。

スポンサーリンク

まとめ(おわりに)

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

まとめと感想など

くるみこ
くるみこ

文字列から「記号」など特定の文字種を判定する方法について勉強しました。
Like演算子やInStr関数の使い方がわかりましたか(^^)

文字が特定できていれば、InStr関数も使えるということですね。Like演算子で「文字リスト」や「文字範囲」を使う方法がわかりました(^^♪

くるみこ
くるみこ

次回は「記号」を指定または指定しない処理を具体的に考えていきます!
もしかしたらまだ使っていないコントロールを使うかもしれません。楽しみにしていてね(^^)/

【今回わかったことは】
・文字列内に「記号」などの特定文字種を検索・判定する方法がわかりました
・Like演算子の使用方法とInStr関数を使う方法がわかりました

今後の記事について

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

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

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

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