数値が何桁か数える場合は、Len関数を使用します。
ただしLen関数には「String型以外に使用すると使用するメモリ数を返す」という仕様があるため、以下のようにCStr関数を使って一度文字列にしてから実行してください。
Dim 数値 As Long 数値 = 12345 Dim 桁数 As Long 桁数 = Len(数値) ' 4 ← Long型は常に4(メモリ数)を返してしまう。 桁数 = Len(CStr(数値)) ' 5 ← 文字列にすることで正しく動く 桁数 = Len(数値 & "") ' 5 ← これでもOK
Len関数を使用する場合はこの挙動に注意してください。
次に小数を含む数値の桁数を数えたい場合ですが、
まず整数部を数えたい場合は、「Int」で切り捨ててから実行すれば求まります。
数値 = 12345.678 桁数 = Len(Cstr(Int(数値))) ' 5
このときも「CStr関数」によって文字列化するのを忘れないようにして下さい。
続いて小数部の桁数を数えたい(小数第何桁か調べたい)場合は、
数値であることが確定しているなら「Split関数」が簡単です。
数値 = 12345.678 小数点桁数 = Len(Split(数値, ".")(1)) ' 3
Instr関数で「.」の位置を調べても求まりますが、
「.」がひとつだけと分かっているなら「.」でSplitした第2項が小数部です。
(Split関数はString型が返り値のためCStr関数は不要)
ただし数値が整数の場合はエラーになってしまうため、
その分岐はしておいてください。
If Instr(数値, ".") = 0 Then 小数点桁数 = 0 Else 小数点桁数 = Len(Split(数値, ".")(1)) ' 3 End If
おまけ
数値Nが10進数で何桁になるか? |
というのはまさにlog₁₀Nで求まる数値(+1)になります。
VBAにはLog関数(底がeの自然対数)しかないのですが、
シート関数にはLOG10関数がありますので、桁数はこちらを使用しても求まります。
桁数 = Int(WorksheetFunction.Log10(数値)) + 1
お好きな方をご利用ください。
ただし注意点として、WorksheetFunctionを使用せず、
log₁₀N = logₑN / logₑ10 の定理を使って、
桁数 = Int(Log(数値) / Log(10)) + 1
とした場合は、小数計算の誤差によって正しく動かない場合があります。
Debug.Print Int(Log(1000)/log(10)) ' ← 2(2.999999999…になってしまった)
こちらの式は使用できませんのでご注意ください。