20進数対応の基数変換マクロが出来ちゃった。
意外とあっさり出来ちゃった。正に『案ずるより産むが易し』ですね。
コマッタモンダ。(やろうかやるまいか)悩んでいた時間が馬鹿みたいじゃぁないか・・・。
Function 基数変換改(input_data As Variant, origin As Integer, base As Integer)
'input_data:変換対象数値, origin:変換対象が何進数か, base:変換したい基数
Dim i As Integer
Dim ix As Integer '配列の番号
Dim input_num As Integer 'input_dataを10進数に変換した値
Dim buf As Variant '変換用一時バッファ
Dim residue As Integer 'residue:余りの英語表記らしい
Dim ans() '基数変換の答え(一時バッファとしても使用)
Dim output As String
imax = Len(input_data)
For i = imax To 1 Step -1
buf = Mid(input_data, i, 1)
input_num = 数値変換(buf) * origin ^ (imax - i) + input_num
Next i
'input_numには10進数に変換した数値が格納されている
ix = 0
Do While input_num >= base
ReDim Preserve ans(ix)
residue = input_num Mod base
ans(ix) = 数値逆変換(residue)
input_num = (input_num - residue) / base
ix = ix + 1
Loop
ReDim Preserve ans(ix)
residue = input_num Mod base
ans(ix) = 数値逆変換(residue)
imax = ix
'文字の書き出し
output = ""
For i = 0 To imax
output = ans(i) & output
Next i
基数変換改 = output
End Function
Private Function 数値変換(buf As Variant)
'20進数まで変換可能
Dim data As Integer
data = Val(buf)
If data = 0 And i <> "0" Then
buf = StrConv(buf, 1)
Select Case buf
Case "A"
data = 10
Case "B"
data = 11
Case "C"
data = 12
Case "D"
data = 13
Case "E"
data = 14
Case "F"
data = 15
Case "G"
data = 16
Case "H"
data = 17
Case "I"
data = 18
Case "J"
data = 19
Case Else
data = 0
End Select
End If
数値変換 = data
End FunctionPrivate Function 数値逆変換(input_num As Integer)
Dim data As Variant
Select Case input_num
Case 10
data = "A"
Case 11
data = "B"
Case 12
data = "C"
Case 13
data = "D"
Case 14
data = "E"
Case 15
data = "F"
Case 16
data = "G"
Case 17
data = "H"
Case 18
data = "I"
Case 19
data = "J"
Case Else
data = input_num
End Select
数値逆変換 = data
End Function