Sub PASSWORD01()
Dim Eigi As String: Eigi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim Eigi2 As String: Eigi2 = "abcdefghijklmnopqrstuvwxyz"
Dim Suugi As String: Suugi = "0123456789"
Dim Kigou As String: Kigou = "#$%&='<>_+*-/?,."
Dim i As Integer
Dim j As Integer
Dim k As Integer '1-4で、英字・小英字・数字・記号
Dim StrArray(6) As String
Randomize
For j = 1 To 10
For i = 0 To 6
k = Int(4 * Rnd + 1)
Select Case True
Case k = 1
StrArray(i) = Mid(Eigi, Int(26 * Rnd + 1), 1)
Case k = 2
StrArray(i) = Mid(Eigi2, Int(26 * Rnd + 1), 1)
Case k = 3
StrArray(i) = Mid(Suugi, Int(10 * Rnd + 1), 1)
Case k = 4
StrArray(i) = Mid(Kigou, Int(16 * Rnd + 1), 1)
End Select
Next i
Cells(j, 1) = Replace(Join(StrArray), " ", "") 'エラーになる時がある
Next j
Sub PASSWORD02()
Const Eigi As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const Eigi2 As String = "abcdefghijklmnopqrstuvwxyz"
Const Suugi As String = "0123456789"
Const Kigou As String = "#$%&<>_+*-/?,."
Dim Moji_all As String
Dim i As Integer 'パスワード配列のidx
Dim j As Integer '作ったパスワードのカウンタ
Dim k As Integer '文字全部を一旦セルに入れる行数
Dim StrArray(6) As String
For j = 1 To 10
For k = 1 To Len(Moji_all)
Randomize
Cells(k, 3) = Mid(Moji_all, k, 1)
Cells(k, 2) = Rnd
Next k
Range(Cells(1, 2), Cells(Len(Moji_all), 3)) _
.Sort Key1:=Cells(1, 2), order1:=xlAscending
For i = 0 To 5
StrArray(i) = Cells(i + 1, 3)
Next i
Cells(j, 1) = Replace(Join(StrArray), " ", "")
Next j
関数名:
GenaratePassword
引数:
useNum As Boolean
useAlphaL As Boolean
useAlphaS As Boolean
useCode As Boolean
includeAll As Boolean
allowDuplicate As Boolean
minLength As Integer
maxLength As Integer
戻り値:
パスワード As String
Dim i As Integer
Dim j As Integer
Dim rntPass As String
i = 0
j = 0
rntPass = ""
Do While i < passLen
If useNum = True Then
If Len(PASS_STRING_NUM) > j Then
rntPass = rntPass & Mid(PASS_STRING_NUM, IdxArr_Num(j).Index + 1, 1)
i = i + 1
End If
End If
If useAlphaL = True Then
If Len(PASS_STRING_ALPHA_L) > j Then
rntPass = rntPass & Mid(PASS_STRING_ALPHA_L, IdxArr_AlphaL(j).Index + 1, 1)
i = i + 1
End If
End If
If useAlphaS = True Then
If Len(PASS_STRING_ALPHA_S) > j Then
rntPass = rntPass & Mid(PASS_STRING_ALPHA_S, IdxArr_AlphaS(j).Index + 1, 1)
i = i + 1
End If
End If
If useCode = True Then
If Len(PASS_STRING_CODE) > j Then
rntPass = rntPass & Mid(PASS_STRING_CODE, IdxArr_Code(j).Index + 1, 1)
i = i + 1
End If
End If
Private Function Shuffle(ByVal passString As String) As IndexArray()
Dim i As Integer
Dim passChar() As IndexArray
ReDim passChar(Len(passString) - 1)
Randomize
For i = 0 To UBound(passChar)
passChar(i).Index = i
passChar(i).ShuffleBuffer = Rnd
Next
SortByShuffleBuffer passChar
Shuffle = passChar
End Function
Private Sub SortByShuffleBuffer(ByRef passChars() As IndexArray)
Dim i As Integer
Dim j As Integer
Dim tmp As IndexArray
For i = 0 To UBound(passChars)
For j = UBound(passChars) To i Step -1
If passChars(i).ShuffleBuffer > passChars(j).ShuffleBuffer Then
tmp = passChars(i)
passChars(i) = passChars(j)
passChars(j) = tmp
End If
Next
Next
Function ShuffleStr(ByVal str As String) As String
Dim c As String
Dim i As Integer, j As Integer, iLength As Integer
iLength = Len(str)
For i = 1 To iLength
j = Int(Rnd() * iLength) + 1
c = Mid(str, i, 1): Mid(str, i, 1) = Mid(str, j, 1): Mid(str, j, 1) = c
Next i
ShuffleStr = str
End Function
' nLength パスワード長
' bAllowSameChar 同一文字の利用可否
' nAvailableCharSet 利用できる文字セット(文字セットを示す定数の組み合わせで与える)
' nMustContainCharSet 必ず含める文字セット( 〃 )
Function GeneratePasswordString(nLength As Integer, _
Optional bAllowSameChar As Boolean = True, _
Optional nAvailableCharSet As Byte = cnstCSDefault, _
Optional nMustContainCharset As Byte = cnstCSDefault) As String
Dim i As Integer, j As Integer
Dim CharSetMask(3) As Integer
Dim StrDic(3) As String '辞書
Dim DicUsedCt(3) As Integer '文字セットごとの利用済文字数
Dim nCharsetCt As Integer '利用可能な文字セット数
Dim nMustCharsetCt As Integer '利用必須な文字セット数
Dim TypeTbl() As Integer '(n+1)文字目の文字セット種
Randomize
'使用不可の文字タイプはマスクする
nMustContainCharset = nMustContainCharset And nAvailableCharSet
'各文字セットごとにシャッフルされた辞書を作成&(n+1)文字目の文字セット種を決定
ReDim TypeTbl(nLength) As Integer
nCharsetCt = 0: nMustCharsetCt = 0
CharSetMask(0) = cnstCSNum: StrDic(0) = "1234567890"
CharSetMask(1) = cnstCSAlL: StrDic(1) = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
CharSetMask(2) = cnstCSAlS: StrDic(2) = "abcdefghijklmnopqrstuvwxyz"
CharSetMask(3) = cnstCSSym: StrDic(3) = "!""#$%&'()*+,-./:;<=>?@[\]^`{|}~"
For i = 0 To 3
If nAvailableCharSet And CharSetMask(i) Then
StrDic(nCharsetCt) = ShuffleStr(StrDic(i)) '初期値を破壊するが問題無し
If nMustContainCharset And CharSetMask(i) Then '一時的に必須文字種を先頭部に強制格納
TypeTbl(nMustCharsetCt) = nCharsetCt: nMustCharsetCt = nMustCharsetCt + 1
End If
nCharsetCt = nCharsetCt + 1
End If
Next i
For i = nMustCharsetCt To nLength
TypeTbl(i) = Int(Rnd() * nCharsetCt)
Next i
'この時点でTypeTblは0〜nMustCharsetCt要素目までは必ず含める文字セット種が入る
'以降はランダムなのでシャッフルして全要素ランダムに
For i = 0 To nMustCharsetCt - 1
j = Int(Rnd() * nLength)
k = TypeTbl(i): TypeTbl(i) = TypeTbl(j): TypeTbl(j) = k
Next i
'パスワード文字列生成
GeneratePasswordString = ""
Dim c As String
For i = 0 To nLength - 1
If bAllowSameChar Then
c = Mid(StrDic(TypeTbl(i)), Int(Rnd() * Len(StrDic(TypeTbl(i)))) + 1, 1)
Else
c = Mid(StrDic(TypeTbl(i)), DicUsedCt(TypeTbl(i)) + 1, 1)
DicUsedCt(TypeTbl(i)) = DicUsedCt(TypeTbl(i)) + 1
End If
GeneratePasswordString = GeneratePasswordString & c
Next i
End Function
Sub PASSWORD03()
Dim Eigi As String: Eigi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim Eigi2 As String: Eigi2 = "abcdefghijklmnopqrstuvwxyz"
Dim Suugi As String: Suugi = "0123456789"
Dim Kigou As String: Kigou = "#$%&'<>_+*-/?,."
Dim i As Integer
Dim j As Integer
Dim k As Integer '1-4で、英字・小英字・数字・記号
Dim l As Integer 'パスワード配列のchk用idx
Dim StrArray(5) As String
Dim Onaji_chk_ok As Boolean
For j = 1 To 10
Erase StrArray
For i = 0 To 5
Onaji_chk_ok = False
Do While Onaji_chk_ok = False
Randomize
k = Int(4 * Rnd + 1)
Randomize
Select Case k
Case 1
StrArray(i) = Mid(Eigi, Int(26 * Rnd + 1), 1)
Case 2
StrArray(i) = Mid(Eigi2, Int(26 * Rnd + 1), 1)
Case 3
StrArray(i) = Mid(Suugi, Int(10 * Rnd + 1), 1)
Case 4
StrArray(i) = Mid(Kigou, Int(15 * Rnd + 1), 1)
End Select
If i = 0 Then
Onaji_chk_ok = True
Else
For l = 0 To i - 1
If StrArray(i) = StrArray(l) Then
Onaji_chk_ok = False
Exit For
Else
Onaji_chk_ok = True
End If
Next l
End If
Loop
Next i
Cells(j, 1) = Replace(Join(StrArray), " ", "")
Next j
Sub PASSWORD04() '同じ文字を使っていたらやり直しをする。すべての文字種類を使ってなかったやり直し
Dim Eigi As String: Eigi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim Eigi2 As String: Eigi2 = "abcdefghijklmnopqrstuvwxyz"
Dim Suugi As String: Suugi = "0123456789"
Dim Kigou As String: Kigou = "#$%&<>_+*-/?,."
Dim i As Integer
Dim j As Integer
Dim k As Integer '1-4で、英字・小英字・数字・記号
Dim l As Integer 'パスワード配列のchk用idx
Dim StrArray(5) As String
Dim Onaji_chk_ok As Boolean
Dim Eigi_ari As Boolean
Dim Eigi2_ari As Boolean
Dim Suugi_ari As Boolean
Dim Kigou_ari As Boolean
Range("A1:A10") = ""
For j = 1 To 10
Eigi_ari = False
Eigi2_ari = False
Suugi_ari = False
Kigou_ari = False
Erase StrArray
Do While (Eigi_ari = False Or Eigi2_ari = False Or Suugi_ari = False Or Kigou_ari = False)
Eigi_ari = False
Eigi2_ari = False
Suugi_ari = False
Kigou_ari = False
For i = 0 To 5
Onaji_chk_ok = False
Do While Onaji_chk_ok = False
Randomize
k = Int(4 * Rnd + 1)
Randomize
Select Case k
Case 1
Eigi_ari = True
StrArray(i) = Mid(Eigi, Int(26 * Rnd + 1), 1)
Case 2
Eigi2_ari = True
StrArray(i) = Mid(Eigi2, Int(26 * Rnd + 1), 1)
Case 3
Suugi_ari = True
StrArray(i) = Mid(Suugi, Int(10 * Rnd + 1), 1)
Case 4
Kigou_ari = True
StrArray(i) = Mid(Kigou, Int(14 * Rnd + 1), 1)
End Select
If i = 0 Then
Onaji_chk_ok = True
Else
For l = 0 To i - 1
If StrArray(i) = StrArray(l) Then
Onaji_chk_ok = False
Exit For
Else
Onaji_chk_ok = True
End If
Next l
End If
Loop
Next i
Cells(j, 1) = Replace(Join(StrArray), " ", "")
Loop
Next j
Option Explicit
Sub test()
Dim i As Integer
For i = 1 To 100
Cells(i, 1) = pass(6, False)
Next i
For i = 1 To 100
Cells(i, 2) = pass(10, False, False, False, False)
Next i
End Sub