プロが教えるわが家の防犯対策術!

有効数字N桁の処理をするマクロ
ROUND2(aa,NN) aa処理する数字、 NN:有効数字桁数
ROUND2 = Application.Round(aa, -Int(Application.Log(Abs(aa))) - 1 + nn)
をつかって、有効数字N桁表示をさせるようにしています。これを使って1.012や0.304という数字を有効数字2桁で処理しセルに値を返すと1や0.3と表示してしまいます。
これを1.0や0.30といった形で有効数字で丸めた値そのままをセルに返したいのですが、どのようなマクロを追加すればよいのでしょうか?

説明がわかりにくいかとおもいますが、よろしくお願いします。

A 回答 (4件)

こんにちは。



>ROUND2 = Application.Round(aa, -Int(Application.Log(Abs(aa))) - 1 + nn)

マクロですか?

Excel97 VBA方式を使うなら、その意味を分かっていないといけませんが、Application.Logは、エラーにはなりませんが、VBAにも使い方が違いますが、Log関数はあります。ワークシート関数とVBA関数と、作ったチームが違うようですので、若干の仕様の違いが出てくるようです。なんとか、VBA方式で書くことを前提に進めてください。ご自身のためです。

また、ワークシートに貼り付ける場合と、VBAマクロのみで行う場合とは違います。
ユーザー定義関数の場合は、型のキャストが働かないようなスタイルにします。以下が、必ずしもベストな方法ではありませんが、現在の出された質問から想定できる範囲です。

もし、VBAマクロで実施するなら、小数点のあるなしを判定して書式(NumberFormat)を換えます。


'ユーザー定義関数(標準モジュール)
'-------------------------------------------

Function EffectDegit(ByVal num As Variant, ByVal n As Integer) As String
  Dim buf As Variant
  Dim i As Long
  'ユーザー選択
  Const myFORM1 = "#,##0"
  Const myFORM2 = "0"
  
  If VarType(num) >= vbString Then Exit Function
  i = Int(Log(Abs(num)) / Log(10)) + 1 '桁数の比較
  
  If i > 0 Then '整数
    If i >= n Then
      n = i - n
      buf = Int(num / 10 ^ n + 0.5) * 10 ^ n
      buf = Format$(buf, myFORM1)
    Else
      buf = Int(num)
    End If
  Else
    n = i - n
    buf = Int(num / 10 ^ n + 0.5) * 10 ^ n
    buf = Format$(buf, "0." & String(Abs(n), "0"))
  End If
  EffectDegit = buf
End Function
'-------------------------------------------
    • good
    • 0
この回答へのお礼

場合分けで書式を設定するという方法は考えてませんでしたが、
回答いただいた内容を踏まえて、返された値によって書式を設定していくコードを組んでいこうと思います。
大変参考になりました。ありがとうございました。

お礼日時:2009/07/16 11:34

#3の文章が足したり削ったりして、ヘンでした。



「Excel97 VBA方式を使うなら、その意味を分かっていないといけませんが、Application.Logは、エラーにはなりませんが、VBAにも使い方が違いますが、Log関数はあります。」

訂正:
「Application.関数名という、Excel97 VBA方式を使うなら、その意味を分かっていないといけません。Application.Logというのは、VBAにも、Log関数はありますので、こちらを使ったほうがよいです。」
    • good
    • 0

マクロというより、エクセルユーザー定義関数を作るということだと思う。

それにはVBAコード作成が必要だが。
質問している本人が、どういう処理ロジックになるか考えて、文章や箇条書きで説明しないと。その点は質問者の方が理科系?で詳しかろう。丸投げしないで。
    • good
    • 0

f = "0."


For i = 1 To nn
f = f & "0"
Next i

x = Application.Round(aa, -Int(Application.Log(Abs(aa))) - 1 + nn)
x = Format(x, f)
ROUND2 = x


ただし、文字列として認識されます
    • good
    • 0
この回答へのお礼

ありがとうございます。文字列で認識させることができたライナと思っていたのですが、やり方がわからなかったので参考になりました。

お礼日時:2009/07/16 11:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています