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

keyboard IT

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

スポンサーリンク

成果物

指定文字数のうち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 '仮に書き出し(削除可)
    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

解説

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

設計

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

パスワードの文字数

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

乱数について

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

文字コードの取得

' vba
'文字コード確認用仮コード
For i = 10 To 200
Cells(i, 1).Value = Chr(i)
Next
記号と数字、アルファベットそれぞれの値を求める方法ですが、Shift_JISで文字コードを求めるChr関数を使っています。引数によって戻す文字が変わるので、引数を乱数で決めることでランダムな文字列を得ることができます。
このコードを実行すると、
記号であれば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))
数字のほうはシンプルですが、
記号は最初に候補を4分割して、そこからさらに乱数で範囲内の数字をランダムに求めるので、ちょっと長くなります。
わかりやすさ優先でざっくり分割してますが、ちゃんと確率調整したければlで求める乱数の幅を大きくして、Select Caseの条件を候補の文字数に合わせるなどすれば可能です。

パスワードを大量生成

パスワードをまとめて作るバージョンも載せておきます。元のコードの一番最後のこれを、
繰り返し実行する形にし、
上半分を切り取って、
この位置に貼り付けることで、以下のコードが100回繰り返されます。
二か所の「仮に書き出し」を削除すれば、
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 '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関数(指定範囲の整数)を用います。 もしビンゴで使うような重複...

コメント

モバイルバージョンを終了