
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) マクロだと数式が表示される 2 2022/09/10 14:48
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2022/04/01 12:11
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/02 10:20
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Visual Basic(VBA) vbaについて 主に以下のような設定をしたいです。 Aブックの表の行数が20未満だったら Bブックの 1 2023/06/08 23:40
- Excel(エクセル) エクセルのセルの書式設定・ユーザー定義の条件設定について 1 2022/08/17 21:56
- Excel(エクセル) エクセルでシート保護のかかり方の違いとセルの非保護の設定 3 2022/08/09 10:02
- Visual Basic(VBA) VBA初心者です。 VBAで行単位で条件付き書式の色をカウントしたいです。 大量のデータがあるExc 3 2022/06/08 10:00
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
プログラムについての質問です...
-
4Kの外部モニターに出力すると...
-
Accessのテーブルからcsv出力す...
-
TV出力ポートをOFFにすれば良い...
-
cout と cerrの違い
-
COBOLのMOVEで桁数が異なる場合
-
標準出力の上書き
-
真空管 300 B の前段について
-
FLEXSOLARパネルからAmazonで買...
-
スマホ充電器購入にあたり
-
海外の110Vの電気製品を日本で...
-
C#でアクセス権限の取得方法が...
-
Aviutlの連番BMP出力方法
-
アクセスでエクセルに出力する...
-
中国の電子レンジの火力は何ワ...
-
printfとputcharの違いは
-
DirectShowで出来るだけ速くコ...
-
無線とかアンテナに関しの質問...
-
PD充電器について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
プログラムについての質問です...
-
PD充電器について
-
cout と cerrの違い
-
スマホ充電器購入にあたり
-
Accessのテーブルからcsv出力す...
-
MMDでavi出力が出来ない
-
printfとputcharの違いは
-
VBAのExecメソッドで画面を非表...
-
TV出力ポートをOFFにすれば良い...
-
COBOLのMOVEで桁数が異なる場合
-
VBAでテキスト出力時のスペース...
-
ACCESS クエリ→フォーム...
-
coutで出力した文字を消去する...
-
4種類(A4縦、A4横、A3縦、A3横)のヘ...
-
Windows Formアプリからコンソ...
-
コンセントの電力は入力と出力...
-
C#でアクセス権限の取得方法が...
-
【VBA】PDFを2in1で出力したいです
おすすめ情報