【VBA】無作為パスワードを返すユーザー定義関数

 小文字のアルファベットと 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 のアルファベットに変換してパスワードの文字列に加えているのです。

コメント

  1. 賀山直樹 より:

    こちらやってみたのですが、時々英字だけのパスワードができてしまいます。
    必ず英数字というのは難しいのでしょうか?

    • あとりえこばと より:

       記事にあるように、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 とします)。ワークシートに関数を入力して試してみてください。

タイトルとURLをコピーしました