Excel VBAマクロでパスワードを自動生成する方法

Excelのexcel パスワード生成 マクロは、文字プール(使う文字の一覧)から乱数で1文字ずつ選び、指定した桁数になるまで連結するという単純な仕組みで作れます。VBAのRnd関数とMid関数を組み合わせれば、桁数や英大文字・小文字・数字・記号といった文字種をパラメータで切り替えられる汎用的なパスワード生成マクロが完成します。この記事では、その基本構造をコード付きで順を追って解説します。

マクロでパスワードを生成する基本の考え方

パスワード生成の中核は、たった3つの動作に分解できます。まず使ってよい文字を1本の文字列(文字プール)にまとめ、次にその長さの範囲でランダムな位置を選び、最後にその位置の1文字を取り出して結果へ足していく、という流れです。これを希望の桁数だけ繰り返せば1つのパスワードが出来上がります。この考え方は言語を問わず共通で、より詳しい理論はパスワード生成アルゴリズムの解説で扱っています。

  • 文字プール: 選択対象となる全文字を並べた文字列。
  • 乱数: プール内の位置を無作為に決める。
  • 連結: 選んだ文字を桁数分つなげて完成。

文字プールを組み立てる

VBAでは文字種ごとに定数を用意し、必要なものだけを連結してプールを作ると管理が楽になります。英大文字26字、英小文字26字、数字10字を基本とし、記号を任意で追加します。フラグ引数で文字種のオン・オフを切り替えられるようにしておくと、用途に応じて強度を調整できます。

  • 英大文字: ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • 英小文字: abcdefghijklmnopqrstuvwxyz
  • 数字: 0123456789
  • 記号(例): !@#$%^&*()-_=+

プールが空にならないよう、少なくとも1種類は必ず選ばれる状態にしておくとエラーを防げます。

excel パスワード生成 マクロの実装コード

次のコードは、桁数と文字種を引数で受け取る関数です。Randomizeで乱数の種を初期化し、Int(Rnd * Len(pool)) + 1で1からプール長までの整数を得て、Midでその位置の1文字を取り出しています。

  • Function MakePassword(ByVal length As Long, ByVal useUpper As Boolean, ByVal useLower As Boolean, ByVal useDigit As Boolean, ByVal useSymbol As Boolean) As String
  •   Dim pool As String, i As Long, result As String
  •   If useUpper Then pool = pool & "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  •   If useLower Then pool = pool & "abcdefghijklmnopqrstuvwxyz"
  •   If useDigit Then pool = pool & "0123456789"
  •   If useSymbol Then pool = pool & "!@#$%^&*()-_=+"
  •   If Len(pool) = 0 Then MakePassword = "": Exit Function
  •   Randomize
  •   For i = 1 To length
  •     result = result & Mid(pool, Int(Rnd * Len(pool)) + 1, 1)
  •   Next i
  •   MakePassword = result
  • End Function

この関数は、たとえば=MakePassword(12, TRUE, TRUE, TRUE, FALSE)のようにセルから呼び出せば、12桁の英数字パスワードを返します。桁数を変えるだけで長さを自由に調整できます。

各文字種を最低1文字含める工夫

単純な方式では、たまたま数字が1つも入らないパスワードが生成されることがあります。「英大・小・数字を必ず各1文字含める」といった要件がある場合は、選択した各文字種から先に1文字ずつ確保し、残りの桁をプール全体から埋め、最後に順序をシャッフルします。要件を満たしつつ偏りを避けられます。ワークシート関数だけで似た処理を行う方法はExcel関数でパスワードを作る記事で紹介しています。

安全に使うための注意点

VBAのRndは擬似乱数であり、暗号学的な強度が求められる用途(サーバーの秘密鍵など)には向きません。日常的なアカウント用パスワードであれば十分ですが、より高い強度が必要なら専用の乱数源を検討してください。また、生成したパスワードをExcelファイルに保存したまま共有しないこと、桁数は最低でも12桁以上を目安にすることが安全のポイントです。ブラウザ上で手早く作りたい場合は当サイトのパスワード生成ツールも利用できます。

  • 桁数は12桁以上を推奨。
  • 複数の文字種を組み合わせて強度を高める。
  • 生成後のパスワードは平文で保存・共有しない。

よくある質問

MakePassword関数はどのセルからでも呼び出せますか?

はい。標準モジュールに関数を貼り付ければ、ワークシートのセルに=MakePassword(12, TRUE, TRUE, TRUE, FALSE)のように入力してユーザー定義関数として呼び出せます。ボタンのクリックイベントから呼ぶことも可能です。

毎回同じパスワードが出てしまうのはなぜですか?

乱数の種が初期化されていない可能性があります。生成ループの前にRandomizeを必ず実行してください。これにより時刻を種として毎回異なる結果が得られます。

記号を含めるとログインで弾かれることがあります。どうすればよいですか?

サービスによって使える記号が異なるため、useSymbolをFALSEにして英数字のみで生成するか、プールの記号文字列を対象サービスが許可する範囲に書き換えてください。

執筆者について

山本 由紀 — セキュリティ編集者

パスワード生成ツールを管理し、パスワード安全性のガイドを最新の推奨事項に沿って確認しています。

editor@xn--zck6aw5jtct103b141a.com

ツールを使う すべての記事