指定した桁数でパスワードをランダム自動生成「passwordGet」の解説
前回の「郵便番号をランダムで自動取得」で郵便番号を自動取得しましたが、今回はパスワードをランダム自動生成する方法について解説します。こちらも何かしらのアカウントを新規作成する場合などで利用されることが多いので、非常に便利なプログラムです。
目次
- 指定した桁数でパスワードをランダム自動生成する処理の流れ
- 利用する関数・サブルーチンについて
- 指定した桁数でパスワードをランダム自動生成するサンプルコード
- パスワードをランダム自動生成するサブルーチン「passwordGet」の解説
- 「passwordGet」を利用してランダムでパスワードを自動生成するサンプルコード
- まとめ
指定した桁数でパスワードをランダム自動生成する処理の流れ
以下が今回の処理の流れになります。
- ①変数宣言
- ②「For~Nextステートメント」を利用して、指定した桁数回ループ処理
- ③「makeRndInt」を利用して、0~9の数字をランダム抽出し文字結合
- ④Chr 関数とRnd関数を利用して、a~zの英字をランダム抽出し文字結合
利用する関数・サブルーチンについて
今回利用するサブルーチンは以下になります。- Chr関数とは
- Int関数とは
- Rnd関数とは
- Randomizeステートメントとは
- makeRndIntとは
Chr関数とは
Chr関数は指定したASCIIコードに対応する文字列を返す関数です。
※ASCIIコードの0~31の範囲の文字は表示できません。
構文 | Chr(num) | ||||
---|---|---|---|---|---|
引数 | 省略 | 説明 | |||
Num | ● | ASCIIコード。 |
Int関数とは
Int関数は小数点以下を切り捨てて整数にする関数です。
※マイナス値の場合は、小さいほうに丸めます。(Int(-10.52) → -11
構文 | Int(Num) | ||||
---|---|---|---|---|---|
引数 | 省略 | 説明 | |||
Num | ● | 倍精度浮動小数点数型の数値または任意の数式。 |
Rnd関数とは
Rnd関数は0以上1未満の乱数を発生させる関数です。戻り値は、単精度浮動小数点数型 (Single) の乱数を返します。また、引数Numberによって、どのような乱数を返すかを指定することもできます。
構文 | Rnd[(Number)] | ||||
---|---|---|---|---|---|
引数 | 省略 | 説明 | |||
Number | ● | 乱数作成方法の指定。 number < 0 ・・・常に、Number のシード値によって決まる同じ数値を返します。 number > 0 ・・・乱数系列の次の乱数を返します。 number = 0 ・・・直前に生成した乱数を返します。 省略した場合 ・・・乱数系列の次の乱数を返します。 |
Randomizeステートメントとは
Randomizeステートメントは乱数ジェネレータを初期化 (乱数系列を再設定) します。Randomizeステートメントを使用しない場合、引数を指定しないでRnd関数を呼び出すと、最初にRnd 関数を呼び出したときのシード値(乱数ジェネレータの状態変数)と同じ値が使用されてしまいます。それ以降も直前に生成された数がシード値として使用されますので、Rnd関数を利用する場合は、必ず初期化させます。
構文 | Randomize[number] | ||||
---|---|---|---|---|---|
引数 | 省略 | 説明 | |||
Number | ● | Rnd関数で使用される乱数のシード値を設定。 |
makeRndIntとは
makeRndIntは指定した範囲でランダム(乱数)の整数を取得するマクロです。こちらは戻り値が必要ですので、functionプロシージャで対応しています。引数には取得する整数の「最小値」「最大値」の2つが設定されています。以下が引数の詳細になります。
構文 | makeRndInt(minInt, maxInt) | ||||
---|---|---|---|---|---|
引数名 | データ型 | 内容 | 値の事例 | 初期値 | 省略 |
minInt | Integer | 取得する整数の最小値 | 0 | × | |
maxInt | Integer | 取得する整数の最大値 | 100 | × |
「minInt」「maxInt」は必須項目です。「minInt」には取得する整数の最小値を設定します。「maxInt」には取得する整数の最大値を設定します。
指定した桁数でパスワードをランダム自動生成するサンプルコード
今回のサンプルコードは指定した桁数で数字のみ・英字のみのパスワードを自動生成するマクロになります。
Sub sample()
Dim str1 As String, str2 As String
For i = 1 To 5
'乱数ジェネレータを初期化
Randomize
'数字(0~9)のみ
str1 = str1 & makeRndInt(0, 9)
'英字(a~z:ASCII文字コード)のみ
str2 = str2 & Chr(Int(Rnd * 26) + 97)
Next i
Debug.Print "数字のみのパスワード:" & str1
Debug.Print "英字のみのパスワード:" & str2
End Sub
ASCII文字コード表
10進 | 16進 | 文字 | 10進 | 16進 | 文字 | 10進 | 16進 | 文字 | 10進 | 16進 | 文字 |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | NUL | 32 | 20 | SP | 64 | 40 | @ | 96 | 60 | ` |
1 | 1 | SOH | 33 | 21 | ! | 65 | 41 | A | 97 | 61 | a |
2 | 2 | STX | 34 | 22 | " | 66 | 42 | B | 98 | 62 | b |
3 | 3 | ETX | 35 | 23 | # | 67 | 43 | C | 99 | 63 | c |
4 | 4 | EOT | 36 | 24 | $ | 68 | 44 | D | 100 | 64 | d |
5 | 5 | ENQ | 37 | 25 | % | 69 | 45 | E | 101 | 65 | e |
6 | 6 | ACK | 38 | 26 | & | 70 | 46 | F | 102 | 66 | f |
7 | 7 | BEL | 39 | 27 | ' | 71 | 47 | G | 103 | 67 | g |
8 | 8 | BS | 40 | 28 | ( | 72 | 48 | H | 104 | 68 | h |
9 | 9 | HT | 41 | 29 | ) | 73 | 49 | I | 105 | 69 | i |
10 | 0a | LF | 42 | 2a | * | 74 | 4a | J | 106 | 6a | j |
11 | 0b | VT | 43 | 2b | + | 75 | 4b | K | 107 | 6b | k |
12 | 0c | FF | 44 | 2c | , | 76 | 4c | L | 108 | 6c | l |
13 | 0d | CR | 45 | 2d | - | 77 | 4d | M | 109 | 6d | m |
14 | 0e | SO | 46 | 2e | . | 78 | 4e | N | 110 | 6e | n |
15 | 0f | SI | 47 | 2f | / | 79 | 4f | O | 111 | 6f | o |
16 | 10 | DLE | 48 | 30 | 0 | 80 | 50 | P | 112 | 70 | p |
17 | 11 | DC1 | 49 | 31 | 1 | 81 | 51 | Q | 113 | 71 | q |
18 | 12 | DC2 | 50 | 32 | 2 | 82 | 52 | R | 114 | 72 | r |
19 | 13 | DC3 | 51 | 33 | 3 | 83 | 53 | S | 115 | 73 | s |
20 | 14 | DC4 | 52 | 34 | 4 | 84 | 54 | T | 116 | 74 | t |
21 | 15 | NAK | 53 | 35 | 5 | 85 | 55 | U | 117 | 75 | u |
22 | 16 | SYN | 54 | 36 | 6 | 86 | 56 | V | 118 | 76 | v |
23 | 17 | ETB | 55 | 37 | 7 | 87 | 57 | W | 119 | 77 | w |
24 | 18 | CAN | 56 | 38 | 8 | 88 | 58 | X | 120 | 78 | x |
25 | 19 | EM | 57 | 39 | 9 | 89 | 59 | Y | 121 | 79 | y |
26 | 1a | SUB | 58 | 3a | : | 90 | 5a | Z | 122 | 7a | z |
27 | 1b | ESC | 59 | 3b | ; | 91 | 5b | [ | 123 | 7b | { |
28 | 1c | FS | 60 | 3c | <</td> | 92 | 5c | \\ | 124 | 7c | | |
29 | 1d | GS | 61 | 3d | = | 93 | 5d | ] | 125 | 7d | } |
30 | 1e | RS | 62 | 3e | 94 | 5e | ^ | 126 | 7e | ~ | |
31 | 1f | US | 63 | 3f | ? | 95 | 5f | _ | 127 | 7f | DEL |
実行結果
ランダムで数字のみ・英字のみのパスワードが生成される。
数字のみのパスワード:91545
英字のみのパスワード:rwfmw
解説
Dim str1 As String, str2 As String
型をを宣言します。
For i = 1 To 5
(省略)
Next
For~Nextステートメントを利用して、5桁のパスワードを生成するためにループ処理をしています。
'乱数ジェネレータを初期化
Randomize
Randomizeステートメントを利用して、乱数をする際に乱数ジェネレータを初期化させます。
'数字(0~9)のみ
str1 = str1 & makeRndInt(0, 9)
makeRndIntを利用して、0~9の中から1文字ランダムで数字を抽出します。また、ループ処理をさせているので、5回数字を結合します。
'英字(a~z:ASCII文字コード)のみ
str2 = str2 & Chr(Int(Rnd * 26) + 97)
Chr関数・Int関数・Rnd関数を利用して、a~z9の中から1文字ランダムで英字を抽出します。Int(Rnd * 26) + 97は、ASCII文字コードの97が英字の小文字「a」で英字は26文字あるので、97~122のASCII文字コードの中からランダムで1文字抽出しています。また、ループ処理をさせているので、5回英字を結合します。
Debug.Print "数字のみのパスワード:" & str1
Debug.Print "英字のみのパスワード:" & str2
数字のみ・英字のみのパスワードをそれぞれ抽出しています。ここでは、数字のみ・英字のみで指定した桁数でランダム生成しましたが、中には英数字を混ぜてパスワードを作成する場合もあります。今度は、こちらも踏まえたサブルーチンを作成していきましょう。
パスワードをランダム自動生成するサブルーチン「passwordGet」の解説
Function passwordGet(cnt As Integer, Optional chrType As String) As String
Dim i As Integer, n As Integer
For i = 1 To cnt
n = makeRndInt(1, 2)
'乱数ジェネレータを初期化
Randomize
If chrType = "0-9" Then
'数字(0~9)
passwordGet = passwordGet & makeRndInt(0, 9)
ElseIf n = 1 Or chrType = "a-z" Then
'英字(a~z:ASCII文字コード)
passwordGet = passwordGet & Chr(Int(Rnd * 26) + 97)
Else
'数字(0~9)
passwordGet = passwordGet & makeRndInt(0, 9)
End If
Next i
End Function
こちらが「指定した桁数のパスワードをランダム自動生成するサブルーチン」になります。こちらは戻り値が必要ですので、functionプロシージャで対応しています。引数には「パスワード桁数」「パスワードタイプ」の2つが設定されています。以下が引数の詳細になります。
構文 | passwordGet(cnt, [chrType]) | ||||
---|---|---|---|---|---|
引数名 | データ型 | 内容 | 値の事例 | 初期値 | 省略 |
cnt | Integer | パスワード桁数 | 5,8,10 | × | |
chrType | String | パスワードタイプ | "0-9"・・・数字のみ, "a-z"・・・英字のみ | ● |
「cnt」は必須項目です。「cnt」には、パスワードの桁数を設定します。「chrType」には、パスワードのタイプを設定します。「0-9」を指定した場合は、数字のみのパスワードを、「a-z」を指定した場合は英字のみのパスワードを設定します。また、何も指定しない場合は、英数字混合のパスワードを生成します。
「passwordGet」を利用してランダムでパスワードを自動生成するサンプルコード
Sub sample()
Debug.Print "桁数10桁の英数字パスワード:" & passwordGet(10)
Debug.Print "桁数8桁の数字パスワード:" & passwordGet(8, "0-9")
Debug.Print "桁数5桁の英字パスワード:" & passwordGet(5, "a-z")
End Sub
実行結果
桁数10桁の英数字パスワード:i71p206ml2
桁数8桁の数字パスワード:21358937
桁数5桁の英字パスワード:kwoaz
解説
今回は、3つのパスワードを設定しています。パスワードタイプを設定していない場合は英数字パスワードが自動生成されているのが、分かるかとおもいます。
まとめ
今回は、passwordGetサブルーチンを利用して指定した桁数でパスワードを自動生成する方法について解説しました。パスワードを生成してアカウント作成する場合は、必ずパスワードはエクセルシートに保存するようにしましょう。
次の記事: VBAでIE操作に役立つ指定した桁数で文字列をランダム自動生成 >>
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。