• ベストアンサー

VB 四捨五入の結果が Windows98 とXPで異なる

VBで単価×数量=金額で金額は小数点以下四捨五入にしたく下記プログラムを書きました。 DIM cAMNT AS CURRENCY DIM cPRIC AS CURRENCY DIM lQTY AS LONG cAMNT = cPRIC * lQTY cAMNT =FORMAT(cAMNT,"########") 金額小数点以下が.5の場合のみ印刷すると下記の結果になります。 OSがWINDOWS98 WINDOWS2000 の場合 Code Price Qty Amount AAA 1.5 3 5 AAB 0.49 3 4 合計 9 OSがWindowsXP PRO の場合 Code Price Qty Amount AAA 1.5 3 4 AAB 0.49 3 4 合計 8 XPのパソコンで動かした場合求める結果が出ません。 .5が切り捨てられます。 なぜでしょうか?宜しくお願いします

  • GA1
  • お礼率80% (21/26)

質問者が選んだベストアンサー

  • ベストアンサー
noname#4564
noname#4564
回答No.3

  オートメーションライブラリの「仕様変更」だそうです。(参考URL) さすがにこの「仕様」は不評だった(かなり叩かれた?)ようで、SP1では 元の仕様に戻ったようです。(笑) 四捨五入はFormat関数を使用しなくても、「端数に5を加算して切り捨てる」 ことで実現できます(というか、Format関数は文字列処理の関数なので、数値 演算に使用するのはどうかと思います)。 下記はその一例です。   Public Function GetRoundOff(ByVal curData As Currency) As Currency   If curData > 0 Then     GetRoundOff = Fix(curData + 0.5@)   Else     GetRoundOff = Fix(curData - 0.5@)   End If End Function  

参考URL:
http://support.microsoft.com/default.aspx?kbid=418691
GA1
質問者

お礼

早速のご回答どうもありがとうございます。 早速SP1を入れます。 Format関数、便利なので多用していますがこの辺も見直します

その他の回答 (2)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

Format関数はXPのSP1で修正されています。 でも、四捨五入は Int(n + 0.5)またはFix(n + 0.5) を使うべきでしょう。 http://www.nils.ne.jp/~ymatsu/program/vb/45.htm http://support.microsoft.com/default.aspx?scid=kb;ja;JP418691

GA1
質問者

お礼

どうもありがとうございます。 助かりました。

  • sPP
  • ベストアンサー率41% (5/12)
回答No.1

それはWindowsXPの仕様によるもののようです。 以下のマイクロソフトの技術情報をご覧下さい。 現在はWindowsXPにSP1を適用することで解決するようです。

参考URL:
http://support.microsoft.com/default.aspx?scid=kb;ja;418691

