2012年9月17日月曜日

[ExcelVBA] ○進数へ変換


■10進数から○進数へ変換
  1. Option Explicit  
  2.   
  3. Sub Sample()  
  4.     '8進数へ変換  
  5.     Debug.Print Oct(7) '7  
  6.     Debug.Print Oct(8) '10  
  7.       
  8.     '16進数へ変換  
  9.     Debug.Print Hex(15)  'F  
  10.     Debug.Print Hex(16)  '10  
  11.     Debug.Print Hex(255) 'FF  
  12. End Sub  


■○進数から10進数へ変換
  1. Option Explicit  
  2.   
  3. Sub Sample()  
  4.     '■ハードコードできる値(変数をつかわず直接記載可能)の場合  
  5.     '8進数から変換  
  6.     Debug.Print &O7  '7  
  7.     Debug.Print &O10 '8  
  8.       
  9.     '16進数から変換  
  10.     Debug.Print &HF  '15  
  11.     Debug.Print &H10 '16  
  12.     Debug.Print &HFF '255  
  13.   
  14.     '■変数の場合  
  15.     '8進数から変換  
  16.     Dim OctValue As Long: OctValue = Oct(8)  
  17.     Debug.Print CLng("&O" & OctValue) '8  
  18.       
  19.     '16進数からの変換  
  20.     Dim HexValue As Long: HexValue = Hex(16)  
  21.     Debug.Print CLng("&H" & HexValue) '16  
  22. End Sub  


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

例)オートシェイプの背景色をユーザーが指定できるようにした場合を考える。
ユーザーはFFFFFFを指定仕様としたがタイプしてFFFFFGとしてしまったとする。
  1. Option Explicit  
  2.   
  3. Sub Sample()  
  4.     Dim HexStr As String: HexStr = "FFFFFG"  
  5.     Debug.Print Val("&H" & HexStr) '1048575 ←FFFFFとして計算する  
  6.     Debug.Print CLng("&H" & HexStr) '16進数に使えない文字があるのでエラーとなる  
  7. End Sub  

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


■エラー警告付き1(Clng/Val)
  1. Option Explicit  
  2.   
  3. Sub Sample()  
  4.     Dim HexStr As String: HexStr = "FFFFFG"  
  5.       
  6.     '事前に16進数なのか妥当性をチェックする  
  7.     Dim RegHex As Object  
  8.     Set RegHex = CreateObject("VBScript.RegExp")  
  9.     RegHex.IgnoreCase = True  
  10.     RegHex.Pattern = "^[0-9A-F]+$"  
  11.       
  12.     If Not RegHex.Test(HexStr) Then  
  13.         '16進数ではない文字がある時はこっち  
  14.         Debug.Print "16進数を指定してください"  
  15.     Else  
  16.         'かならず16進数が来る  
  17.         Debug.Print Val("&H" & HexStr)  
  18.         Debug.Print CLng("&H" & HexStr)  
  19.     End If  
  20.   
  21.     Set RegHex = Nothing  
  22. End Sub  

■エラー警告付き2(Clngのみ)
  1. Option Explicit  
  2.   
  3. Sub Sample()  
  4.     Dim HexStr As String: HexStr = "FFFFFG"  
  5.       
  6.       
  7.     On Error Resume Next  
  8.     Debug.Print CLng("&H" & HexStr)  
  9.       
  10.     If 0 <> Err.Number Then  
  11.         Debug.Print "16進数を指定してください"  
  12.     End If  
  13.   
  14.     On Error GoTo 0  
  15. End Sub  

0 件のコメント: