Excel VBA(マクロ)で特殊記号入りのパスワードをランダムに自動生成する方法

keyboard IT

VBAで簡易的なパスワードを自動生成する機能の作り方およびコピペです。バリデーション等は省略。

スポンサーリンク

成果物

vba pw
指定文字数のうち1文字を記号、1文字を数字、残りはアルファベット(大文字・小文字ランダム)にし、くっつけたものを出力します。
' vba
Option Base 1
Sub macro1()

'乱数準備
Randomize

'パスワードの長さ(変更可)
Dim pw As Integer
pw = 8

'パスワードの各文字を入れる配列(pwより長いこと)
Dim pwa(100) As String

'rndA:アルファベットにする文字コード番号
'Chr(rndA)で文字コードが返る
'i:パスワードの何文字目か
'pwa(i)で何文字目か指定できる
Dim rndA As Integer
Dim i As Integer

For i = 1 To pw
    '文字コード65~122(アルファベット)
    rndA = Int(58 * Rnd + 65)
        '91~96はやり直し
        Do While rndA >= 91 And rndA <= 96
        rndA = Int(58 * Rnd + 65)
        Loop
    pwa(i) = Chr(rndA)
    '仮に書き出し(削除可)
    Cells(i, 1).Value = pwa(i)
Next

'j:特殊記号 k:数字 が何文字目か
Dim j As Integer
Dim k As Integer
'乱数生成
j = Int(pw * Rnd + 1)
k = Int(pw * Rnd + 1)

'値が同じ場合やり直し
Do While j = k
k = Int(8 * Rnd + 1)
Loop

'文字コード48~57(数字)
pwa(k) = Chr(Int(10 * Rnd + 48))

Dim l As Integer: l = Int(4 * Rnd + 1)
Select Case l
    '文字コード33~47(記号)
    Case 1
        pwa(j) = Chr(Int(15 * Rnd + 33))
    '文字コード58~64(記号)
    Case 2
        pwa(j) = Chr(Int(7 * Rnd + 58))
    '文字コード91~96(記号)
    Case 3
        pwa(j) = Chr(Int(6 * Rnd + 91))
    '文字コード123~126(記号)
    Case Else
        pwa(j) = Chr(Int(4 * Rnd + 123))
End Select

'仮に書き出し(削除可)
Cells(j, 1).Value = pwa(j)
Cells(k, 1).Value = pwa(k)

'配列結合(出力先適宜変更)
Range("C1").Value = Join(pwa, "")

End Sub

解説

コードの中でわかりづらそうなところだけ簡単に解説します。

設計

excel vba パスワード生成1
割と単純な作り方をしていて、まず指定した文字数分それぞれランダムなアルファベット(大文字・小文字問わず)を求めます。
excel vba パスワード生成2
次にランダムな二文字を数字と特殊記号で上書きし、
excel vba パスワード生成3
その後全部くっつけてます。

パスワードの文字数

excel vba パスワード生成5
コードの冒頭でパスワードの文字数を決めておきます。今回は8文字としました。
パスワード excel1
最終的につなげてパスワードにする各文字を入れるために、配列変数を作っておきます。Option Base 1も配列絡みの記述です。
()には適当な整数を入れておけばいいんですが、pwより大きな数字にしないとエラーになります。

乱数について

excel vba パスワード生成6
1~pwの間の数字が欲しい場合だと、Int(pw * Rnd + 1)という記述になります。
最後の数字が最低値、最低値⁺最初の数字が最大値となります。
excel vba パスワード生成7
そういうわけで65~122を求める場合、Int(58 * Rnd + 65)という式を記述しています。

文字コードの取得

' vba
'文字コード確認用仮コード
For i = 10 To 200
Cells(i, 1).Value = Chr(i)
Next
記号と数字、アルファベットそれぞれの値を求める方法ですが、Shift_JISで文字コードを求めるChr関数を使っています。引数によって戻す文字が変わるので、引数を乱数で決めることでランダムな文字列を得ることができます。
このコードを実行すると、
パスワード excel2
記号であれば33~47、58~64、91~96、123~126あたり、数字なら48~57を取得すればよさそうです(なお、Shift_JIS 文字コードで検索しても同様の情報が得られます)。
同様に、全角英字は65~90、半角英字は97~122で求められます。
' vba
'文字コード48~57(数字)
pwa(k) = Chr(Int(10 * Rnd + 48))
数字のほうはシンプルですが、
excel vba パスワード生成8
記号は最初に候補を4分割して、そこからさらに乱数で範囲内の数字をランダムに求めるので、ちょっと長くなります。
わかりやすさ優先でざっくり分割してますが、ちゃんと確率調整したければlで求める乱数の幅を大きくして、Select Caseの条件を候補の文字数に合わせるなどすれば可能です。

パスワードを大量生成

excel vba パスワード生成9
パスワードをまとめて作るバージョンも載せておきます。元のコードの一番最後のこれを、
excel vba パスワード生成10
繰り返し実行する形にし、
excel vba パスワード生成11
上半分を切り取って、
excel vba パスワード生成12
この位置に貼り付けることで、以下のコードが100回繰り返されます。
excel vba パスワード生成13
二か所の「仮に書き出し」を削除すれば、
excel vba パスワード生成14
A列に100個パスワードを作るコードになります。
' vba
Option Base 1
Sub macro1()

'乱数準備
Randomize

'パスワードの長さ(変更可)
Dim pw As Integer
pw = 8

'パスワードの各文字を入れる配列(pwより長いこと)
Dim pwa(100) As String

'rndA:アルファベットにする文字コード番号
'Chr(rndA)で文字コードが返る
'i:パスワードの何文字目か
'pwa(i)で何文字目か指定できる
Dim rndA As Integer
Dim i As Integer

'配列結合(A列に100回出力)
Dim m As Integer
For m = 1 To 100

For i = 1 To pw
    '文字コード65~122(アルファベット)
    rndA = Int(58 * Rnd + 65)
        '91~96はやり直し
        Do While rndA >= 91 And rndA <= 96
        rndA = Int(58 * Rnd + 65)
        Loop
    pwa(i) = Chr(rndA)

Next

'j:特殊記号 k:数字 が何文字目か
Dim j As Integer
Dim k As Integer
'乱数生成
j = Int(pw * Rnd + 1)
k = Int(pw * Rnd + 1)

'値が同じ場合やり直し
Do While j = k
k = Int(8 * Rnd + 1)
Loop

'文字コード48~57(数字)
pwa(k) = Chr(Int(10 * Rnd + 48))

Dim l As Integer: l = Int(4 * Rnd + 1)
Select Case l
    '文字コード33~47(記号)
    Case 1
        pwa(j) = Chr(Int(15 * Rnd + 33))
    '文字コード58~64(記号)
    Case 2
        pwa(j) = Chr(Int(7 * Rnd + 58))
    '文字コード91~96(記号)
    Case 3
        pwa(j) = Chr(Int(6 * Rnd + 91))
    '文字コード123~126(記号)
    Case Else
        pwa(j) = Chr(Int(4 * Rnd + 123))
End Select

Cells(m, 1).Value = Join(pwa, "")
Next

End Sub
Excel(エクセル):ランダム、乱数
Excelの乱数、ランダム関連操作、関数等まとめです。 乱数の作成 関数で乱数を求める場合、Rand関数(0~1の乱数)またはRandBetween関数(指定範囲の整数)を用います。 もしビンゴで使うような重複...

コメント