2012年9月17日月曜日

[ExcelVBA] ○進数へ変換


■10進数から○進数へ変換
Option Explicit

Sub Sample()
    '8進数へ変換
    Debug.Print Oct(7) '7
    Debug.Print Oct(8) '10
    
    '16進数へ変換
    Debug.Print Hex(15)  'F
    Debug.Print Hex(16)  '10
    Debug.Print Hex(255) 'FF
End Sub


■○進数から10進数へ変換
Option Explicit

Sub Sample()
    '■ハードコードできる値(変数をつかわず直接記載可能)の場合
    '8進数から変換
    Debug.Print &O7  '7
    Debug.Print &O10 '8
    
    '16進数から変換
    Debug.Print &HF  '15
    Debug.Print &H10 '16
    Debug.Print &HFF '255

    '■変数の場合
    '8進数から変換
    Dim OctValue As Long: OctValue = Oct(8)
    Debug.Print CLng("&O" & OctValue) '8
    
    '16進数からの変換
    Dim HexValue As Long: HexValue = Hex(16)
    Debug.Print CLng("&H" & HexValue) '16
End Sub


注:Val関数を使って変換をしているサンプルコードも見かけますが
Val関数はあくまでも前方から数字として認識可能な物を数字とする
関数ですので、あまりお勧めできません。

例)オートシェイプの背景色をユーザーが指定できるようにした場合を考える。
ユーザーはFFFFFFを指定仕様としたがタイプしてFFFFFGとしてしまったとする。
Option Explicit

Sub Sample()
    Dim HexStr As String: HexStr = "FFFFFG"
    Debug.Print Val("&H" & HexStr) '1048575 ←FFFFFとして計算する
    Debug.Print CLng("&H" & HexStr) '16進数に使えない文字があるのでエラーとなる
End Sub

この場合、事前に正規表現で16進数でないとエラー警告をだすか
Clng方式の時は、On Error Resume Nextでエラートラップする方法が考えられます


■エラー警告付き1(Clng/Val)
Option Explicit

Sub Sample()
    Dim HexStr As String: HexStr = "FFFFFG"
    
    '事前に16進数なのか妥当性をチェックする
    Dim RegHex As Object
    Set RegHex = CreateObject("VBScript.RegExp")
    RegHex.IgnoreCase = True
    RegHex.Pattern = "^[0-9A-F]+$"
    
    If Not RegHex.Test(HexStr) Then
        '16進数ではない文字がある時はこっち
        Debug.Print "16進数を指定してください"
    Else
        'かならず16進数が来る
        Debug.Print Val("&H" & HexStr)
        Debug.Print CLng("&H" & HexStr)
    End If

    Set RegHex = Nothing
End Sub

■エラー警告付き2(Clngのみ)
Option Explicit

Sub Sample()
    Dim HexStr As String: HexStr = "FFFFFG"
    
    
    On Error Resume Next
    Debug.Print CLng("&H" & HexStr)
    
    If 0 <> Err.Number Then
        Debug.Print "16進数を指定してください"
    End If

    On Error GoTo 0
End Sub

0 件のコメント: