プロが教える店舗&オフィスのセキュリティ対策術

http://detail.chiebukuro.yahoo.co.jp/qa/question …

このページと同じように有効数字で四捨五入するマクロをVBAで作りたいのですが

12345.6789 → 12300
98765.4321 → 98800
12.3456789 → 12.3
98.7654321 → 98.8
0.0123456789 → 0.012
0.0987654321 → 0.099
0.0900654321 → 0.090


Application.Round(rng, f)

となっているところを
WorksheetFunctionを使わずに行いたいのですが
どうすれば良いですか?


あとテキストデータに出力した際に
0.001などが1E-3のようになってしまいますが
指数表記か標準表記かを選択するにはどうしたら良いですか?

Format(x, "0.000")

のようにすると、0.1が0.100のようになってしまうのですがどうしたら良いですか?

A 回答 (1件)

こんばんは。



>有効数字で四捨五入するマクロをVBAで作りたいのですが

有効桁数が3桁の計算をしないさい、ということだったら、古典的な問題ですね。昔、やった覚えがあります。ただし、文中の引用先の知恵袋の質問は、理由の分からないリクエストが多すぎるように感じます。

ご質問のイレギュラーな部分としては、有効桁数が、二桁になっています。
というとで、条件が変わっています。

0.012345679 → 0.012
0.098765432 → 0.099

それと、これは、Format の問題ですから、これもイレギュラーです。
0.0900654321 → 0.090

なお、以下のマクロでは、有効桁数を優先しているので、
0.000912456 → 0.00091 となり、

負数は、以下のようになります。
-0.090065432  → -0.090 となります。

>WorksheetFunctionを使わずに行いたいのですが
引用先の事ですね。ユーザー定義関数としては、プログラミングとしての用をなしていないように見受けられました。

以下はExcelのA列の1行目からの計算です。右隣のセルに出力します。

'//
Sub Test01()
Dim c As Range
Dim buf As Variant
For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp))
 If VarType(c.Value) = vbDouble Then
  If c.Value >= 0.1 Then
   c.Offset(, 1).Value = UpperGetNum(c.Value, 3)
  Else
    buf = UpperGetNum(c.Value, 2)
    If Len(CStr(Abs(buf))) <= 4 Then
     c.Offset(, 1).NumberFormat = "0.000"
     c.Offset(, 1).Value = buf
    Else
     c.Offset(, 1).Value = buf
    End If
  End If
 End If
Next
End Sub

''ユーザー定義関数
Function UpperGetNum(n, dgt)
'n は計算の数値, dgtは桁数 二つのパラメータは意図的にVariant型
Dim sg As Integer
Dim k As Integer
Dim i As Integer
Dim a As Double
 sg = Sgn(n) '符号
 n = Abs(n) '絶対値
 k = Int(Log(Abs(n)) / Log(10#)) '桁
 i = (k + 1) - dgt
 a = Int(n / 10 ^ i + 0.5) '四捨五入
 UpperGetNum = sg * (a * 10 ^ i)
End Function
'//

>あとテキストデータに出力した際に
>0.001などが1E-3のようになってしまいますが
>指数表記か標準表記かを選択するにはどうしたら良いですか?

テキストデータに出力という意味には、いろいろありますから、それだけではっきり分かりません。
Format(x, "0.000") これも、テキスト出力です。

1E-3 になるのは、特別に書式設定されていなければ、セル幅を広げれば、数値的に出るはずです。セル上で、データ型のキャスティングでも行われているというのでしたら、

明示的に、 ActiveCell.NumberFormat ="0.000" 
としてから、 ActiveCell.Value =0.001
として、数値出力すればよいはずです。(数値入力よりも、NumberFormat が先ならないと、補正処理が働いて、値が変動することがあったと思います。)

>Format(x, "0.000")
>のようにすると、0.1が0.100のようになってしまうのですがどうしたら良いですか?

それは、最初のご質問提示の
0.0900654321 → 0.090
とは、矛盾しているように感じます。何か、明確な条件がなくては、排除することができません。

丸める必要がないものは、If 文に条件をつければよいでしょう。
例えば、IF 値*1000 - INT関数(値 *1000) =0 なら、そのままに出力するとかすればよいと思います。
    • good
    • 1
この回答へのお礼

ありがとうございます。

前半の質問の有効数字の方はうまくいきました。

後半の質問のテキスト出力に関して再度改めて質問させていただきます。

お礼日時:2015/02/10 16:28

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

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


このQ&Aを見た人がよく見るQ&A