Excelが大好きだ!

Excel大好き経理マンがExcelの事を書き綴っていきます。


スポンサードリンク

10進数から他の進数に変換する関数を作った

問題解決のための「アルゴリズム×数学」で変換方法を知った

この計算方法を使えば10進数からあらゆる進数に変換できるようだ。 おもしろそうなのでユーザー定義関数で再現してみることにした。

進数変換アルゴリズム

10進数から他の進数への変換は下記のように行う。

  1. 10進数の値を変換したい進数で割り算を行う
  2. 商を更に変換したい進数で割り算を行う
  3. 商がゼロになるまで繰り返す
  4. 商がゼロになったら計算終了
  5. 算出された「余り」を下から順番に並べる
  6. 出来上がった数値が求めたい進数に変換した数値

この手順で10進数から2進数などの他の進数への変換ができます。


実際に10進数の「20」を2進数に変換してみます。

f:id:ExcelLover:20220115142414j:plain

10進数の値を変換したい進数で割り算を行う
f:id:ExcelLover:20220115142428j:plain

商がゼロになるまで繰り返す
f:id:ExcelLover:20220115142452j:plain

算出された「余り」を下から順番に並べる
f:id:ExcelLover:20220115142505j:plain

出来上がった数値が求めたい進数に変換した数値。 10進数の「20」を2進数に変換した結果「10100」なりました。

進数変換自作関数

上記の進数変換アルゴリズムを再現した関数が以下です。

Function kfTo○進数(何進数 As Long, 数値 As Long, Optional 表示整形有無 As Boolean = False) As Variant
    DimAs Long
    DimAs Collection: Set= New Collection
    
    解 = 数値
    Do.AddMod 何進数
        解 = 解 \ 何進数
    Loop Until= 0
    
    Dim i As Long
    Dim ans As Variant
    For i =.Count To 1 Step -1
        ans = ans & kf10以上の数値をアルファベットに変換((i))
    Next
    
    If 表示整形有無 Then ans = kf進数整形(何進数, ans)
    If 何進数 = 10 Then ans = Val(ans)
    kfTo○進数 = ans
End Function
---
Private Function kf10以上の数値をアルファベットに変換(数値 As Long) As String
    Dim ans As Variant: ans = 数値
    If 数値 >= 10 Then ans = Mid("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 数値 - 9, 1)
    kf10以上の数値をアルファベットに変換 = ans
End Function
---
Private Function kf進数整形(何進数 As Long,As Variant) As String
    Dim ans As String
    Select Case 何進数
        Case 2
            DimAs Long: 桁 = WorksheetFunction.Ceiling(Len(), 8)
            ans = Right(String(, "0") &,)
        Case 10
            ans = Val()
        Case 16
            ans = "0x" &Case Else
            ans =& "(" & 何進数 & ")"
    End Select
    kf進数整形 = ans
End Function

まとめ

Excelに用意されているDEC2BIN関数などは変換できる範囲が狭いのでこの関数であれば、10進数からあらゆる進数に変換でき、もっと大きな数値でも変換可能だとほくそ笑んでおりました。

が…

なんだと…

BASE関数なんてものが存在しているのか!

今回作った関数のメリットが標準関数に全て含まれている!

良いんだ。
進数変換のロジックを理解することが出来たし。
自作関数で作っておけば細かい融通を利かすことも出来るしね。

良いんだ…