和風スパゲティのレシピ

日本語でコーディングするExcelVBA

数値の桁数を取得する/小数点第何位か調べる

数値が何桁か数える場合は、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…になってしまった)

 
こちらの式は使用できませんのでご注意ください。