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も見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
有効数字N桁のマクロについて
Word(ワード)
-
エクセルで有効桁を指定して丸めることは出来る?
Excel(エクセル)
-
VBA:小数点以下の数字を取得できる関数は?
Visual Basic(VBA)
-
-
4
最も近い数値のあるセルを探す
Excel(エクセル)
-
5
範囲指定した箇所の数値を一括で四捨五入したい
Excel(エクセル)
-
6
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
7
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
8
Excel VBA ListViewサブアイテムの文字色
その他(プログラミング・Web制作)
-
9
split関数で区切り文字がない場合
Visual Basic(VBA)
-
10
VBAでユーザーフォームの表示を確認
Visual Basic(VBA)
-
11
Log関数に関する質問
Visual Basic(VBA)
-
12
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
13
VBAでファイルを開くときにファイル名でワイルドカードを使用したいです
その他(プログラミング・Web制作)
-
14
vba listviewにおけるtextのAlingmentを中央にしたい
Excel(エクセル)
-
15
エクセルvbaでdocuworksprinterの出力先を設定
Visual Basic(VBA)
-
16
EXCELで特定のセルに表示された項目をヘッダーやフッターに出力するには
Excel(エクセル)
-
17
リストビューをスクロールさせるには
Visual Basic(VBA)
-
18
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
19
エクセルの対数グラフで細かい目盛を入れる方法
その他(ソフトウェア)
-
20
文字列内で括弧を使うには
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
AIに回答させるって
-
KEYENCEのシーケンスプログラム...
-
cout と cerrの違い
-
プログラムについての質問です...
-
printfとputcharの違いは
-
VBAのExecメソッドで画面を非表...
-
ListViewの複数選択について
-
バッチファイル フォルダサイ...
-
printfの書式%.*s
-
C# 標準出力のencodingをutf8に...
-
Windows Formアプリからコンソ...
-
ブランキング期間
-
AviUtl 出力の失敗
-
汎用人型決戦兵器「人造人間エ...
-
ACCESS クエリ→フォーム...
-
標準出力の上書き
-
C言語の標準関数の引数の順番に...
-
CRC16計算について
-
最近の画像生成AIについて。 長...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
コンセントの電力は入力と出力...
-
MMDでavi出力が出来ない
-
OBS配信すると、マイクが途切れ...
-
VBAでテキスト出力時のスペース...
-
cout と cerrの違い
-
COBOLのMOVEで桁数が異なる場合
-
ACCESS クエリ→フォーム...
-
アクセスでエクセルに出力する...
-
VBAのExecメソッドで画面を非表...
-
テキストファイルから特定の文...
-
Windows11対応の3入力1出力 USB...
-
VBAで有効数字の設定
-
スマホのバッテリー消費につい...
-
Excel VBAで値を変えながら、pd...
-
NTTのホームゲートウェイとOCN...
-
定格冷房能力(出力)とは 定格...
-
プログラムについての質問です...
-
PS5をMacBookProに出力したいの...
おすすめ情報