パスワードの自動生成

英数字のランダムな組み合わせでの「パスワード」を自動生成します。
このページのサンプルは古くなりました。   Windowsのログインパスワードであれば、意味の無い乱数から生成し、それもキーボードの中央寄りの配置内で生成できるので良いのですが、実はこのページのサンプルは考え方が古く、桁数も少ないし、記号は取り入れていません。



近年では「英数+記号混在」でのパスワードを要求されるサイトも多い上、Windowsログイン後にブラウザ等でパスワードを入力するのに、キーボードで手入力するなどはあまりないと思います。 「同じパスワードの使い回しは危険」と叫ばれているわけですから、頭で考えないパスワードを生成させる仕組みの利用は当然なのですが、このページのサンプルではなく下記をご案内します。



個人で利用するアカウントの管理であれば「シンプルなパスワード管理ツール」を作成しましたのでご利用下さい。
あちこちに作成しているアカウントを登録して、それぞれに対して新しいパスワードをランダムに生成するのはもちろんのこと、 登録されたユーザーIDやパスワードはログインページの各項目にコピー、貼り付けをツータッチで運用できるようになっています。



社員リストから各社員が利用するサイトのパスワードを一括生成するようなことは、クラウドサービスを新規に運用開始するような場合にあり得ます。 このような場合は「パスワード生成クラス」を用意しているのでご利用下さい。
私の経験から作ったもので、その場は「スポット作業」ですが汎用的に利用できるようにクラス化させているものです。



このページはコードサンプルとして残しておきます。



まずは、サンプルを見てみましょう。
生成する「パスワード」の桁数などを設定しておいて「生成」ボタンをクリックすると、5個の「パスワード」を連続して生成するというサンプルです。 元々、自分で使おうと思って作ったものですが、単に1件を生成するよりも数件生成した中からキー入力しやすい(キーボード上で近い位置の文字が連続しているなど)ものを選べる方が良いと思って、5個連続生成することにしました。「5個」という件数には特に意味はありません。
「パスワードの自動生成」のサンプルです。(この画像からもダウンロードできます)
(この画像をクリックすると、ダウンロードができます。)
このサンプルでの初期値の設定は、パスワードの桁数が「9」桁、パスワードの内の数字を使う桁数が「3」から「4」桁としています。

これで「生成」をクリックすれば、5件の「パスワード」が即座に生成されます。このサンプルでは特に画面描画のコントロールはしていませんが、近年のパソコンならほとんど瞬時に表示されると思います。
「パスワードの自動生成」のサンプルです。
このように、英数混在の「パスワード」が自動生成されます。
一旦、表示された状態から、再度「生成」をクリックすると再生成を行ないますから、気に入った「パスワード」がないなどでは繰り返すことができます。

より強固な「パスワード」を求める場合は、英字を大文字/小文字混在とし、桁数を増やすと良いでしょう。
「パスワードの自動生成」のサンプルです。
プログラムに埋め込むデータベース接続の「パスワード」等であればこのくらいの「目視で暗記されにくい」強固なものにすべきでしょう。

手で入力する「パスワード」は上記のようなものでは無理があります。
そこで実用的な方法として、キーボードの利用範囲を制限して「パスワード」を生成できるようにしました。
「パスワードの自動生成」のサンプルです。
このように設定して生成する「パスワード」はキーボード上で、
「パスワードの自動生成」のサンプルです。
このキー範囲で入力できるものです。キーボード入力が苦手な人でも見渡す範囲が限られるので「パスワード」の入力が円滑にできると思います。 一般にはキー範囲を制限しているか、どの範囲かは判らないので、どちらかと言うとゆっくり入力している方が「盗み見られる」ことが発生しやすいと言えますから、その策としては有効ではないでしょうか。 特に年配の上層部の方には有効な配慮だと思います。

