Microsoft Excel で作ったパスワード生成マクロブック

暇つぶしによる、暇つぶしのための、暇つぶしマクロ。

EW-SYS.INFO

8文字のパスワードですら危ういご時世で

Webサービスでパスワードを求められるのは「当たり前」のこととなりました。

新しいサービスを利用する度に、新しいパスワードを考えるのは、とても面倒くさいので、ついつい同じパスワードを、再利用してしまうことも多いはず。

さらに、金融系の暗証番号に、誕生日や、車のナンバープレートや、住所の番地を利用してしまっている方も多いはず。

パスワードは、自己責任で管理するものですが、面倒くさいが先に立ち、悪意の第三者に、パスワードが知られ損害を被ってから、はじめて後悔するものです。

複雑なパスワードを自動で作ってくれるサービスは無いものか?

インターネットで検索してみたら、やっぱり存在しました。

しかし、インターネットで利用するパスワードを、同じインターネットで自動生成するのは、なにか不安を感じてしまう。

もし、パスワード生成できるウェブサイトの管理者が、悪意の第三者だったら?

インターネット上で、便利なサービスを提供している大多数の提供者は、善意に満ちています。善意のかたまりなので、「悪意」なんて言葉も概念すらありません。

でも、そうじゃない少数派の悪意の提供者が居たら?そこで生成したパスワードは、自分以外の第三者が把握していることになります。

インターネットのウェブサービスでは、誰も損害を担保してくれないという不安が拭えません。

なら自分でそういうの作ればいいジャン!

インターネットに接続しなくても、パスワードを自動で作ってくれる仕組みがあればいい。

さらに、つくられるパスワードが、できる仕組みも、自分が理解していれば、尚いい。

そこで、小難しい言語の訳の分からない関数を使ってしまったら、やっぱり不安の素はぬぐえません。

気軽で、単純で、となると・・・

Microsoft社のMicrosoft Excelのマクロ(VBA)なら、だいぶ普及しているからいいだろう。という訳で、小一時間ほどかけて作ってみました。

PasswordGeneratorBook.xlsm

zip形式の圧縮ファイルなので、ダウンロードして解凍してください。

解凍すると、PasswordGeneratorBook.xlsmというMicrosoft Excelのマクロ有効ブックが入っています。

解凍されたファイルを開くと、セキュリティ警告でマクロが無効化されるはずです。できれば、そのまま「有効化」せずに、まずは「パスワード生成」に紐づけられたマクロのソースコードを読んで、このマクロが安全かどうか自身で判断してから、有効化を行ってください。

このマクロを含むファイルで、なんらかの損害を被っても、当方では責任を負いません。そんなことは無いと自負していますが、万が一のために意思表示しておきます。

あと、公開したマクロのソースコードに関して権利を主張しませんので、ご自由に改変して金儲けに使えるなら、使ってみてちょ。

機能の特徴

  • パスワードに利用する文字(英小文字、英大文字、数字、記号)を、ご都合に合わせてシート上で設定できます。
  • パスワードの文字数(1~候補文字数)を、ご都合に合わせてシート上で設定できます。
  • パスワードの1文字目に使う文字種(英小文字を使う、英大文字を使う、数字を使う、記号を使わない、指定しない)を、ご都合に合わせてシート上で設定できます。
  • パスワード内で、同じ文字を使うか、ご都合に合わせてシート上で設定できます。
  • パスワード生成ボタンをクリックする度に、新しいパスワードが作られます。

動作環境が、表計算ソフトなので、新たなワークシートを追加して、パスワードを管理する表も作りやすいですね。

使っているマクロのソースコード

ワークシート上のパスワード生成ボタンが、クリックされた時に働く「 btn_Generate_Click 」と、パスワードを生成する「 RandomWord 」という二つの関数で、パスワードをつくっています。別に、二つに分けた理由はありません。ひとつでも済みます。

以下、マクロ(全文)

Option Explicit

'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'
'   パスワード生成ボタン
'
'   シート上の各設定値取得して、パスワード生成ファンクションを用いて、パスワードを求める。
'
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Public Sub btn_Generate_Click()

    Dim strCandidate                    As String                                                   ' 候補文字列
    Dim intMaxLength                    As Integer                                                  ' 文字数
    Dim strStartMode                    As String                                                   ' 一文字目を Mode
    Dim blnSameSwitch                   As Boolean                                                  ' 同じ文字を Switch
    Dim strPassword                     As String                                                   ' パスワード

'
'   対象ワークシートで括る
    With Worksheets(1)

'
'       候補文字列の作成
        strCandidate = ""
        strCandidate = strCandidate & .Range("C3").Value                                            ' 英小文字
        strCandidate = strCandidate & .Range("C4").Value                                            ' 英大文字
        strCandidate = strCandidate & .Range("C5").Value                                            ' 数字
        strCandidate = strCandidate & .Range("C6").Value                                            ' 記号
'
'       パスワード文字数の設定値を取得
        intMaxLength = .Range("C8").Value
