『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】パスワード生成マクロ

小文字のアルファベットと 0 から 9 の数字を組合わせてパスワード生成関数をを作ってみました。やっぱりパスワードはランダムなほうが安全ですね。
 
え? こばとがどんなパスワード使ってるかって?
それはもちろん、”kobatochan” ですよ~…って冗談に決まってるでしょ。

【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 のアルファベットに変換してパスワードの文字列に加えているのです。
 
各桁で数字の出る確率 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 とします)。ワークシートに関数を入力して試してみてください。
 
ついでに、GPT-3.5が書いてもらったパスワード生成関数も以下に載せておきます。

Function GeneratePassword(ByVal length As Integer) As String
    ' 使用可能な文字の定義
    Dim characters As String
    characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+"
    
    ' パスワードを格納する変数
    Dim password As String
    password = ""
    
    ' ランダムなシード値の設定
    Randomize
    
    ' 指定された長さだけ繰り返し、ランダムな文字をパスワードに追加
    For i = 1 To length
        Dim randomIndex As Integer
        randomIndex = Int((Len(characters) * Rnd) + 1)
        password = password & Mid(characters, randomIndex, 1)
    Next i
    
    ' 生成されたパスワードを返す
    GeneratePassword = password
End Function

コメント

  1. 賀山直樹 より:

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

    • あとりえこばと より:

      記事にあるように、PASSWORD 関数はそれぞれのアルファベットと数字が等しい確率で出現するように設定されています。数字が 10 種類に対して、アルファベットは 26 種類あるので、どうしてもアルファベットのほうが高い確率で出現します(比率は 5:13)。これはコードの Select Case 構文の「Case 1 To 5」という部分で設定されているので、これを「Case 1 To 9」とすれば、パスワードの各桁でアルファベットと数字が半々の確率で出現することになります。もちろん、ランダムなので、すべての桁が数字になることも、すべての桁が英字になる可能性も 0 ではありませんが、たとえば 8 桁のパスワードであれば、その確率は 1/256 です。記事の最後にコードを追加しておきましたので、参考にしてください。