この機能は、他の仕組みにも組み込み可能です。
このサンプルのように設定パラメータが見えたままでは都合が悪いとか、設定パラメータの一部も動的に変更したいなどの要望がある場合は、 「パスワード生成」の部分は別モジュール化しているので、呼び出し側プロシージャを改変させて運用することも可能です。
また、新規システムの立ち上げ等で「デフォルトのパスワード」を多数生成するなどでも「パスワード生成」のモジュールは利用できると思います。

まずは、サンプルの「パスワード生成」の呼び出しモジュールです。
これは、「生成」と「クリア」のボタンから直接呼び出されるモジュール(対応する2つのプロシ-ジャ)です。

'***************************************************************************************************
'   パスワード生成(英字文字列,数字文字列より指定桁数のパスワードを生成) Module1(Module)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'07/04/19(1.00)新規作成
'19/12/29(1.10)記述標準化対応
'***************************************************************************************************
Option Explicit
Option Private Module
'===================================================================================================
Private Const g_cnsTitle As String = "パスワード生成処理"
' 生成処理の行範囲
Private Const g_cnsRowF As Integer = 13                         ' 生成行(From)
Private Const g_cnsRowT As Integer = 17                         '  〃 (To)
Private Const g_cnsClearRange As String = "$B$" & g_cnsRowF & ":$C$" & g_cnsRowT

'***************************************************************************************************
'   ■■■ シート側からの呼び出し処理 ■■■
'***************************************************************************************************
'* 処理名 :パスワード生成
'* 機能  :パスワード生成(メイン)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2007年04月19日
'* 作成者 :井上 治
'* 更新日 :2019年12月29日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Public Sub パスワード生成()
    '-----------------------------------------------------------------------------------------------
    Dim xlApp As Application                                        ' Excel.Application
    Dim objSh As Worksheet                                          ' Worksheet
    Dim lngRow As Long                                              ' 行INDEX
    Dim strPassword As String                                       ' パスワード
    Set xlApp = Application
    Set objSh = ThisWorkbook.Worksheets(1)
    objSh.Range(g_cnsClearRange).ClearContents
    ' 5回連続でパスワードの生成を行なう
    For lngRow = g_cnsRowF To g_cnsRowT
        '-------------------------------------------------------------------------------------------
        ' ■パスワードを取得(FP_MAKE_PASSWORDを呼び出す)
        '  ※引数は以下の順にセットします。
        '    ①パスワードの総桁数(Integer)
        '    ②混在する数字の最小桁数(Integer)
        '    ③混在する数字の最大桁数(Integer)
        '    ④数字の連続を許可する最大桁数(Integer)
        '    ⑤英大文字使用スイッチ(Integer) ※0=使用しない, 1=使用する
        '    ⑥キーボード上の最小行(Integer) ※1~3
        '    ⑦キーボード上の最大行(Integer) ※2~4
        '    ⑧キーボード上の最小列(Integer) ※1~7
        '    ⑨キーボード上の最大列(Integer) ※3~10
        strPassword = FP_MAKE_PASSWORD2(Val(objSh.Cells(3, 2).Value), _
                                        Val(objSh.Cells(4, 2).Value), _
                                        Val(objSh.Cells(5, 2).Value), _
                                        Val(objSh.Cells(6, 2).Value), _
                                        Val(objSh.Cells(7, 2).Value), _
                                        Val(objSh.Cells(8, 2).Value), _
                                        Val(objSh.Cells(9, 2).Value), _
                                        Val(objSh.Cells(10, 2).Value), _
                                        Val(objSh.Cells(11, 2).Value))
        '-------------------------------------------------------------------------------------------
        ' 結果をセット(左端が"*"はエラーと判断)
        If Left(strPassword, 1) <> g_cnsERR_MARK Then
            ' 正常時はパスワードをセルにセット
            objSh.Cells(lngRow, 2).Value = strPassword
        Else
            ' 異常時は返されたエラーメッセージを表示
            MsgBox Mid(strPassword, 2), vbExclamation, g_cnsTitle
            Exit For
        End If
    Next lngRow
    ThisWorkbook.Saved = True
