アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBAで一桁目を四捨五入する方法を教えてください。


12345 →12350
124→120
34219→34220
322.5567→320
-22.553→-20

普通に考えると10で割って
整数にして元の数値から引き算して
if文で5以上か未満を判定ということになると思うのですが
もっとスマートなやり方ありますか?

format関数とかでできるのでしょうか?

A 回答 (4件)

A=12345


A=Int((A+5)/10)*10
で、おおむねいいのですが、-105 が、-110でなく-100になります。
-105を-110にしたければ、
A=Sgn(A) * Fix((Abs(A) + 5) / 10) * 10
のように符号を明示的に見ないといけません。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2015/05/23 12:20

No.2です。



>worksheetfunctionを使わない方法で・・・
というコトですので、↓のような感じではどうでしょうか?

Sub Sample3()
Dim i As Long
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
Cells(i, "B") = Round((Cells(i, "A") + 0.5) / 10, 0) * 10
Next i
End Sub

※ 細かい検証はしていませんので、
お望み通りにならなかったらごめんなさいね。m(_ _)m
    • good
    • 0

こんにちは!



>VBAで一桁目を四捨五入する方法を教えてください。

普通にやるとワークシート関数のROUND関数で大丈夫だと思いますが、
わざわざ「VBAで・・・」と質問されているのは
「算術型」の丸めではなく、「銀行型」の丸めをお望みなのでしょうか?

仮にA1セル以降にデータがあり、B列に丸めた結果を表示したい場合は
普通にワークシート関数をそのまま使うのが手っ取り早いので

Sub Sample1()
Dim i As Long
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
Cells(i, "B") = WorksheetFunction.Round(Cells(i, "A"), -1)
Next i
End Sub

といった感じになると思いますが、
「銀行型丸め」(VBA)をご希望の場合は、整数部分での丸めはできないはずですので
一旦10で割り、小数点以下第一位を丸める → その結果を10倍する
といった方法にしてみてはどうでしょうか?

Sub Sample2()
Dim i As Long
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
Cells(i, "B") = Round(Cells(i, "A") / 10, 0) * 10
Next i
End Sub

※ 一の位が「5」の時が要注意です。
Sample1 と Sample2 で比較してみてください。
元データが「12345」の時、
Sample1では 12350 となりますが、
Sample2では 12340 になります。

自分もその違いを詳しく説明できないので、
ネットで「銀行型丸め」で検索してみてくだい。m(_ _)m
    • good
    • 0
この回答へのお礼

すいません、言い忘れました
worksheetfunctionを使わない方法で
教えてください。

 お願いいたします。

お礼日時:2015/05/22 16:50

Excel なら


v=-22.5
msgbox worksheetfunction.round(abs(v),-1)* iif(v>0,1,-1)
では?
次回からは使用ソフトウェア名とバージョンを明記してください。
    • good
    • 0

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