この記事では、ExcelVBAを利用してランダムなパスワードを作成し、その作成したパスワードを管理する機能について説明します。
作成するパスワードは、数字・小文字のアルファベット・大文字のアルファベット・記号からランダムな順番に作成します。
また、数字・アルファベット・記号については好きな種類と利用数を指定可能となっています。
例えば、数字1・2・3から1つをランダムに選び、A・B・C・Dから2つをランダムに選べという指定ができます。
作成したパスワードは、一覧に記録します。
作成日やアプリ・サイト、IDとパスワードをセットで記録します。
それでは、ランダムなパスワード生成とパスワード管理する機能を作成していきましょう。
困っている女性
困っている女性
困っている女性
困っている女性
解決する男性
解決する男性
困っている女性
もくじ
0.今回作成する機能の概要図
今回作成する「ランダムなパスワード生成とパスワード管理」機能の概要図は、以下です。
上記の機能概要図のように、以下10種類の情報を入力します。
- アプリ・サイト名
- ID
- パスワードに使う数字
- パスワードに使う小アルファベット
- パスワードに使う大アルファベット
- パスワードに使う機能
- 数字の個数(パスワードに使う)
- 小アルファベットの個数(パスワードに使う)
- 大アルファベットの個数(パスワードに使う)
- 記号の個数(パスワードに使う)
その入力した情報をもとに、ランダムなパスワードをEXCELシートに出力します。
EXCELシートに以前作成したパスワードも残ったままです。
ですから、複数のパスワードを管理することができます。
それでは、ランダムなパスワードを作成する機能とパスワードを管理する機能について、1つ1つ順番に説明していきます。
1.作成するパスワードを指定する欄と作成したパスワードを管理するシートを準備する
まず、アプリ・サイトやIDを指定する欄、パスワードで利用したい数字やアルファベット、記号を指定する欄を持ったシートを作成します。さらに、作成されたパスワードを管理する欄もそのシートに持たせます。
「メイン」シートを作成する
- 「メイン」という名前のシートを作成します。
- A1セルに「アプリ・サイト」のタイトルを記入します。
- A2セルに「ID」のタイトルを記入します。
- A3セルに「数字」のタイトルを記入します。
- A4セルに「小アルファベット」のタイトルを記入します。
- A5セルに「大アルファベット」のタイトルを記入します。
- A6セルに「記号」のタイトルを記入します。
- B3セルには、パスワードで利用したい数字を重複なく記入します。
- B4セルには、パスワードで利用したい小文字のアルファベットを重複なく記入します。
- B5セルには、パスワードで利用したい大文字のアルファベットを重複なく記入します。
- B6セルには、パスワードで利用したい記号のアルファベットを重複なく記入します。
- C1セルは、「アプリ・サイト」を記入する欄になります。
- C2セルは、「ID」を記入する欄になります。
- C3セルは、「数字」を何個利用したいか記入する欄になります。
- C4セルは、「小文字のアルファベット」を何個利用したいか記入する欄になります。
- C5セルは、「大文字のアルファベット」を何個利用したいか記入する欄になります。
- C6セルは、「記号」を何個利用したいか記入する欄になります。
- 7行目は、生成したパスワードのタイトル行になり、「作成日」、「アプリ・サイト」、「ID」、「パスワード」、「備考」を記入します。
- 8行目以降は、パスワード生成する度に、VBAプログラムが追加していきます。
C3セルに、「1」と入力した場合、B3セルに入力した数字の中からランダムで1つ利用します。
C4・C5・C6セルも同様です。0を指定した場合、利用しません。
C3~C6セルに入力した数字の合計がパスワードの長さになります。
パスワードの長さを8文字にしたい場合、合計が8になるようにC3~C6セルに数字を入力してください。
2.VBAでランダムなパスワードを作成する機能とパスワードを管理する機能を作成する
「Microsoft Visual Basic for Applications」を起動します。
作成したパスワードを「メインシート」に記入する機能をVBAプログラムで記入します。
標準モジュールを追加して、以下のソースを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
Public Sub MainProc() Dim shtMain As Worksheet Dim MaxRow As Integer Dim tmp As String Dim i As Integer Dim varNum As Variant Dim varSaf As Variant Dim varLaf As Variant '1.メインシートを変数に格納する Set shtMain = ThisWorkbook.Sheets("メイン") '2.データ入力されているA列の最終行を取得する MaxRow = shtMain.Cells(shtMain.Rows.Count, 1).End(xlUp).Row tmp = "" '3.3行目から6行目(数字、小アルファベット、大アルファベット、記号)をくり返す For i = 3 To 6 '4.C列の値が空かつ0でない場合、処理を行う If shtMain.Range("C" & i) <> "" And shtMain.Range("C" & i) <> "0" Then '5.B列の文字列とC列の文字数を渡して、ランダムな文字列を生成する tmp = tmp & MakeRandomString(shtMain.Range("B" & i), shtMain.Range("C" & i)) End If Next '6.最終行+1行目のA列に今日の日付をセットする shtMain.Range("A" & MaxRow + 1) = Format(Now, "yyyy/mm/dd") '7.最終行+1行目のB列にアプリ・サイトの値をセットする shtMain.Range("B" & MaxRow + 1) = shtMain.Range("C1") '8.最終行+1行目のC列にIDの値をセットする shtMain.Range("C" & MaxRow + 1) = shtMain.Range("C2") '9.最終行+1行目のD列に上記の3~5で生成した文字列を並べ替えてパスワード生成し、セットする shtMain.Range("D" & MaxRow + 1) = MakeRandomString(tmp, Len(tmp)) MsgBox "完了" End Sub |
次に、ランダムなパスワードを生成する部分のVBAプログラムを記入します。
次に、以下のソースも標準モジュールに書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Private Function MakeRandomString(ByVal str As String, ByVal cnt As Integer) As String Dim i As Integer Dim tmp As String Dim rndNum As Integer '1.乱数系列初期化 Randomize MakeRandomString = "" tmp = "" i = 0 '2.iが指定された文字数(cnt)より小さい間、以降の処理をくり返す Do While i < cnt '3.1から文字数までの間の乱数を生成する(Rnd関数は0以上1未満の範囲) rndNum = Int(Len(str) * Rnd + 1) '4.指定された文字列から乱数の位置の1文字を取得する tmp = Mid(str, rndNum, 1) '5.4で取得した文字がこれまで取得した文字列に含まれていない場合、処理を行う If InStr(MakeRandomString, tmp) = 0 Then '6,重複していない文字をパスワード文字として利用する MakeRandomString = MakeRandomString & tmp i = i + 1 End If Loop End Function |
最後にEXCELを「◯◯◯.xlsm」というような感じでマクロ有効ブック形式で保存します。
3.VBAでランダムなパスワードを作成し、パスワードを管理する機能の使い方
それでは、ランダムなパスワードを作成する準備をします。
C1セル~C6セルに必要な情報を記入します。
どのアプリ・サイト向けのパスワードかわかるように、C1セルにアプリ・サイト名を記入します。
次に、IDをC2セルに記入します。
そして、C3セル~C6セルにパスワードで利用したいそれぞれの個数を記入します。
上記の画像では、数字を3つ、小文字のアルファベットを3つ、大文字のアルファベットを1つ、記号を1つを指定しています。
次に、「開発」タブの「マクロ」をクリックします。
先程作成した「MainProc」を選択し、実行ボタンをクリックします。
しばらく待つと、ランダムなパスワードが最終行に追加されます。
上記の画像では、11行目にDサイトのIDとパスワード、作成日が追加されました。
作成されたランダムなパスワードは、C3セル~C6セルに指定したそれぞれの個数分利用されています。
数字が3つ⇒4、3、9
小文字アルファベットが3つ⇒p、h、a
大文字アルファベットが1つ⇒F
記号が1つ⇒#
4.作成したパスワードをシートに記入するVBAプログラム(MainProc)の説明
それでは、作成したパスワードを「メインシート」の最終行に追加するVBAプログラム(MainProc)を説明します。
1.メインシートを変数に格納する
1 2 |
'1.メインシートを変数に格納する Set shtMain = ThisWorkbook.Sheets("メイン") |
そうすることにより、入力するプログラムを短くすることができるからです。
2.データ入力されているA列の最終行を取得する
1 2 |
'2.データ入力されているA列の最終行を取得する MaxRow = shtMain.Cells(shtMain.Rows.Count, 1).End(xlUp).Row |
それは、次にパスワードを作成したときに、追加する行を知るためです。
3.3行目から6行目(数字、小アルファベット、大アルファベット、記号)をくり返す
1 2 |
'3.3行目から6行目(数字、小アルファベット、大アルファベット、記号)をくり返す For i = 3 To 6 |
4.C列の値が空かつ0でない場合、処理を行う
1 2 |
'4.C列の値が空かつ0でない場合、処理を行う If shtMain.Range("C" & i) <> "" And shtMain.Range("C" & i) <> "0" Then |
つまり、数字や小文字のアルファベットの指定された個数が空白や0出ない場合、以降の処理を行います。
5.B列の文字列とC列の文字数を渡して、ランダムな文字列を生成する
1 2 |
'5.B列の文字列とC列の文字数を渡して、ランダムな文字列を生成する tmp = tmp & MakeRandomString(shtMain.Range("B" & i), shtMain.Range("C" & i)) |
この機能は、B列に指定されている文字列とC列に指定されている文字数を渡すことにより、ランダムに文字を選んでくれます。
例えば、B3セルに指定された数字(1234567890)とC3セルに指定された文字数(3)をこの機能に渡しています。
つまり、数字(1234567890)からランダムに3つ、数字を選んでくれます。
6.最終行+1行目のA列に今日の日付をセットする
1 2 |
'6.最終行+1行目のA列に今日の日付をセットする shtMain.Range("A" & MaxRow + 1) = Format(Now, "yyyy/mm/dd") |
7.最終行+1行目のB列にアプリ・サイトの値をセットする
1 2 |
'7.最終行+1行目のB列にアプリ・サイトの値をセットする shtMain.Range("B" & MaxRow + 1) = shtMain.Range("C1") |
8.最終行+1行目のC列にIDの値をセットする
1 2 |
'8.最終行+1行目のC列にIDの値をセットする shtMain.Range("C" & MaxRow + 1) = shtMain.Range("C2") |
9.最終行+1行目のD列に上記の3~5で生成した文字列を並べ替えてパスワード生成し、セットする
1 2 |
'9.最終行+1行目のD列に上記の3~5で生成した文字列を並べ替えてパスワード生成し、セットする shtMain.Range("D" & MaxRow + 1) = MakeRandomString(tmp, Len(tmp)) |
数字・小文字アルファベット・大文字アルファベット・記号のそれぞれで選ばれた文字をランダムに並び替えをしています。
並び替えた文字を最終的にパスワードとして、メインシートに入力しています。
5.ランダムなパスワードを作成するVBAプログラム(MakeRandomString)の説明
それでは、今回の機能の心臓部分となるランダムなパスワードを作成する「MakeRandomString」について説明します。
1.乱数系列初期化
1 2 |
'1.乱数系列初期化 Randomize |
2.iが指定された文字数(cnt)より小さい間、以降の処理をくり返す
1 2 |
'2.iが指定された文字数(cnt)より小さい間、以降の処理をくり返す Do While i < cnt |
具体的には、この関数に渡された変数「cnt」には、利用したい文字数が入っています。
つまり、数字を3つと指定されていた場合、変数「cnt」には、3が入っています。
3.1から文字数までの間の乱数を生成する(Rnd関数は0以上1未満の範囲)
1 2 |
'3.1から文字数までの間の乱数を生成する(Rnd関数は0以上1未満の範囲) rndNum = Int(Len(str) * Rnd + 1) |
具体的には、文字列に「abcdef」と指定されていた場合、文字数が6なので1~6の間の整数値をランダムに選びます。
つまり、1か2か3か4か5か6がランダムに選ばれます。
4.指定された文字列から乱数の位置の1文字を取得する
1 2 |
'4.指定された文字列から乱数の位置の1文字を取得する tmp = Mid(str, rndNum, 1) |
具体的には、文字列に「abcdef」が指定されており、3がランダムに選ばれた場合、3番めの文字「c」が取得されます。
5.4で取得した文字がこれまで取得した文字列に含まれていない場合、処理を行う
1 2 |
'5.4で取得した文字がこれまで取得した文字列に含まれていない場合、処理を行う If InStr(MakeRandomString, tmp) = 0 Then |
含まれていない場合、以降の処理を行います。
つまり、同じ文字を2回以上選ばないようにしています。
6,重複していない文字をパスワード文字として利用する
1 2 3 |
'6,重複していない文字をパスワード文字として利用する MakeRandomString = MakeRandomString & tmp i = i + 1 |
1文字選ばれたので、変数「i」をカウントアップしています。
変数「cnt」より変数「i」が小さい間、ランダムに文字が選ばれ続けます。
このようにして、繰り返しランダムに文字を1つ1つ選び、パスワードを作成しています。
それでは、ランダムなパスワードを作成する機能とパスワードを管理する機能を利用して、安全にアプリやサイトを使っていきましょう。
以上です。
最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。