器用貧乏の独り言

器用貧乏なおっさんが気の向くままに。

【VBA】Excelで簡易の電子署名システムを作ってみた!なりすまし防止機能付き

◇前置き

昨今、ペーパレス化・脱ハンコの動きがようやく日本でも見られるようになってきました。

様々な企業が「電子署名システム」を開発・提供するようになりましたが、「部内で使うだけだし、そこまで立派なものはいらないんだよなぁ・・・。」なんてことありませんか?

ちゃんとした電子署名システムは中々良いお値段しますよね?

今回は、ExcelVBAで簡単に作れる電子署名システムを紹介します。

紹介するシステムの機能を要約するとこんな感じです。

①マスターに名前を登録している人以外は承認欄に署名が出来ない。
②マスターに名前を登録している人も自分の名前以外では署名が出来ない。

とりあえずで使う分には十分ではないでしょうか?

◇概要

今回の画面イメージはこんな感じです。


「承認欄」があるだけのシンプルなシートです。
プルダウンで名前を選択するようにしてあります。

今回の肝は、「自分の名前以外を選択できないようにする」ことです。

この機能を実装するために、同ブック内の別シートにマスターを設けます。

今回は例としてこんなマスターを用意しました。

ユーザーIDは、ログインする時の名前(ユーザー名)のことです。

ソースコード

ソースコードはこんな感じです。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim user_name As String
Dim AppName As String
Dim appNo As Variant
   user_name = Environ("UserName")
   Sheets("メイン").Activate
   AppName = Range("C3").Value
   If AppName <> "" Then
       Application.ScreenUpdating = False
       Sheets("マスター").Activate
       Dim ws As Worksheet
       Dim Master As ListObject
           Set ws = ActiveSheet
           Set Master = ws.ListObjects("マスター")
           appNo = WorksheetFunction.VLookup(AppName, ws.Range(Master), 2, False)
           If user_name <> appNo Then
               MsgBox "入力された名前とログインユーザーのIDが一致しません。"
               Range("C3").ClearContents
           End If
           Sheets("メイン").Activate
           Application.ScreenUpdating = True
   End If
End Sub


Environ("UserName")で取得したログイン中のユーザー名と、署名しようとした名前の整合性を確認するコードになっています。

標準モジュールではなく、署名欄のあるシートに記述します。

◇使い方

実際に動かしてみましょう。
プルダウンから「A部長」を選んでみます。

すると、こんなメッセージが表示されます。


ログインしているユーザー名とマスターのユーザーIDが一致しない限り、署名できないようになっていますね。

◇最後に

いかがだったでしょうか?
比較的短いコードですが、汎用性の高いコードだと思います。

マスターにパスワード付きでシート保護をかけておけば大抵の人は、不正な署名をすることが出来なくなります。

「書類の電子化をしてみたいけど、お金はかけたくないなぁ」
という時は、このコードを活用してみてはいかがでしょうか?

この記事も誰かの役に立つと嬉しいです。