End Sub

'***************************************************************************************************
'* 処理名 :パスワードクリア
'* 機能  :パスワードクリア(メイン)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2007年04月19日
'* 作成者 :井上 治
'* 更新日 :2019年12月29日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Public Sub パスワードクリア()
    '-----------------------------------------------------------------------------------------------
    ThisWorkbook.Worksheets(1).Range(g_cnsClearRange).ClearContents
    ThisWorkbook.Saved = True
End Sub

'------------------------------------------<< End of Source >>--------------------------------------
実際に「パスワード」を生成する「FP_MAKE_PASSWORD2」関数は、別モジュール「modMakePassword2.bas」をインポートさせれば、他のプロジェクトにも利用可能になるように独立させてあります。

一応、「パスワード生成機能」のモジュールの紹介しておきます。
生成するパスワードの桁数、「数字」を含む場合の数字の桁数(上限、下限)などをを引数として、 「FP_MAKE_PASSWORD2」関数を呼び出すことで、パスワードが受け取れるようになっています。

'***************************************************************************************************
'   パスワード生成2(英字文字列,数字文字列より指定桁数のパスワードを生成) modMakePassword2(Module)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'07/04/19(1.00)新規作成
'19/12/29(1.10)記述標準化対応
'***************************************************************************************************
Option Explicit
Option Private Module
'===================================================================================================
' 英小文字("l"は除外)
Private Const g_cnsMoji1 As String = "abcdefghijkmnopqrstuvwxyz"    ' パスワード用文字(英字)
Private Const g_cnsCol1 As String = "1533345687876901425742261"     ' 各文字のキー位置(列)
Private Const g_cnsRow1 As String = "3443233323344222232242424"     ' 各文字のキー位置(行)
' 英大文字("O"は除外)
Private Const g_cnsMoji2 As String = "ABCDEFGHIJKLMNPQRSTUVWXYZ"    '  〃 (英大文字)
Private Const g_cnsCol2 As String = "1533345687897601425742261"     ' 各文字のキー位置(列)
Private Const g_cnsRow2 As String = "3443233323334422232242424"     ' 各文字のキー位置(行)
' 数字
Private Const g_cnsSuji As String = "1234567890"                    ' パスワード用文字(数字)
Private Const g_cnsCol3 As String = "1234567890"                    ' 各文字のキー位置(列)
Private Const g_cnsRow3 As String = "1111111111"                    ' 各文字のキー位置(行)
'---------------------------------------------------------------------------------------------------
Public Const g_cnsERR_MARK As String = "*"                          ' エラーマーク

