
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のようになってしまうのですがどうしたら良いですか?
No.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 なら、そのままに出力するとかすればよいと思います。
ありがとうございます。
前半の質問の有効数字の方はうまくいきました。
後半の質問のテキスト出力に関して再度改めて質問させていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【教えて!goo ウォッチ 人気記事】風水師直伝!住まいに幸運を呼び込む三つのポイント
記事を読む>>
-
有効数字N桁のマクロについて
Word(ワード)
-
エクセルの有効数字3桁で四捨五入して、3桁だけ表示するにはどうしたらよいですか? A1に 数値 46
Excel(エクセル)
-
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
4
エクセルで有効桁を指定して丸めることは出来る?
Excel(エクセル)
-
5
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
6
もしセルが#N/A"なら~をする・・・には?"
Excel(エクセル)
-
7
VBA:小数点以下の数字を取得できる関数は?
Visual Basic(VBA)
-
8
VBAを用いて条件付きの平均値、標準偏差を求めたいです(Ecxel 2016使用)
Visual Basic(VBA)
-
9
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
10
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
11
16桁以上の数字を使った計算をしたい
その他(パソコン・スマホ・電化製品)
-
12
2つのテーブルに共通するレコードを削除したい
Access(アクセス)
-
13
EXCELの近似曲線で対数近似、指数近似が選べない
Excel(エクセル)
-
14
エクセル(Excel)で、数値を一定の有効数字で表示したいのですが…
Excel(エクセル)
-
15
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
16
エクセルの対数グラフで細かい目盛を入れる方法
その他(ソフトウェア)
-
17
エクセルVBA データ型 SingleとDouble
Excel(エクセル)
-
18
ExcelVBAでテキストボックスの表示形式を小数点第二位まで表示する方法
Visual Basic(VBA)
-
19
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
20
エクセルで四捨五入した数値に小数点以下第1位の0を表示させ、文字と合わせて表示させる方法
Excel(エクセル)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
COBOLのMOVEで桁数が異なる場合
-
5
RS232cデーターをエクセルに落とす
-
6
プログラムについての質問です...
-
7
VBAでテキスト出力時のスペース...
-
8
アクセスでエクセルに出力する...
-
9
cout と cerrの違い
-
10
VBAで有効数字の設定
-
11
VBAのExecメソッドで画面を非表...
-
12
テキストファイルから特定の文...
-
13
MMDでavi出力が出来ない
-
14
CRC16計算について
-
15
printfとputcharの違いは
-
16
コンセントの電力は入力と出力...
-
17
エクセルVBAにて アルファ...
-
18
makeで文字化けする。migwのmak...
-
19
printfですぐに出力
-
20
VBA セル内で改行またはカンマ...
おすすめ情報
公式facebook
公式twitter