適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話など気になったことも載せているブログです。

マイナンバーのチェックデジットをVBAで計算してみよう

よっしゃーー!!

5,000ポイントゲットしてやるぜぇえええーーー!!!

f:id:shinmai_papa:20200821152229p:plain
マイナちゃん

ということで、消費喚起策として始まったマイナポイント事業ですが、

5,000ポイント配るために一体、総務省はいくら投資しているんでしょうかね。

おっと、のっけから話が逸れてしまいました。マイナポイント事業の話は置いておいて。

今回のお題は、「マイナンバーのチェックデジットをVBAで計算する!!」です。

マイナポイント事業で大人気のはずのマイナンバー。

マイナンバーには間違い防止のためチェックデジットがついているのはマイナポイント事業に申し込んでいる方々ならご存知ですよね。

え?ちょっと何言っているかわからない?

大丈夫。この記事を読めば、今日からあなたもマイナンバー博士!!

マイナンバーとは

マイナンバーとは、「行政手続における特定の個人を識別するための番号の利用等に関する法律」

(以下マイナンバー法と呼びます)の第二条の5にある、「個人番号」のことです。

この法律はマイナンバーとはから始まり、

誰がどういうときにマイナンバーを使っていいかがツラツラと書かれています。

読み始めるとすぐに眠れますので、眠れないときのお供に最適です。

行政手続における特定の個人を識別するための番号の利用等に関する法律 | e-Gov法令検索

マイナンバーの桁数

マイナンバーは12桁の数字です。

11桁の数字+チェックデジットです。

チェックデジットについては

「行政手続における特定の個人を識別するための番号の利用等に関する法律の規定による通知カード及び個人番号カード並びに情報提供ネットワークシステムによる特定個人情報の提供等に関する省令(平成二十六年総務省令第八十五号)」

の第5条に明記されています。

行政手続における特定の個人を識別するための番号の利用等に関する法律の規定による通知カード及び個人番号カード並びに情報提供ネットワークシステムによる特定個人情報の提供等に関する省令 | e-Gov法令検索

法律名なげぇよ!!!

早口ことばかよ!!

とにかく何でも詰め込みたがるのは、行政あるあるなので仕方ありません。

それによると、

第五条 令第八条の総務省令で定める算式は、次に掲げる算式とする。

算式

11 - ( (n=1(シグマ)11 (Pn×Qn))を11で除した余り)

ただし、(n=1(シグマ)11 (Pn×Qn))を11で除した余り≦1の場合は、0とする。

算式の符号

Pn 個人番号を構成する検査用数字以外の11桁の番号の最下位の桁を1桁目としたときのn桁目の数字

Qn 1≦n≦6のとき n+1 7≦n≦11のとき n-5

とのことです。

要は上記の式でチェックデジットが求まりますよってことです。

順を追って説明すると・・・

Pnは1桁の数字を表します。

Qnは各桁の重みになります。

チェックデジットを除いた一番右が1桁目となります。

その1桁目の重みは、1+1=2、その左側、2桁目の重みは2+1=3となります。

7桁目から11桁目はn-5なので、7桁目の場合、7-5=2・・・となります。

といった感じ。

あとはこれをプログラムに落とし込みます。

VBAで計算してみる

さて、では実装してみましょう。

お手元にマイナンバーカードは用意できましたか?

マイナンバーカードを申請していない人は通知カードでもいいですね。

もちろん暗記されている方は頭の中に思い浮かべてくれれば大丈夫です! (そんな人いるんでしょうか)

それでは自分のマイナンバーのチェックデジットが正しく計算されているか確認してみましょう!! (間違えているはずはありませんが・・・。)

本当に法律に書かれている通りに順番に実装すればできます。

引数にマイナンバーを指定すると、そのチェックデジットが正しいかどうか計算する関数です。

 
Function CHECKCHECKDIGIT(myNumber As String)
    
    '①12文字か
    If Len(myNumber) <> 12 Then
        CHECKCHECKDIGIT = "#NUM!"
        Exit Function
    End If
    
    '②数字かどうかチェック
    Dim P(1 To 12) As String
    Dim i As Long
    Dim idx As Long: idx = 11
    Dim argCheckDigit As Long: argCheckDigit = Right(myNumber, 1)
    For i = 1 To 11
        P(idx) = Mid(myNumber, i, 1)
        If Not IsNumeric(P(idx)) Then
            CHECKCHECKDIGIT = "#VALUE!"
            Exit Function
        End If
        idx = idx - 1
    Next i
    
    '③チェックディジットチェック
    '(n=1(シグマ)11(Pn×Qn))の部分
    Dim x As Long          '計算過程1
    Dim z As Long          '計算過程2
    Dim Qn As Long         'ウェイト
    Dim checkDigit As Long 'チェックデジット
    Dim n As Long
    For n = 1 To 11
        Select Case n
            Case 1, 7: Qn = 2
            Case 2, 8: Qn = 3
            Case 3, 9: Qn = 4
            Case 4, 10: Qn = 5
            Case 5, 11: Qn = 6
            Case 6: Qn = 7
        End Select
        x = P(n) * Qn + x
    Next n
    
    '11で除した余りを求める
    z = x Mod 11
    checkDigit = 11 - z
    If z <= 1 Then
        checkDigit = 0
    End If
    
    '計算して求めたチェックデジットと
    '引数のチェックデジットを比較する
    If checkDigit <> argCheckDigit Then
        CHECKCHECKDIGIT = False
        Exit Function
    End If
    
    CHECKCHECKDIGIT = True
    
End Function

計算過程の変数checkDigitが計算したチェックデジットになります。

実際にご自身のマイナンバーが正しいかチェックしてみてくだいね!

くれぐれも他の人に、「マイナンバー、教えて」なんて言ってはだめですからね!!

終わりに

本当にどこに向かっているのかわからないマイナンバー。

マイナポイントだけもらって、マイナンバーカードは机の肥やしになるご家庭も多いのでは・・・。

政府にはマイナンバーの有効な活用手段を見出してほしいものですね。

っと、また記事の内容とは関係ない結びになってしまいました。

普通に生活していたら、誰かのマイナンバーのチェックデジットを計算する機会などはないと思いますが、たまには法律を読むのも、それをプログラムに起こすのもやわらか頭体操だと思って、やってみると案外楽しいものです。

ここまでお読みいただき、ありがとうございました。