'***************************************************************************************************
'   ■■■ 公開プロシージャ ■■■
'***************************************************************************************************
'* 処理名 :FP_MAKE_PASSWORD2
'* 機能  :パスワード生成(本体処理⇒関数化)
'---------------------------------------------------------------------------------------------------
'* 返り値 :パスワード文字列(先頭が「*」の場合はエラーメッセージ)
'* 引数  :Arg1 = パスワードの総桁数(Integer)
'*      Arg2 = 混在する数字の最小桁数(Integer)
'*      Arg3 = 混在する数字の最大桁数(Integer)
'*      Arg4 = 数字の連続を許可する最大桁数(Integer)
'*      Arg5 = 英大文字使用スイッチ(Integer) ※0=使用しない, 1=使用する
'*      Arg6 = キーボード上の最小行(Integer) ※1~3
'*      Arg7 = キーボード上の最大行(Integer) ※2~4
'*      Arg8 = キーボード上の最小列(Integer) ※1~7
'*      Arg9 = キーボード上の最大列(Integer) ※3~10
'---------------------------------------------------------------------------------------------------
'* 作成日 :2007年04月19日
'* 作成者 :井上 治
'* 更新日 :2019年12月29日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Public Function FP_MAKE_PASSWORD2(ByVal intKeta1 As Integer, _
                                  ByVal intKeta2 As Integer, _
                                  ByVal intKeta3 As Integer, _
                                  ByVal intKeta4 As Integer, _
                                  ByVal swUpper As Integer, _
                                  ByVal intKeyRowStr As Integer, _
                                  ByVal intKeyRowEnd As Integer, _
                                  ByVal intKeyColStr As Integer, _
                                  ByVal intKeyColEnd As Integer) As String
    '-----------------------------------------------------------------------------------------------
    Dim intIx As Integer                                            ' テーブルINDEX
    Dim intChar As Integer                                          ' 文字コード
    Dim intRetry As Integer                                         ' リトライカウンタ
    Dim intCnt1 As Integer                                          ' 数字の文字数
    Dim intCnt2 As Integer                                          ' 連続する数字の桁数
    Dim strCharacters As String                                     ' パスワード用文字
    Dim strCharRows As String                                       ' 各文字のキー位置(列)
    Dim strCharCols As String                                       ' 各文字のキー位置(行)
    Dim tblMoji() As String                                         ' 文字の配列
    Dim strPassword As String                                       ' 生成パスワード
    Dim swOK As Boolean                                             ' 正常判定
    Dim strErrMSG As String                                         ' エラーメッセージ
    ' 指定内容のチェック(エラーはこの時点で終了)
    strErrMSG = FP_CHECK_KETA2(intKeta1, _
                               intKeta2, _
                               intKeta3, _
                               intKeta4, _
                               swUpper, _
                               intKeyRowStr, _
                               intKeyRowEnd, _
                               intKeyColStr, _
                               intKeyColEnd)
    ' エラーか
    If strErrMSG <> "" Then
        FP_MAKE_PASSWORD2 = g_cnsERR_MARK & strErrMSG
        Exit Function
    End If
    '---------------------------------------------------------------------------
    ' 単純に使用文字種を収集
    strCharacters = g_cnsMoji1
    strCharRows = g_cnsRow1
    strCharCols = g_cnsCol1
    ' 英大文字使用スイッチ
    If swUpper = 1 Then
        ' 英大文字を追加
        strCharacters = strCharacters & g_cnsMoji2
        strCharRows = strCharRows & g_cnsRow2
        strCharCols = strCharCols & g_cnsCol2
    End If
    If intKeyRowStr < 2 Then
        ' 数字を追加
        strCharacters = strCharacters & g_cnsSuji
        strCharRows = strCharRows & g_cnsRow3
        strCharCols = strCharCols & g_cnsCol3
    End If
    ' 文字種の作成(利用範囲内文字で配列化させておく)
    Call FP_MAKE_ARRAY(intKeyRowStr, _
                       intKeyRowEnd, _
                       intKeyColStr, _
                       intKeyColEnd, _
                       strCharacters, _
                       strCharRows, _
                       strCharCols, _
                       tblMoji)
    '---------------------------------------------------------------------------
    ' 条件に合うパスワードが生成されるまで繰り返す(上限50回)
    For intRetry = 1 To 50
        swOK = True
        ' 乱数系を初期化
        Randomize
        ' ランダムに並べ替える
        Call GP_SORT_ARRAY(tblMoji)
        ' 作成文字列の検査
        intCnt1 = 0                                 ' 数字の文字数
        intCnt2 = 0                                 ' 連続する数字の桁数
        intIx = 0
        Do While intIx < intKeta1
            ' 現文字が数字かを判定(数字はAsciiで48~57)
            intChar = Asc(tblMoji(intIx))
            If ((intChar >= 48) And (intChar <= 57)) Then
                intCnt1 = intCnt1 + 1
                intCnt2 = intCnt2 + 1
                If intCnt2 > intKeta4 Then
                    swOK = False
                    Exit Do
                End If
            Else
                intCnt2 = 0
            End If
            intIx = intIx + 1
        Loop
        If swOK Then
            If intCnt1 < intKeta2 Then
                swOK = False
            ElseIf intCnt1 > intKeta3 Then
                swOK = False
            Else
                Exit For
            End If
        End If
    Next intRetry
    ' パスワードを戻り値にセットして終了
    If swOK = True Then
        strPassword = tblMoji(0)
        intIx = 1
        Do While intIx < intKeta1
            strPassword = strPassword & tblMoji(intIx)
            intIx = intIx + 1
        Loop
        FP_MAKE_PASSWORD2 = strPassword
    Else
        FP_MAKE_PASSWORD2 = g_cnsERR_MARK & _
            "条件範囲内でパスワードの作成ができませんでした。"
    End If
