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 StringDim pool As String, i As Long, result As StringIf 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 FunctionRandomizeFor i = 1 To lengthresult = result & Mid(pool, Int(Rnd * Len(pool)) + 1, 1)Next iMakePassword = resultEnd 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にして英数字のみで生成するか、プールの記号文字列を対象サービスが許可する範囲に書き換えてください。