




'***************************************************************************************************
'   パスワード生成(英字文字列,数字文字列より指定桁数のパスワードを生成) 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 >>--------------------------------------
'***************************************************************************************************
'   パスワード生成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 >>--------------------------------------
←MAKE_PASSWORD2.zip (40KB)  |