制限事項 |
---|
パスワードの文字種として英小文字の「l(エル)」と英大文字「O(オー)」は除外しています。 |
英小文字、英大文字、数字、記号の文字種で指定がある文字種が最低1文字含まれているかで制限しています。 |
英小文字、英大文字、数字が全て指定されている時はそれぞれが全体のパスワード桁数の半分の桁数以上にならないように制限しています。 |
先頭に記号が発生しないように制限しています。 |
記号が連続しないように制限しています。 |
同一文字が連続しないように制限しています。 |
記号については同一文字が複数回発生しないように制限しています。 |
プロシージャ | タイトル | 機能内容 |
---|---|---|
MakePassword | パスワード生成 | 1件のパスワードを生成します。 戻り値:生成したパスワード(String) 引数①:生成で使用した英小文字文字数(Long,Ref参照,Option) 引数②:生成で使用した英小文字文字数(Long,Ref参照,Option) 引数③:生成で使用した数字文字数(Long,Ref参照,Option) 引数④:生成で使用した記号文字数(Long,Ref参照,Option) 引数は検証用に設定しているものです。検証後の本稼働では必要ありません。 |
プロパティ | タイトル | 機能内容 |
---|---|---|
prpSymbolChars | 記号文字種(String) | デフォルト:#$-=?@[]_ パスワードに記号を使用する時の使用できる文字種が指定できます。 ブランクとして設定した場合は「記号使用(prpUseSymbol)」がFalseになります。 |
prpPWLength | パスワード桁数(Long) | デフォルト:20 生成するパスワードの桁数が指定できます。 |
prpUseAlfaSmall | 英小文字使用(Boolean) | デフォルト:True パスワードに英小文字を使用するかを指定できます。 |
prpUseAlfaLarge | 英大文字使用(Boolean) | デフォルト:True パスワードに英大文字を使用するかを指定できます。 |
prpUseNumber | 数字使用(Boolean) | デフォルト:True パスワードに数字を使用するかを指定できます。 |
prpUseSymbol | 記号使用(Boolean) | デフォルト:True 「記号文字種(prpSymbolChars)」がブランクの状態で本項目をTrueにした場合、 「記号文字種(prpSymbolChars)」はデフォルト値に戻ります。 |
prpCntMaxDupChar | 同一文字生成上限件数(Long) | デフォルト:2 英小文字、英大文字、数字について生成するパスワード内で同一文字が発生できる上限の文字数を指定できます。 記号については同一文字が発生できる上限は1文字のみに固定されています。 |
prpCntMaxSymbol | 記号生成上限件数(Long) | デフォルト:2 パスワードに使用する記号の生成文字数の上限を指定できます。 |
'***************************************************************************************************
' パスワード生成テスト
'
' 作成者:井上治 URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev 変更履歴内容------------------------------------------------------------------------>
'19/01/30(1.00)新規作成
'19/02/02(1.00)生成行列を定数化
'***************************************************************************************************
Option Explicit
'===================================================================================================
Private Const g_cnsTitle As String = "パスワード生成テスト"
'---------------------------------------------------------------------------------------------------
Private Const g_cnsRowStr As Long = 3 ' 先頭行
Private Const g_cnsRowEnd As Long = 102 ' 最終行
Private Const g_cnsColPW As Long = 1 ' PW列
' ↓↓↓ これは処理結果検証用の記述です ↓↓↓
Private Const g_cnsColAlfaSmall As Long = 2 ' 英小文字文字数列
Private Const g_cnsColAlfaLarge As Long = 3 ' 英大文字文字数列
Private Const g_cnsColNumber As Long = 4 ' 数字文字数列
Private Const g_cnsColSymbol As Long = 5 ' 記号文字数列
' ↑↑↑ これは処理結果検証用の記述です ↑↑↑
'***************************************************************************************************
'* 処理名 :CreatePasswordsTEST
'* 機能 :パスワード生成テスト
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2019年01月30日
'* 作成者 :井上 治
'* 更新日 :2019年02月02日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Sub CreatePasswordsTEST()
'-----------------------------------------------------------------------------------------------
Dim objMakePassword As New clsMakePassword ' パスワード生成クラス
Dim objSh As Worksheet ' Worksheet
Dim lngCntAlfaSmall As Long ' 英小文字文字数
Dim lngCntAlfaLarge As Long ' 英大文字文字数
Dim lngCntNumber As Long ' 数字文字数
Dim lngCntSymbol As Long ' 記号文字数
Dim lngRow As Long ' 行INDEX
Set objSh = ThisWorkbook.Worksheets(1)
With objSh
' 既に生成済か
If .Cells(g_cnsRowStr, g_cnsColPW).Value <> "" Then
' 処理不要なら終了
If MsgBox("このシートは既にパスワード生成済です。" & vbCrLf & "再度生成しますか?", _
vbInformation + vbYesNo, g_cnsTitle) <> vbYes Then Exit Sub
End If
' フィルタ解除
If .FilterMode Then .ShowAllData
' ' パスワード生成クラスのパラメータ(変更可、このデフォルト通りなら記述不要)
' With objMakePassword
' .prpSymbolChars = "#$-=?@[]_" ' 記号文字種
' .prpPWLength = 20 ' パスワード文字数
' .prpUseAlfaSmall = True ' 英小文字使用
' .prpUseAlfaLarge = True ' 英大文字使用
' .prpUseNumber = True ' 数字使用
' .prpUseSymbol = True ' 記号使用
' .prpCntMaxDupChar = 2 ' 同一文字生成上限件数
' .prpCntMaxSymbol = 2 ' 記号生成上限件数
' End With
' パスワード消去
Call ErasePasswordsTEST
' 連続生成する
For lngRow = g_cnsRowStr To g_cnsRowEnd
' パスワード生成(PW生成のみなら引数は不要)
.Cells(lngRow, g_cnsColPW).Value = objMakePassword.MakePassword(lngCntAlfaSmall, _
lngCntAlfaLarge, _
lngCntNumber, _
lngCntSymbol)
' ↓↓↓ これは処理結果検証用の記述です ↓↓↓
.Cells(lngRow, g_cnsColAlfaSmall).Value = lngCntAlfaSmall
.Cells(lngRow, g_cnsColAlfaLarge).Value = lngCntAlfaLarge
.Cells(lngRow, g_cnsColNumber).Value = lngCntNumber
.Cells(lngRow, g_cnsColSymbol).Value = lngCntSymbol
' ↑↑↑ これは処理結果検証用の記述です ↑↑↑
Next lngRow
End With
ThisWorkbook.Saved = True
End Sub
'***************************************************************************************************
'* 処理名 :ErasePasswordsTEST
'* 機能 :パスワード消去テスト
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2019年01月30日
'* 作成者 :井上 治
'* 更新日 :2019年02月02日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Sub ErasePasswordsTEST()
'-----------------------------------------------------------------------------------------------
Dim objSh As Worksheet ' Worksheet
Dim lngRow As Long ' 行INDEX
Set objSh = ThisWorkbook.Worksheets(1)
With objSh
' フィルタ解除
If .FilterMode Then .ShowAllData
' 最終行判定
lngRow = .Cells(.Rows.Count, g_cnsColPW).End(xlUp).Row
' パスワード生成済か
If lngRow >= g_cnsRowStr Then
' パスワード列をクリア
.Range(.Cells(g_cnsRowStr, g_cnsColPW), .Cells(lngRow, g_cnsColPW)).ClearContents
' ↓↓↓ これは処理結果検証用の記述です ↓↓↓
.Range(.Cells(g_cnsRowStr, g_cnsColAlfaSmall), .Cells(lngRow, g_cnsColAlfaSmall)).ClearContents
.Range(.Cells(g_cnsRowStr, g_cnsColAlfaLarge), .Cells(lngRow, g_cnsColAlfaLarge)).ClearContents
.Range(.Cells(g_cnsRowStr, g_cnsColNumber), .Cells(lngRow, g_cnsColNumber)).ClearContents
.Range(.Cells(g_cnsRowStr, g_cnsColSymbol), .Cells(lngRow, g_cnsColSymbol)).ClearContents
' ↑↑↑ これは処理結果検証用の記述です ↑↑↑
End If
End With
ThisWorkbook.Saved = True
End Sub
'----------------------------------------<< End of Source >>----------------------------------------
'***************************************************************************************************
' パスワード生成クラス(clsMakePassword)
'
' 作成者:井上治 URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev 変更履歴内容------------------------------------------------------------------------>
'16/06/30(1.00)新規作成
'18/12/21(1.10)動作改善、クラス化移行
'19/01/30(1.20)同一文字生成上限件数、記号文字種、記号生成上限件数の設定を追加
'***************************************************************************************************
Option Explicit
'===================================================================================================
' 共通定数
'---------------------------------------------------------------------------------------------------
' パスワード使用文字種(英小文字の「l」、英大文字の「O」は除外している) ※ここでは記号は含まない
Private Const g_cnsPasswordChars As String = _
"abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ0123456789"
' ....*....1....*....2....*....3....*....4....*....5....*....6
Private Const g_cnsDefaultSymbolChars As String = "#$-=?@[]_" ' 記号文字種(デフォルト)
Private Const g_cnsAlfaSmallS As Long = 1 ' 英小文字開始位置
Private Const g_cnsAlfaSmallE As Long = 25 ' 英小文字終了位置
Private Const g_cnsAlfaLargeS As Long = 26 ' 英大文字開始位置
Private Const g_cnsAlfaLargeE As Long = 50 ' 英大文字終了位置
Private Const g_cnsNumberS As Long = 51 ' 数字開始位置
Private Const g_cnsNumberE As Long = 60 ' 数字終了位置
Private Const g_cnsSymbolS As Long = 61 ' 記号開始位置
'===================================================================================================
' 設定項目
'---------------------------------------------------------------------------------------------------
Private g_strPasswordChars As String ' パスワード使用文字種
Private g_lngPasswordCharsLength As Long ' パスワード使用文字種の長さ
'---------------------------------------------------------------------------------------------------
' プロパティ設定項目
Private g_strSymbolChars As String ' 記号文字種
Private g_lngPWLength As Long ' パスワード桁数
Private g_blnUseAlfaSmall As Boolean ' 英小文字使用
Private g_blnUseAlfaLarge As Boolean ' 英大文字使用
Private g_blnUseNumber As Boolean ' 数字使用
Private g_blnUseSymbol As Boolean ' 記号使用
Private g_lngCntMaxDupChar As Long ' 同一文字生成上限件数
Private g_lngCntMaxSymbol As Long ' 記号生成上限件数
'***************************************************************************************************
' ■■■ 初期化 ■■■
'***************************************************************************************************
'* 処理名 :Class_Initialize
'* 機能 :クラス初期化(既定)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2016年06月30日
'* 作成者 :井上 治
'* 更新日 :2019年01月30日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub Class_Initialize()
'-----------------------------------------------------------------------------------------------
' 設定項目に既定値をセット
g_strSymbolChars = g_cnsDefaultSymbolChars
g_lngPWLength = 20
g_blnUseAlfaSmall = True
g_blnUseAlfaLarge = True
g_blnUseNumber = True
g_blnUseSymbol = True
g_lngCntMaxDupChar = 2
g_lngCntMaxSymbol = 2
' パスワード使用文字種の再設定
Call GP_ResetPasswordChars
' 乱数初期化
Randomize
End Sub
'***************************************************************************************************
' ■■■ 公開プロシージャ ■■■
'***************************************************************************************************
'* 処理名 :MakePassword
'* 機能 :パスワード生成
'---------------------------------------------------------------------------------------------------
'* 返り値 :生成したパスワード(String)
'* 引数 :Arg1 = 英小文字文字数(Long) ※Ref参照、Option
'* Arg2 = 英大文字文字数(Long) ※Ref参照、Option
'* Arg3 = 数字文字数(Long) ※Ref参照、Option
'* Arg4 = 記号文字数(Long) ※Ref参照、Option
'---------------------------------------------------------------------------------------------------
'* 作成日 :2016年06月30日
'* 作成者 :井上 治
'* 更新日 :2019年01月30日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Friend Function MakePassword(Optional ByRef lngCntAlfaSmall As Long = 0, _
Optional ByRef lngCntAlfaLarge As Long = 0, _
Optional ByRef lngCntNumber As Long = 0, _
Optional ByRef lngCntSymbol As Long = 0) As String
'-----------------------------------------------------------------------------------------------
Dim blnFinish As Boolean ' 終了判定
Dim lngKetasu As Long ' 桁数WORK
Dim lngIx As Long ' テーブルINDEX
Dim strPassword As String ' パスワード
Dim tblCntChar() As Long ' 文字発生件数テーブル
' 生成成功まで繰り返す
Do Until blnFinish
' 変数クリア
strPassword = ""
lngCntAlfaSmall = 0
lngCntAlfaLarge = 0
lngCntNumber = 0
lngCntSymbol = 0
ReDim tblCntChar(1 To g_lngPasswordCharsLength)
' 生成文字数まで繰り返す
Do While Len(strPassword) < g_lngPWLength
' パスワード生成(1文字分処理)
Call GP_MakePWChar(strPassword, _
lngCntAlfaSmall, _
lngCntAlfaLarge, _
lngCntNumber, _
lngCntSymbol, _
tblCntChar)
Loop
' 終了判定(使用文字種が少なくとも1文字以上あるか)
blnFinish = True
' 英小文字
If g_blnUseAlfaSmall And lngCntAlfaSmall = 0 Then blnFinish = False
' 英大文字
If g_blnUseAlfaLarge And lngCntAlfaLarge = 0 Then blnFinish = False
' 数字
If g_blnUseNumber And lngCntNumber = 0 Then blnFinish = False
' 記号
If g_blnUseSymbol And lngCntSymbol = 0 Then blnFinish = False
' 英小文字,英大文字,数字が指定の時各文字種の件数チェック
If blnFinish And g_blnUseAlfaSmall And g_blnUseAlfaLarge And g_blnUseNumber Then
lngKetasu = g_lngPWLength \ 2
' 英小文字が桁数の半分以上はNG
If lngCntAlfaSmall >= lngKetasu Then blnFinish = False
' 英大文字が桁数の半分以上はNG
If lngCntAlfaLarge >= lngKetasu Then blnFinish = False
' 数字が桁数の半分以上はNG
If lngCntNumber >= lngKetasu Then blnFinish = False
' 16桁以上の時
If g_lngPWLength >= 16 Then
' 英小文字が2桁はNG
If lngCntAlfaSmall <= 2 Then blnFinish = False
' 英大文字が2桁はNG
If lngCntAlfaLarge <= 2 Then blnFinish = False
' 数字が2桁はNG
If lngCntNumber <= 2 Then blnFinish = False
ElseIf g_lngPWLength >= 10 Then
' 10桁以上の時
' 英小文字が1桁はNG
If lngCntAlfaSmall <= 1 Then blnFinish = False
' 英大文字が1桁はNG
If lngCntAlfaLarge <= 1 Then blnFinish = False
' 数字が1桁はNG
If lngCntNumber <= 1 Then blnFinish = False
End If
' 記号
If blnFinish And g_blnUseSymbol Then
' 記号が上限件数超はNG
If lngCntSymbol > g_lngCntMaxSymbol Then blnFinish = False
End If
End If
' 同一文字出現回数
If blnFinish Then
' 各文字の出現回数を判定(記号以外)
For lngIx = 1 To g_cnsNumberE
' 出現回数超過か
If tblCntChar(lngIx) > g_lngCntMaxDupChar Then
blnFinish = False
Exit For
End If
Next lngIx
' 終了判定
If blnFinish And g_blnUseSymbol Then
lngIx = g_cnsSymbolS
' 記号の出現回数
Do While lngIx <= g_lngPasswordCharsLength
' 同一記号は1回まで
If tblCntChar(lngIx) > 1 Then
blnFinish = False
Exit Do
End If
' 次へ
lngIx = lngIx + 1
Loop
End If
End If
Loop
MakePassword = strPassword
End Function
'***************************************************************************************************
' ■■■ サブ処理 ■■■
'***************************************************************************************************
'* 処理名 :GP_MakePWChar
'* 機能 :パスワード生成(1文字分処理)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :Arg1 = 生成したパスワード(String) ※Ref参照
'* Arg2 = 英小文字文字数(Long) ※Ref参照
'* Arg3 = 英大文字文字数(Long) ※Ref参照
'* Arg4 = 数字文字数(Long) ※Ref参照
'* Arg5 = 記号文字数(Long) ※Ref参照
'* Arg6 = 文字発生件数テーブル(Array:Long) ※Ref参照
'---------------------------------------------------------------------------------------------------
'* 作成日 :2016年06月30日
'* 作成者 :井上 治
'* 更新日 :2019年01月30日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub GP_MakePWChar(ByRef strPassword As String, _
ByRef lngCntAlfaSmall As Long, _
ByRef lngCntAlfaLarge As Long, _
ByRef lngCntNumber As Long, _
ByRef lngCntSymbol As Long, _
ByRef tblCntChar() As Long)
'-----------------------------------------------------------------------------------------------
Dim lngPos As Long ' 文字位置(乱数取り出し)
Static lngPosP As Long ' 前回文字位置
' 乱数の発生
lngPos = Int(g_lngPasswordCharsLength * Rnd + 1)
' 先頭記号はNG
If strPassword = "" And lngPos >= g_cnsSymbolS Then Exit Sub
' 記号の連続はNG
If lngPos >= g_cnsSymbolS And lngPosP >= g_cnsSymbolS Then Exit Sub
' 同一文字連続はNG
If lngPos = lngPosP Then Exit Sub
' 文字位置を退避
lngPosP = lngPos
' 文字種判定
Select Case lngPos
Case Is <= g_cnsAlfaSmallE
' 英小文字
If g_blnUseAlfaSmall Then
lngCntAlfaSmall = lngCntAlfaSmall + 1
strPassword = strPassword & Mid(g_strPasswordChars, lngPos, 1)
tblCntChar(lngPos) = tblCntChar(lngPos) + 1
End If
Case g_cnsAlfaLargeS To g_cnsAlfaLargeE
' 英大文字
If g_blnUseAlfaLarge Then
lngCntAlfaLarge = lngCntAlfaLarge + 1
strPassword = strPassword & Mid(g_strPasswordChars, lngPos, 1)
tblCntChar(lngPos) = tblCntChar(lngPos) + 1
End If
Case g_cnsNumberS To g_cnsNumberE
' 数字
If g_blnUseNumber Then
lngCntNumber = lngCntNumber + 1
strPassword = strPassword & Mid(g_strPasswordChars, lngPos, 1)
tblCntChar(lngPos) = tblCntChar(lngPos) + 1
End If
Case Else
' 記号
If g_blnUseSymbol Then
lngCntSymbol = lngCntSymbol + 1
strPassword = strPassword & Mid(g_strPasswordChars, lngPos, 1)
tblCntChar(lngPos) = tblCntChar(lngPos) + 1
End If
End Select
End Sub
'***************************************************************************************************
'* 処理名 :GP_ResetPasswordChars
'* 機能 :パスワード使用文字種の再設定
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2019年01月30日
'* 作成者 :井上 治
'* 更新日 :2019年01月30日
'* 更新者 :井上 治
'* 機能説明:英数字文字列に指定の記号を追加して桁数を再設定
'* 注意事項:
'***************************************************************************************************
Private Sub GP_ResetPasswordChars()
'-----------------------------------------------------------------------------------------------
g_strPasswordChars = g_cnsPasswordChars & g_strSymbolChars
g_lngPasswordCharsLength = Len(g_strPasswordChars)
' 記号無しの場合
If g_strSymbolChars = "" Then
g_blnUseSymbol = False
End If
End Sub
'***************************************************************************************************
' ■■■ プロパティ ■■■
'***************************************************************************************************
' 記号文字種(String)
'---------------------------------------------------------------------------------------------------
Friend Property Let prpSymbolChars(ByVal Value As String)
g_strSymbolChars = Value
' パスワード使用文字種の再設定
Call GP_ResetPasswordChars
End Property
'===================================================================================================
' パスワード桁数(Long)
'---------------------------------------------------------------------------------------------------
Friend Property Let prpPWLength(ByVal Value As Long)
g_lngPWLength = Value
End Property
'===================================================================================================
' 英小文字使用(Boolean)
'---------------------------------------------------------------------------------------------------
Friend Property Let prpUseAlfaSmall(ByVal Value As Boolean)
g_blnUseAlfaSmall = Value
End Property
'===================================================================================================
' 英大文字使用(Boolean)
'---------------------------------------------------------------------------------------------------
Friend Property Let prpUseAlfaLarge(ByVal Value As Boolean)
g_blnUseAlfaLarge = Value
End Property
'===================================================================================================
' 数字使用(Boolean)
'---------------------------------------------------------------------------------------------------
Friend Property Let prpUseNumber(ByVal Value As Boolean)
g_blnUseNumber = Value
End Property
'===================================================================================================
' 記号使用(Boolean)
'---------------------------------------------------------------------------------------------------
Friend Property Let prpUseSymbol(ByVal Value As Boolean)
g_blnUseSymbol = Value
' 記号有りの場合
If g_blnUseSymbol And g_strSymbolChars = "" Then
g_strSymbolChars = g_cnsDefaultSymbolChars
' パスワード使用文字種の再設定
Call GP_ResetPasswordChars
End If
End Property
'===================================================================================================
' 同一文字生成上限件数(Long)
'---------------------------------------------------------------------------------------------------
Friend Property Let prpCntMaxDupChar(ByVal Value As Long)
g_lngCntMaxDupChar = Value
End Property
'===================================================================================================
' 記号生成上限件数(Long)
'---------------------------------------------------------------------------------------------------
Friend Property Let prpCntMaxSymbol(ByVal Value As Long)
g_lngCntMaxSymbol = Value
End Property
'----------------------------------------<< End of Source >>----------------------------------------