みなさん、こんにちはケンケンです。
エクセルを使ってパスワード管理をする方法をご紹介しています。
前回は、VBAを使って複数のファイルにパスワードを設定する方法を勉強しました。
今回は、VBAで乱数を発生させてパスワードを作成する方法をご紹介します。
RAND関数の欠点
以前にRAND関数をご紹介しました。
個人的にはこの関数には欠点があると思っています。
それは、何かあるごとに関数が再計算されてしまう、ということです。
これを止めるために、自動計算の設定を変えるか、計算結果をコピペするなどの対応が必要でした。
使い勝手が悪かったのです。
しかし、VBAで関数を使うと、一度処理したものは勝手に再計算しないのでコードに起こしておく方が楽だと思います。
その点も踏まえて乱数を発生させるときはVBAで処理することをおススメします。
VBAでRnd関数を使ってみよう
それでは、VBAで乱数を発生させパスワードを生成してみましょう。
VBAではRnd関数を使います。
Rnd()
0以上1未満の乱数を発生させます。
「Int((最大値ー最小値+1)*Rnd+最小値)」で最大値と最小値の間で乱数を発生されることができます。
コードを書く前に乱数を書き出すシートを以下のようにします。A列の2行目から10行目まで書き出します。
これを前提にコードを書きます。
VBEを起動(Alt+F11)し、標準モジュールに記述しましょう。
Sub save_pass4() Dim cnt Randomize '① For cnt = 2 To 10 '② Range("A" & cnt).Value = Rnd Next End Sub
コードの解説をします。
①Randomizeステートメントと言います。
乱数系列を初期化するおまじないです。Rnd関数を使うときはセットで覚えてしまいましょう。
②シートの2~10行目に書き出すために変数cntを使いForNext構文で繰り返し処理をします。
Rnd関数で生じた乱数をA列に書き出します。
実行してみましょう。
RANDBETWEEN関数を使ってみよう
Rnd関数で乱数を書き出すことができたので、今度はRANDBETWEEN関数を使って乱数を書き出してみましょう。
RANDBETWEEN関数はワークシート関数なので、関数を使う際にWorksheetFunctionを使います。
これもおなじないのようなものですね。
RANDBETWEEN(最小値, 最大値)
最小値から最大値の間の乱数を発生させます。
それではこの関数を使って、先ほどのシートのB列に1~9999までの数値で乱数を書き出すコードを書きます。
Sub save_pass5() Dim cnt For cnt = 2 To 10 Range("B" & cnt).Value = WorksheetFunction.RandBetween(1, 9999) Next End Sub
実行し以下のようになれば成功です。
VBAで8桁のパスワードを作ってみよう
今回のメインである8桁のパスワードを作ってみましょう。
以前に8桁のパスワードを作ったときのデータを使います。
シートの構造は以下のようにします。
- A1セルに英数字の文字列を入力します。
- A2セルに「=LEN(A1)」と数式を入力しA1の文字数を数えておきます。
- シート名を「計算元」とします。
先ほどのシートにも名前を付けます。シート名は「計算結果」としました。
まずは一文字書き出してみよう
8桁のパスワードを作る前に、まずは一文字乱数を発生させて書き出してみましょう。
計算元シートのA1の文字列から一文字ランダムに抽出し、計算結果シートのC2セルに書き出します。
Sub save_pass6() Sheets("計算結果").Range("C2").Value = Mid(Sheets("計算元").Range("A1").Value, WorksheetFunction.RandBetween(1, Sheets("計算元").Range("A2").Value), 1) End Sub
RandBetween関数で1~62の内ランダムで数字を抽出し、Mid関数で先ほど抽出した数字番目を1文字書き出します。
言葉にするとややこしいですが、コードをじっくり見て理解してください。
なお、Mid関数との組み合わせ方法は過去の記事を参考にしてください。
実行し成功すると以下のように書き出されます。
8桁のパスワードを一つ作ってみよう
一文字書き出せたら今度は、8桁になるようにコードを修正します。
Sub save_pass6() Dim cnt 'パスワード生成用カウント Dim pass '1文字格納用 Dim pass8 '8文字格納用 For cnt = 1 To 8 'パスワード8桁準備用 pass = Mid(Sheets("計算元").Range("A1").Value, WorksheetFunction.RandBetween(1, Sheets("計算元").Range("A2").Value), 1) pass8 = pass8 + pass Next Sheets("計算結果").Range("C2").Value = pass8 End Sub
急に長くなりましたが、ひとつずつ説明します。
まず、変数を3つ用意しました。
- cntは繰り返し構文を使う際に使うカウント変数です。今回は8回繰り返すので1から8までを指定します。
- passはMid関数で抜き出した1文字を格納する変数です。
- pass8は変数passに格納された文字をつなぎ合わせるための変数です。
次に、ForNext構文ですが、
- Mid関数で抜き出した一文字を変数passに格納し
- さらに変数pass8に入っている文字列と変数passに入っている文字列をつなぎ合わせたものを
- 変数pass8に再度代入し、その処理を8回繰り返します。
これで8桁のパスワードが変数pass8に格納されることになります。
最後にpass8をシートに書き出すことでパスワード生成が完了します。
それでは実行してみましょう。
8桁のパスワードを複数作成してみよう
今度は、8桁のパスワードを複数作成します。
先ほどのコードを一つの塊として考えて、それをさらに繰り返せばよいですね。
コードを以下のように修正してみましょう。
Sub save_pass8() Dim cnt 'パスワード生成用カウント Dim pass '1文字格納用 Dim pass8 '8文字格納用 Dim cnt8 'シート書き出し用カウント'① For cnt8 = 2 To 10 For cnt = 1 To 8 pass = Mid(Sheets("計算元").Range("A1").Value, WorksheetFunction.RandBetween(1, Sheets("計算元").Range("A2").Value), 1) pass8 = pass8 + pass Next Sheets("計算結果").Range("C" & cnt8).Value = pass8'② pass8 = ""'③ Next End Sub
①追加したのは、シート書き出し用の変数cnt8を用意したところです。
この変数を使ってForNext構文で回します。
②計算結果シートの2~10行目に書き出します。
③ここで、ひとつテクニックを使っていて「pass8=””」で変数を初期化しています。
こうしないと変数pass8にどんどん文字列が格納されてしまい、うまくいきません。
この部分を削除するとどうなるかはご自分で試してみてください。
それでは、実行します。
上記のような結果がでれば成功です。
まとめ
いかがでしたか。
今回は、VBAを使って8桁のパスワードを生成するまでできました。
次回は、ファイル作成とパスワード設定を同時に行えるようにしてシステムを完成させます。
お楽しみに。それではまた次回お会いしましょう。
【記事一覧】エクセルでパスワード管理を徹底する方法
RANDBETWEEN関数を使ってパスワードを作る方法【エクセル関数】
VBAで複数のファイルを作成しそのファイルにパスワードを設定する方法
エクセルVBAでRANDBETWEEN関数を使って8桁のパスワードを複数設定する方法
エクセルVBAでファイル作成とパスワード設定を同時に行う方法