小文字のアルファベットと 0 から 9 の数字を組合わせて ランダムパスワード を返す関数を作ってみました。やっぱりパスワードはランダムなほうが安全ですね。
え? こばとがどんなパスワード使ってるかって?
それはもちろん “kobato_chan” ですよ!
… 冗談に決まってるでしょ。
だって、こばと、バカじゃないし。
【VBA】ランダムパスワード
まず簡単にマクロの構造を説明しておきます。アルファベットは全部で 26 文字、0 から 9 の数字は全部で 10 文字なので、その比率は 26:10 つまり 13:5 となります。ですから、まず最初に 1 ~ 18 の乱数を発生させます。その数字によって次のように処理を分枝させます。
[1 ~ 5 の数字が出た場合]
0 ~ 9 の乱数を発生させてパスワードの文字列に加えます。
[6 ~ 18 の数字が出た場合]
97~122の乱数を発生させて、Chr 関数で対応するアルファベットに変換してパスワードの文字列に加えます。
以上の処理を指定文字数ぶんだけ繰り返しますよ。
'[VBA] ランダムパスワード生成関数 Function PASSWORD(n As Integer) Dim i As Integer Dim rd0 As Integer Dim rd1 As Integer Dim rd2 As Integer Dim myword As String Randomize For i = 1 To n '1~18の乱数を発生させます rd0 = Int(RND * 18 + 1) Select Case rd0 Case 1 To 5 '0~9の乱数を発生させます rd1 = Int(RND * 10) myword = myword & rd1 Case Else '97~122の乱数を発生させます rd2 = Int(RND * 26 + 97) '乱数に対応したアルファベットを加えます myword = myword & Chr(rd2) End Select Next i PASSWORD = myword End Function
PASSWORD()関数を使うときはパスワードの文字数を引数に指定して
=PASSWORD(文字数)
と入力してください。たとえば
=PASSWORD(8)
と入力すると “m1shtro3” みたいな 8 文字のランダムパスワードが返ってきます。今回のポイントとなるコードは
myword = myword & Chr(rd2)
という部分です。変数 rd2 には 97 ~ 122 の数字が入っていますが、Chr関数 でそれぞれの数字に対応する a ~ z のアルファベットに変換してパスワードの文字列に加えているのです。
コメント
こちらやってみたのですが、時々英字だけのパスワードができてしまいます。
必ず英数字というのは難しいのでしょうか?
記事にあるように、PASSWORD 関数はそれぞれのアルファベットと数字が等しい確率で出現するように設定されています。数字が 10 種類に対して、アルファベットは 26 種類あるので、どうしてもアルファベットのほうが高い確率で出現します(比率は 5:13)。これはコードの Select Case 構文の
Case 1 To 5
という部分で設定されているので、これを
Case 1 To 9
とすれば、パスワードの各桁でアルファベットと数字が半々の確率で出現することになります。もちろん、ランダムなので、すべての桁が数字になることも、すべての桁が英字になる可能性も 0 ではありませんが、たとえば 8 桁のパスワードであれば、その確率は 1/256 です。
各桁で数字の出る確率 p を指定するようにすれば、汎用性の高い関数となります。以下はその一例です。
◆◆◆◆◆◆◆◆◆◆
Function RANDOM_NUMBER()
Randomize
RANDOM_NUMBER = Int(Rnd * 10)
End Function
Function RANDOM_ALPHABET()
Dim rd As Long
Randomize
rd = Int(Rnd * 26 + 97)
RANDOM_ALPHABET = Chr(rd)
End Function
Function PASSWORD_2(n As Long, p As Double)
Dim i As Integer
Dim rd As Double
Dim myword As String
For i = 1 To n
Randomize
rd = Rnd
If rd < p Then
myword = myword & RANDOM_NUMBER()
Else
myword = myword & RANDOM_ALPHABET()
End If
Next i
PASSWORD_2 = myword
End Function
◆◆◆◆◆◆◆◆◆◆
PASSWORD_2 関数の第1引数にはパスワードの桁数を、第2引数には各桁で数字の出る確率を小数で指定してください(たとえば、75 % の確率に設定したいときは 0.75 とします)。ワークシートに関数を入力して試してみてください。
【ChatGPT】VBAのパスワード関数
ChatGPT にパスワード関数を生成してもらいました。