• ベストアンサー

有効数字N桁のマクロについて

有効数字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といった形で有効数字で丸めた値そのままをセルに返したいのですが、どのようなマクロを追加すればよいのでしょうか? 説明がわかりにくいかとおもいますが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 >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 '-------------------------------------------

nishibi
質問者

お礼

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

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#3の文章が足したり削ったりして、ヘンでした。 「Excel97 VBA方式を使うなら、その意味を分かっていないといけませんが、Application.Logは、エラーにはなりませんが、VBAにも使い方が違いますが、Log関数はあります。」 訂正: 「Application.関数名という、Excel97 VBA方式を使うなら、その意味を分かっていないといけません。Application.Logというのは、VBAにも、Log関数はありますので、こちらを使ったほうがよいです。」

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

マクロというより、エクセルユーザー定義関数を作るということだと思う。それにはVBAコード作成が必要だが。 質問している本人が、どういう処理ロジックになるか考えて、文章や箇条書きで説明しないと。その点は質問者の方が理科系?で詳しかろう。丸投げしないで。

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.1

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 ただし、文字列として認識されます

nishibi
質問者

お礼

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

関連するQ&A