VBAの勉強を始めてみた

色々試しています。

ひっそりとExcel関数のおさらい(二進化十進数の相互変換)

今回は自作関数です。前回、基数変換について書きましたが、そういえば二進化十進数を相互変換する関数ってないんだなーと思い、作ってみました。無くても困りませんが、遊びで作ってみました。

目次 

 

そもそも二進化十進数って?

二進化十進数は、BCD(Binary Coded Decimal)とも呼ばれ、10進数の1桁を2進数の4桁で表現するというものです。

1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
10 00010000
11 00010001
12 00010010
13 00010011
14 00010100
15 00010101
16 00010110
17 00010111
18 00011000
19 00011001

左側がBCDでの10進数表現、右側が2進数表現です。

9までいくと桁上がりし、2進数の4桁が増えていくといった具合です。16進数でいうところのA,B,C,D,E,Fに該当する、1010,1011,1100,1101,1110,1111は、BCDでは使用しません。
桁を合わせた際に、2進数表現、16進数表現だった場合、どちらも非エンジニアの人には馴染みが薄いということで、事業用の設備なんかでBCDを採用しているケースがあります。(そもそも、馴染みのない人が設備の内部データに触れることがあるのか疑問ですが・・・)

 

BCD表現における10進数を2進数に変換する

=BCD2BIN(10進数)
例えば、10進数の「15」を普通に2進数変換すると「1111」ですが、これをBCD表現である「00010101」に変換します。
下記のコードをアドイン用ブックに追記するか、個人用マクロブックに追記することで、関数が使用できるようになります。

Function BCD2BIN(Bcd As String) As String
    '引数に10進数を指定します
    'BCD表現における10進数を2進数に変換します
    Dim BcdL As Integer
    Dim i As Integer
    
    BcdL = Len(Bcd)
    
    For i = 1 To BcdL
        BCD2BIN = BCD2BIN & WorksheetFunction.Hex2Bin(Mid(Bcd, i, 1), 4)
    Next i
End Function

 

BCD表現における2進数を10進数に変換する

=BIN2BCD(2進数)
例えば、2進数の「00010101」を普通に10進数変換すると「21」ですが、これをBCD表現である「15」に変換します。
下記のコードをアドイン用ブックに追記するか、個人用マクロブックに追記することで、関数が使用できるようになります。

Function BIN2BCD(Bin As String) As String
    '引数に2進数を指定します
    'BCD表現における2進数を10進数に変換する
    Dim BinL As Integer
    Dim i As Integer
    
    Bin = "000" & Bin
    BinL = Len(Bin)
    
    For i = 3 To BinL - 1 Step 4
        If 9 >= WorksheetFunction.Bin2Dec(Mid(Bin, BinL - i, 4)) Then
            BIN2BCD = WorksheetFunction.Bin2Dec(Mid(Bin, BinL - i, 4)) & BIN2BCD
        Else    '9を超える場合はエラー表示し、プログラムを終了する
            BIN2BCD = "Error"
            Exit Function
        End If
    Next i
End Function