'
'       一文字目の設定を取得
        strStartMode = .Range("C9").Value
'
'       同じ文字の設定を判断
        Select Case .Range("C10").Value
            Case "使う":        blnSameSwitch = True                                                ' 許可する
            Case "使わない":    blnSameSwitch = False                                               ' 許可しない
            Case Else:          blnSameSwitch = True                                                ' 許可する
        End Select

'---------------------------------------------------------------------------------------------------
'
'       パスワード生成ファンクション
'
'       引数
'           1.候補文字列
'           2.パスワード文字数
'           3.1文字目の指定方法
'           4.同じ文字の許可区分
'
'---------------------------------------------------------------------------------------------------
        strPassword = RandomWord(strCandidate, intMaxLength, strStartMode, blnSameSwitch)

'
'       創られたパスワードを表示
        .Range("B15").Value = strPassword

    End With

End Sub

'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'
'   パスワード生成ファンクション
'
'   引数
'       pCandidate  候補文字列
'       pMaxLength  パスワード文字数
'       pStartMode  1文字目の指定方法
'       pSameSwitch 同じ文字の許可区分
'
'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Public Function RandomWord(ByVal pCandidate As String _
                         , ByVal pMaxLength As Integer _
                         , ByVal pStartMode As String _
                         , ByVal pSameSwitch As Boolean) As String

    Dim strPassword                     As String                                                   ' 文字列
    Dim strWord                         As String                                                   ' 取得1文字
    Dim intLength                       As Integer                                                  ' 生成文字数

    Dim intMaxLength                    As Integer                                                  ' 候補文字列数
    Dim intRandomIndex                  As Integer                                                  ' 取得指数

    Dim blnAddSwitch                    As Boolean                                                  ' 文字追加区分

'
'   戻り値を初期化
    RandomWord = ""

'
'   文字追加区分を初期化
    blnAddSwitch = False

'
'   生成文字数を初期化
    intLength = 0

'
'   候補文字列数を求める
    intMaxLength = Len(pCandidate)

'
'   生成文字数が、パスワード文字数より小さい間は繰り返す
    While intLength < pMaxLength

'
'       乱数関数で候補文字列からの取得位置を求める
        intRandomIndex = CInt(Rnd(intMaxLength) * (10 ^ Len(intMaxLength)))                         ' 乱数

'
'       取得位置が候補文字列数の範囲内ならば・・・
        If intRandomIndex > 0 And intRandomIndex <= intMaxLength Then

'
'           候補文字列から取得位置の1文字を取得
            strWord = Mid$(pCandidate, intRandomIndex, 1)

'
'           生成文字数が1文字目ならば・・・
            If intLength = 0 Then

'
'               1文字目の指定方法で処理が分岐
                Select Case pStartMode
                    
                    Case "英小文字を使う"
'
'                       取得1文字目が英小文字に含まれている場合、文字追加区分を“ON”
                        If Not InStr("abcdefghijklmnopqrstuvwxyz", strWord) = 0 Then blnAddSwitch = True
                    
                    Case "英大文字を使う"
'
'                       取得1文字目が英大文字に含まれている場合、文字追加区分を“ON”
                        If Not InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", strWord) = 0 Then blnAddSwitch = True
                    
                    Case "数字を使う"
'
'                       取得1文字目が数字に含まれている場合、文字追加区分を“ON”
                        If Not InStr("1234567890", strWord) = 0 Then blnAddSwitch = True

                    Case "記号を使わない"
'
'                       取得1文字目が英小文字、英大文字、数字に含まれている場合、文字追加区分を“ON”
                        If Not InStr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", strWord) = 0 Then blnAddSwitch = True

                    Case Else                                                                       ' 指定しない
'
'                       文字追加区分をON
                        blnAddSwitch = True
                        
                End Select

            End If

'
'           文字追加区分が“ON”ならば・・・
            If blnAddSwitch Then

'
'               同じ文字が許可されいるならば・・・
                If pSameSwitch Then
'
'                   パスワード文字列に取得1文字を追加
                    strPassword = strPassword & strWord
'
'                   生成文字数を加算
                    intLength = intLength + 1

                Else

'
'                   1文字がパスワード文字列に含まれないならば・・・
                    If InStr(strPassword, strWord) = 0 Then
'
'                       パスワード文字列に取得1文字を追加
                        strPassword = strPassword & strWord
'
'                       生成文字数を加算
                        intLength = intLength + 1

                    End If
                
                End If
            
            End If

        End If

    Wend

'
'   戻り値にパスワード文字列を代入
    RandomWord = strPassword

End Function

このソースコードを基にマクロ(VBA)をこれから知ろうとする人々の一助(良くも悪くも)になれば幸いです。

追記

悪意ある設定値でパスワード生成を行うと、無限ループになります。ソースコードを読んで、必要なら改善を施してください。

無限ループ「応答なし」になった場合は、エクセルを強制終了してください。

scroll page top ▲