End Function

'***************************************************************************************************
'   ■■■ サブ処理(Private) ■■■
'***************************************************************************************************
'* 処理名 :FP_CHECK_KETA2
'* 機能  :文字列、桁数指定のチェック
'---------------------------------------------------------------------------------------------------
'* 返り値 :エラーメッセージ(エラーなしはブランク)
'* 引数  :Arg1 = パスワードの総桁数(Integer)
'*      Arg2 = 混在する数字の最小桁数(Integer)
'*      Arg3 = 混在する数字の最大桁数(Integer)
'*      Arg4 = 数字の連続を許可する最大桁数(Integer)
'*      Arg5 = 英大文字使用スイッチ(Integer) ※0=使用しない, 1=使用する
'*      Arg6 = キーボード上の最小行(Integer) ※1~3
'*      Arg7 = キーボード上の最大行(Integer) ※2~4
'*      Arg8 = キーボード上の最小列(Integer) ※1~7
'*      Arg9 = キーボード上の最大列(Integer) ※3~10
'---------------------------------------------------------------------------------------------------
'* 作成日 :2007年04月19日
'* 作成者 :井上 治
'* 更新日 :2019年12月29日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Function FP_CHECK_KETA2(ByVal intKeta1 As Integer, _
                                ByVal intKeta2 As Integer, _
                                ByVal intKeta3 As Integer, _
                                ByVal intKeta4 As Integer, _
                                ByVal swUpper As Integer, _
                                ByVal intKeyRowStr As Integer, _
                                ByVal intKeyRowEnd As Integer, _
                                ByVal intKeyColStr As Integer, _
                                ByVal intKeyColEnd As Integer) As String
    '-----------------------------------------------------------------------------------------------
    Dim intCol As Integer                                           ' カラム
    Dim intRow As Integer                                           ' 行
    Dim intKeyCnt As Integer                                        ' キー件数
    Dim strErrMSG As String                                         ' エラーメッセージ
    ' 各桁数(値範囲)のチェック
    If ((intKeta1 < 3) Or (intKeta1 > 20)) Then
        Call GP_AppendMessage("「パスワード桁数」が範囲外です。", strErrMSG)
    End If
    If ((intKeta3 < 0) Or (intKeta3 > 10) Or (intKeta3 > intKeta1)) Then
        Call GP_AppendMessage("「数字混在最大桁数」が範囲外または矛盾値です。", strErrMSG)
    End If
    If ((intKeta2 < 0) Or (intKeta2 > intKeta3)) Then
        Call GP_AppendMessage("「数字混在最小桁数」が範囲外または矛盾値です。", strErrMSG)
    End If
    If ((intKeta4 < 0) Or (intKeta4 > intKeta3)) Then
        Call GP_AppendMessage("「数字連続許可桁数」が範囲外または矛盾値です。", strErrMSG)
    End If
    If ((swUpper < 0) Or (swUpper > 1)) Then
        Call GP_AppendMessage("「英字大小文字混在」が範囲外です。", strErrMSG)
    End If
    If ((intKeyRowStr < 1) Or (intKeyRowStr > 3)) Then
        Call GP_AppendMessage("「キーボード行最小行」が範囲外です。", strErrMSG)
    End If
    If ((intKeyRowEnd < 2) Or (intKeyRowEnd > 4) Or (intKeyRowEnd < intKeyRowStr)) Then
        Call GP_AppendMessage("「キーボード行最大行」が範囲外または矛盾値です。", strErrMSG)
    End If
    If ((intKeyColStr < 1) Or (intKeyColStr > 7)) Then
        Call GP_AppendMessage("「キーボード行最小列」が範囲外です。", strErrMSG)
    End If
    If ((intKeyColEnd < 3) Or (intKeyColEnd > 10) Or (intKeyColEnd < intKeyColStr)) Then
        Call GP_AppendMessage("「キーボード行最大列」が範囲外または矛盾値です。", strErrMSG)
    End If
    If strErrMSG <> "" Then GoTo CHECK_KETA_EXIT
    ' 組み合わせチェック
    If ((intKeyRowStr > 1) And (intKeta2 > 0)) Then
        Call GP_AppendMessage("「数字混在最小桁数」と「キーボード行最小行」が矛盾しています。", strErrMSG)
        GoTo CHECK_KETA_EXIT
    End If
    intCol = intKeyColEnd - intKeyColStr + 1
    intRow = intKeyRowEnd - intKeyRowStr + 1
    intKeyCnt = intCol * intRow
    If intKeyCnt <= (intKeta1 + 5) Then
        Call GP_AppendMessage("「キーボード行列範囲」が充分な個数を満たしていません。", strErrMSG)
    End If

