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