関連するQ&A

  • SQLの合計関数について

    お世話になります。 「価格(price)」と「個数(amount)」を掛けあわせてものの合計を取得したいのですがどのようにしたらよろしいでしょうか? | price | amount | ID ――――――――――― |  101 |  200 |0001 |  102 |  300 |0001 |  103 |  400 |0001 |  101 |  100 |0001 |  102 |  200 |0001 |  103 |  300 |0001 SELECT sum(price) as total FROM LIST Where id= '0001'; 上記の場合ですとpriceの合計だけなのですがこれを各行ごとに「price * amount」をしたものの合計を求める方法をご教授頂けたら幸いです。 よろしくお願いいたします。

  • ネットビジネスのエクセルの切上・切捨て・四捨五入

    ネットビジネスのエクセルの切上・切捨て・四捨五入について? 商品名| ドル |仕入金額 |販売金額| 手数料| 粗利益 | 販売日| 商品A |27.99 |2953.3 |5980 |837 | 2189.7| 5月5日| 商品A |27.99 |2953.3 |5950 |836 | 2160.7| 5月6日| 商品A |27.99 |2953.3 |5800 |830 | 2016.7| 5月7日| 商品A |83.97| 8860 | 17730 | 2503 | 6367 | 私は商品Aを海外から輸入しました。3個の合計は83.97ドルです。円建てで8860円です。ですから、一番良いのは、 (販売金額)17730-(仕入金額)8860-(手数料)2503=(合計)6367とエクセルに記入することかと思います。 しかし、販売金額も手数料も販売日も違います。ですから、粗利益もばらばらです。ゆえに、上記のように1個づつ分割記入せざるを得ません。そこでお聞きしたいのですが、 質問1仕入金額の合計は8860円ですが、3個で割った場合、2953.33333....となってしまうので、小数点2位以下を切り捨てて書いています。これは、小数点以下を切り捨てて2953円。切り上げて2954円にするのはどちらがよいのでしょうか? 質問2仕入金額や粗利益のように小数点がある数字を他の商品とsum関数で合計すると、1098765.45983とかいう具合に小数点が長くなり数字も狂ってくると思うのですが?こういう場合は、どうすればよいのでしょうか?やはり、切上や切り捨てを事前にしておくのでしょうか? 詳しい方教えてください。

  • エクセル:四捨五入した場合は100%じゃないですよね?

    仕事でアンケート結果をエクセルにて集計しているのですが、疑問があります。 好きな果物は?という質問で、下記のような表を作成したとします。 果物   人数  割合 ------------ イチゴ  37   42.0% りんご  16   18.2% スイカ  8    9.1% その他  12   13.6% 無回答  15   17.0% ------------ 合計   88   100% 割合は小数点第二位から四捨五入しているので 足しても100%にはなりません。 しかし、累計に漏れは無いということを示す便宜上、合計は100%と表示しています。 (変かもしれませんが、そうしろって言われてるんです。) そこで、なんですが、この%って、合計すると100.5%を越すことってあるんでしょうか? その場合だと101%になってしまいますよね。 他の人は、電卓を使ってわざわざ%を縦に足していって 100.5に満たないことを確認してるんですが、 数式が間違ってない限り100.5%を越したことはありません。 だから私はどうせ100%と表示するのだからそんな計算しても意味が無いだろうと思って 各項目の割合部分の数式がちゃんと入っているかどうかだけ確認してます。 数学的な問題なのだと思いますが…教えてください!

  • VB6のTYPE文をVB.NETのStructureに変えるとき

    VB6のTYPE文をVB.NETのStructureに変えるとき 下記VB6のコードをVB.NETのStructureに変える場合 Type kouzou1 i As Integer j As Integer a As String * 20 b As String * 50 End Type を下記にしてみたのですが *20,*50のところは、どのように表現するのでしょうか。 Structure kouzou1 Dim i As Integer Dim j As Integer Dim a As String * 20 <- ステートメントの終わりを示してくださいのエラーになる。 Dim b As String * 50 <- ステートメントの終わりを示してくださいのエラーになる。 End Structure お教え下さい。

  • VB6.0での小数点の扱いについて

    現在、VB6.0を使用しており、小数点の扱いに困っています。 Sub Keisan() Dim A As String Dim B As String Dim C As String A = 1.29033 B = 1.91458 C = CStr(A + CDec((B - A) / 6) * 3) MsgBox C End Sub 上記のプログラムを実行すると、 「1.602455000000001」と表示されますが、 電卓を用いて計算すると、 「1.602454998・・・」となり、微妙に誤差が出てしまいます。 小数点を整数にして計算→元の桁数に戻す、という 処理を行うと、誤差なく求めることが出来ましたが、 「もっとスマートなコードにして」と言われてしまいまして どうしたものかと思っております。 この誤差を解決する方法は無いでしょうか?

  • Access2003 一つのクエリで結果を出したい

    お世話になります。 下記テーブルを紐付けてクエリを作成します(Access2003)。 受注テーブル  ・ID  ・コード  ・数量 検品テーブル  ・ID  ・コード  ・検品フラグ マスターテーブル  ・ID  ・コード  ・印刷フラグ 検品テーブルのレコードは、受注テーブルの数量合計が展開されたレコード数となります。例えば、AAAというコードで数量合計が8の場合、検品テーブルではAAAのレコードが8レコード存在することになります。 但し、マスターテーブルの印刷フラグがYesとなっているものは、数量がいくつあっても受注テーブルは1レコード作成されます(数量合計で展開しない)。  受注テーブル   ID コード 数量   1  AAA   5   2  AAA   3   3  BBB  100  検品テーブル   ID コード 検品フラグ   1  AAA   Yes   2  AAA   Yes   3  AAA   Yes   4  AAA   Yes   5  AAA   Yes   6  AAA   Yes   7  AAA   No   8  AAA   Yes   9  BBB   Yes  マスターテーブル   ID コード 印刷フラグ   1  AAA   No   2  BBB   Yes こんな感じです。 そこで各テーブルをコードで紐付けてグループ化し、検品フラグYesで抽出した状態で以下の結果を表示出来るようにしたいところです。 コード 数量合計  AAA   7  BBB  100 要するに印刷フラグがYesのものは受注テーブルの数量合計を表示し、それ以外は検品された数を表示させたいと考えています。 あらかじめ受注テーブルでコードでグループ化し、数量の合計を算出するクエリ(※1)を作成し、そのクエリと検品テーブル、マスターテーブルを紐付けたらうまく表示出来ました。 ※数量合計はIIFで印刷フラグ=Yesの場合は※1の数量合計を、Yesではない場合は検品テーブルのレコードカウント数を表示。 しかし、できれば一つのクエリで上記の結果を表示させたいのですが、可能なのでしょうか。 ご教授お願い致します。

  • マクロ変数 single で小数点計算が狂います

    Windows8.1 エクセル2010です。 マクロを使っており、小数点の計算をしたいため、初めてsingle double の変数を使いました。 例として、 Sub シングル() Dim 足される As Single Dim 足す As Single Dim 合計 As Single 足される = Range("a1").Value 足す = Range("b1").Value 合計 = 足される + 足す Range("c1").Select ActiveCell.FormulaR1C1 = 合計 End Sub A1=2.1 B1=5.1 普通は7.2となるのですが、7.19999980926513 と出ました。 doubleに変数を切り替えたら、ちゃんと7.2と出ました。 singleの仕組みがよくわかりません。 有効桁数数は「7桁」なら、小数点第7位まで扱える…という単純なものではないのでしょうか?

  • 【VB】タスクマネージャでEXECELが残る件

    VisualBasic2008で、ボタンを押すとTest.xlsを開いて閉じるという簡単なプログラムを作成しています。 ワークブックのCloseとアプリケーションのQuitをしているのも関わらず ボタンを押す度に、タスクマネージャに『EXCEL.EXE』が増え、消えない状態です。 フォームを閉じると『EXCEL.EXE』は消えるのですが、 フォームを閉じない状態で、『EXCEL.EXE』を消すことはできないのでしょうか? 以下、コードです。 ----------------------------------------------- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim AAA As Excel.Application Dim BBB As Excel.Workbook Dim CCC As Excel.Worksheet AAA = CreateObject("Excel.Application") BBB = XL.Workbooks.Open("C:\Work\Test") CCC = XM.Worksheets(1) CCC = Nothing BBB.Close(SaveChanges:=False) BBB = Nothing AAA.Quit() AAA = Nothing End Sub ----------------------------------------------- 終了処理のコードが間違っていましたらご指摘ください。 わかる方いらっしゃいましたら、是非お願い致します。

  • VBA Functionについて

    アクセスです。 サンプルコードを見ていてよくわからないので教えてください。 サンプルコードはこちらです↓ ------------------------------------------- Public Function kakaku(cost As Currency, rate As Double) As Currency kakaku = cost / (1 + rate) End Function Sub M0108() Dim Zeikomi As Currency Dim Zeiritu As Double Zeikomi = InputBox("内税の価格を入力してください。") Zeiritu = InputBox("税率を入力してください。") MsgBox (kakaku(Zeikomi, Zeiritu) & "円") End Sub ------------------------------------------- M0108を実行してみたら納得いく結果になったので問題ないのですが kakaku関数についてよくわかりません。 cost / (1 + rate) とはどういう意味なのでしょうか? costもrateも値が代入されていませんが、 この二つの変数は何の意味があるのでしょうか? ご教授よろしくお願いします。

  • VBAでオートフィルタ後の計算

    オートフィルタ後に35列(整数)、38列(小数)の集計を行ったところ、38列にて"実行時エラー'1004'が発生します。 For Each cel ~ next文に誤りがあると思われます。ご教授ねがいます。 Dim 合計金額 As Currency Dim 合計容量 As Single ' 合計金額 = 0 合計容量 = 0 ' ' 該当日付選択 選択日付 = InputBox("該当日付を入力してください。例:2008/09/01") ' 該当日付と作成年月日(Fielsd:37)をマッチング With Worksheets("明細") .Range("a1").AutoFilter Field:=37, Criteria1:=選択日付 Selection.Offset(1).Resize(Selection.Rows.Count - 1).Select ' Selection.Columns(35).SpecialCells(xlVisible).Select For Each cel In Selection 合計金額 = 合計金額 + cel.Value Next ' Selection.Columns(38).SpecialCells(xlVisible).Select For Each cel In Selection 合計容量 = 合計容量 + cel.Value Next End With