'===================================================================================================
' 終了
CHECK_KETA_EXIT:
    FP_CHECK_KETA2 = strErrMSG
End Function

'***************************************************************************************************
'* 処理名 :FP_MAKE_ARRAY
'* 機能  :文字列を配列に変換
'---------------------------------------------------------------------------------------------------
'* 返り値 :作成した配列の要素数(Integer)
'* 引数  :Arg1 = キーボード上の最小行(Integer)
'*      Arg2 = キーボード上の最大行(Integer)
'*      Arg3 = キーボード上の最小列(Integer)
'*      Arg4 = キーボード上の最大列(Integer)
'*      Arg5 = 原資文字列(String)
'*      Arg6 = 原資文字列の行位置(String)
'*      Arg7 = 原資文字列の列位置(String)
'*      Arg8 = 文字の配列(Array)                   ※Ref参照
'---------------------------------------------------------------------------------------------------
'* 作成日 :2007年04月19日
'* 作成者 :井上 治
'* 更新日 :2019年12月29日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:配列は0オリジン(要素数上限は文字列桁数-1)
'***************************************************************************************************
Private Function FP_MAKE_ARRAY(ByVal intKeyRowStr As Integer, _
                               ByVal intKeyRowEnd As Integer, _
                               ByVal intKeyColStr As Integer, _
                               ByVal intKeyColEnd As Integer, _
                               ByVal strCharacters As String, _
                               ByVal strCharRows As String, _
                               ByVal strCharCols As String, _
                               ByRef tblMoji() As String) As Integer
    '-----------------------------------------------------------------------------------------------
    Dim intIx As Integer                                            ' テーブルINDEX
    Dim intIx2 As Integer                                           ' テーブルINDEX
    Dim intIxMax As Integer                                         ' テーブルINDEX上限
    Dim intRow As Integer                                           ' 行
    Dim intCol As Integer                                           ' カラム
    Dim strChar As String * 1                                       ' 1文字Work
    intIxMax = Len(strCharacters)
    ReDim tblMoji(0)
    ' 範囲外の文字を除去して配列作成
    intIx2 = -1
    For intIx = 1 To intIxMax
        ' 文字列より1文字を切り出す
        strChar = Mid(strCharacters, intIx, 1)
        intRow = CInt(Mid(strCharRows, intIx, 1))
        intCol = CInt(Mid(strCharCols, intIx, 1))
        If intCol = 0 Then intCol = 10
        ' 利用範囲かを判定
        If ((intRow >= intKeyRowStr) And (intRow <= intKeyRowEnd) And _
            (intCol >= intKeyColStr) And (intCol <= intKeyColEnd)) Then
            intIx2 = intIx2 + 1
            ReDim Preserve tblMoji(intIx2)
            tblMoji(intIx2) = strChar
        End If
    Next intIx
    FP_MAKE_ARRAY = intIx2
End Function

'***************************************************************************************************
'* 処理名 :GP_SORT_ARRAY
'* 機能  :文字配列を生成したランダム値で並替え
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :Arg1 = 文字の配列(String:Array)            ※Ref参照
'*      Arg2 = 並べ替え開始位置(Integer:Option)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2007年04月19日
'* 作成者 :井上 治
'* 更新日 :2019年12月29日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:並べ替え開始位置に「1」をセットすると先頭文字は並び替え対象から外れる
'***************************************************************************************************
Private Sub GP_SORT_ARRAY(ByRef tblMoji() As String, Optional ByVal swOmit As Integer)
    '-----------------------------------------------------------------------------------------------
    Dim tblSng() As Single                                          ' ランダム値テーブル
    Dim intIx As Integer                                            ' テーブルINDEX
    Dim intIx2 As Integer                                           ' テーブルINDEX
    Dim intIxMax As Integer                                         ' テーブルINDEX上限
    Dim tmpMoji As String                                           ' 文字WORK
    Dim tmpSng As Single                                            ' ランダム値WORK
    intIxMax = UBound(tblMoji)
    ' 同一要素数の配列にランダム値を取得
    ReDim tblSng(intIxMax)
    For intIx = 0 To intIxMax
        tblSng(intIx) = Rnd()
    Next intIx
    ' ランダム値の昇順で文字列を並べ替え(バブルSORT, swOmitは先頭文字位置)
    intIx = swOmit
    Do While intIx < intIxMax
        intIx2 = intIxMax
        Do While intIx2 > intIx
            If tblSng(intIx2) < tblSng(intIx) Then
                ' 文字配列の入れ替え
                tmpMoji = tblMoji(intIx2)
                tblMoji(intIx2) = tblMoji(intIx)
                tblMoji(intIx) = tmpMoji
                ' Rnd()値配列の入れ替え
                tmpSng = tblSng(intIx2)
                tblSng(intIx2) = tblSng(intIx)
                tblSng(intIx) = tmpSng
            End If
            intIx2 = intIx2 - 1
        Loop
        intIx = intIx + 1
    Loop
End Sub

'***************************************************************************************************
'* 処理名 :GP_AppendMessage
'* 機能  :メッセージ累積
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :Arg1 = 今回メッセージ(String)
'*      Arg2 = 累積メッセージ(String)              ※Ref参照
'---------------------------------------------------------------------------------------------------
'* 作成日 :2019年12月29日
'* 作成者 :井上 治
'* 更新日 :2019年12月29日
'* 更新者 :井上 治
'* 機能説明:改行を挟んでメッセージを累積する
'* 注意事項:
'***************************************************************************************************
Private Sub GP_AppendMessage(ByVal strAddMSG As String, ByRef strRuiMSG As String)
    '-----------------------------------------------------------------------------------------------
    If strRuiMSG <> "" Then strRuiMSG = strRuiMSG & vbCrLf
    strRuiMSG = strRuiMSG & strAddMSG
End Sub

'------------------------------------------<< End of Source >>--------------------------------------
記述にコメントで説明を埋め込んでいるので詳細の説明は割愛しますが、この処理は英字の「a」~「z」(大文字も含める場合は「A」~「Z」も)と数字の「0」~「9」を一連の配列に並べてランダムに並び替えてから指定する桁数を切り出して、 切り出したものを1つに接合させて「パスワード」としています。キーボードの配置範囲については文字列と同様に位置情報を並べたものから必要文字を配列化する段階で絞り込んでいます。 ランダム並び替え後に数字の連続限度などを判断して、並び替えを再度行なうように配慮してあります。
ダウンロードはこちら。

←MAKE_PASSWORD2.zip
      (40KB)