• ベストアンサー

EXCEL-VBA の round関数

EXCEL-VBAで Cells(1, 1) = Round(Cells(3, 3), 0) として、 C3 に28.5 を入力し、上のマクロを実行すると、 A1には、28と表示されてしまいます。 ワークシート関数の =round(c3,0) を他の適当なセルに入力すると、 その返り値は、29 とちゃんとなります。 c3が 28.5001 とかだと両者ちゃんと 29 となります。 これは、VBA関数のバグなりスペックなのでしょうか?

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

  • ベストアンサー
  • arata
  • ベストアンサー率49% (139/279)
回答No.3

これは、バグではなく、仕様です。 Roundは四捨五入ではなくて、丸めを行うもので、Excelでは、算術型の丸めを、VBでは、銀行型の丸めを行うようになっています。 銀行型の丸めは、0.5は偶数になるようになっています。 元の値 |0.4|0.5|0.6|1.4|1.5|1.6 --------------------------------- 算術型 | 0| 1| 1| 1| 2| 2 --------------------------------- 銀行型 | 0| 0| 1| 1| 2| 2 ですから、結果は上記のようになります。 四捨五入では、0.1~0.4の四つが切り捨て、 0.5~0.9の5つが切り上げになりますから、 値が大きくなる傾向がありますが、銀行型では 切り上げと切り捨ての交互になるため誤差が 四捨五入より、小さくなることが期待できる ようになっているのです。 ExcelのVBAでエクセルのシートのRoundと 同じ計算がしたい場合は、 Cells(1,1).Value = Application.Round(Cells(3,3).Value,0) のように、Roundの前に、Application.を付けて シートの関数を使うようにするのが簡単だと思います。

参考URL:
http://www.microsoft.com/JAPAN/support/kb/articles/J045/8/59.htm
komatta_kun
質問者

お礼

ありがとうございます。「丸め」と「四捨五入」、一般人にはどうも同じに思えてしまいます。別の関数にするとかしてほしいですよねぇ。

その他の回答 (2)

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.2

18.5以外でも、数値の整数部分が偶数であれば、同様の現象が起こるみたいですね。 ヘルプには -+-+-+-+ 機能 指定された小数点位置で丸めた数値を返します。 -+-+-+-+ とあり、四捨五入とは一言も書いていないため、厳密に言えば間違いではないですが、一般常識的観点からすれば、どう見てもバグですよね(笑)。 ちなみに、ワークシート関数のRoundのヘルプには、四捨五入すると書いてありました。 で、解決策としては、四捨五入する版のRound 関数を自作してみてはいかがでしょうか。 方法とかわからなければ、補足していただければ私が作ってもいいです。

komatta_kun
質問者

お礼

ありがとうございます。他の方にいただいたように、「丸め」と「四捨五入」は違うらしいですね。

noname#1296
noname#1296
回答No.1

 スペックだそうです。MicrosoftのKnowledgeBassでもありました。丸めの方法で誤差を無くす為に結果が常に偶数になるようにしているみたいです。ISOかなんかでも認定されている方法らしいです。Excelだけに限らずAccessなどのVBAでも同じです。  ワークシート上でも同様になるのならしょうがないかなとも思うんですが、なんか納得いかないですよね。

komatta_kun
質問者

お礼

ありがとうございます。そうですよねぇ、なんかまぎらわしいですよねぇ。

関連するQ&A

  • Excel関数、VBAについて

    関数、VBAを学び始めた初心者です。 カレンダーを作成しました。その日の天気を簡単に入力する方法を教えて下さい。 セルA1にセルG1に入力されている(晴、曇、雨)のいずれかをクリックして入力する関数式。又はマクロ。 よろしくお願い致します。

  • Excel2010VBAのセルの入力が遅い

    Excel2010のVBAなんですが、処理時間が非常に遅いです。プログラムの中でも遅い部分はセルに入力する部分です。多分24時間ぐらいプログラムを走らせておきましたがそれでも終わっていませんでした。 シートは6個あり、それぞれ関数の計算がされており、シート1からシート3までの計算されたものがシート4に出力され、そのシート4からプログラムで計算してシート5に出力されるコードです。 シート5に出力するデータは、「年」、「月」、「日にち」、「時刻」、「データ1」、「データ2」、「データ3」、「データ4」の8つの項目です。これは全ての行に入力するわけではなく、入力しなくてもいい空白の部分もあります。空白でもいいセルには入力の処理はしないようになっています。 処理時間が遅いというのは、データ量が非常に多いということもあるのですが最初に参照するデータは50万件以上(実際はこれよりはるかにあるのですが区切っています。)あります。 全てのコードはここには記載しませんが、特に遅いセルの入力の部分は、次の通りです。 For~ With Workbooks("ブック名.xlsm").Worksheets("シート5") .Cells(b, 1) = Year(日付) .Cells(b, 2) = Month(日付) .Cells(b, 3) = Day(日付) .Cells(b, 4) = TimeValue(日付) .Cells(b, 5) = Application.Round(データ1, 3) .Cells(b, 6) = Application.Round(データ2, 3) .Cells(b, 7) = Application.Round(データ3, 3) .Cells(b, 8) = Application.Round(データ4, 3) End With Next この部分の処理を早くするにはどうしたらいいでしょうか? 回答よろしくお願いします。

  • Excel2000 関数でセルに色をつけたい。

    Excel2000を利用しています。 セルの計算結果によってそのセルに色をつけたい(塗りつぶし)と思っています。 関数のみでセルに色をつけることは可能でしょうか? ユーザー関数(マクロやVBAを利用する?)を使わないと無理なのでしょうか。

  • Excel2000とExcel2002のVBAの違いについて。

     以前、このカテゴリーにて、Excel2000におけるVBAのマクロを教えてもらったのですが、そのマクロ入力済みエクセルファイルをExcel2002へ移植したら、上手くVBAが働きません。  具体的にいうと、シート1に入力したデータの履歴を、シート2にて保存していくマクロなのですが、Excel2002では履歴のシートに上書きしていくことがあります。(たまに発生する)  Excel2000ではキチンと履歴のセルが全て残ります。  どなたか、この不具合を認識しておられる方。もしくは、対策をご存知の方がいらっしゃいましたら、教えてください。  

  • エクセルVBAでワークシート関数のようにしたい

     例えば、セルA1に日付を入力して、セルB1に関数WEEKDAYが入力されていると、すぐセルA1の値を返してくれますが、これと同じことをVBAで再現したいのですが、可能でしょうか?  マクロやVBAでWEEKDAYを記述しても、「ツール」→「マクロ」→「マクロ」か「VBA」でやらないとA1の値をB1に返せないので、A1に日付を入力した瞬間、B1に値を返したいのですが、よろしくお願いします。

  • 【VBA】ユーザ定義関数が動かない

    【VBA】ユーザ定義関数が動かない 下記のようなプログラムをVBEの標準モジュールに記述して、 ワークシートの適当なセルに「=tc("aa","bb")」と入力してEnterを押した所 セルの表示が「=tc("aa","bb")」となってしまい狙った効果が得られません。 本当は、「aabb」と表示させたいのですが、なぜうまくいかないのでしょうか。 ご教授願います。 ◆関数の仕様  引数1と引数2に入力された文字列を連結して返り値として返す。 ◆コード Function tc(str1 As Range, str2 As Range) As String Dim Str As String Str = str1.Value & str2.Valuett tt = Str End Function

  • マクロ:エクセルVBAでのワークシート関数の参照について

    VBA内でワークシート関数を使用する際の、引数の参照について困っています。 満たしたい条件は、 (1)マクロ実行後のシート上においても、セル選択状態で数式「=B1*sum(A1:A3)」 といったように、「値」ではなく、「数式」が入力されているようにしたい。 ↑ Application.WorksheetFunction.Sum(・・・は使えない? (2)上記例のB1およびA1:A3については、マクロ内のユーザ入力によって位置が変わり、C1にもD1にもなり得るので、 cells(1,1)="=B1*sum(A1:A3)" といった「B1」[A1:A3]的な参照を使いたくない。 イメージとしては、 sub sample() number = inputbox("数字を入力してください") cell_a = inputbox("セル1") cell_b = inputbox("セル2") yourrange = range(cells(cell_a,1),cells(cell_b,1) cells(1,1)="=number*sum(yourrange)"・・・※ end sub みたいなことをしたいのですが、※のようなことを する方法はありますでしょうか? 説明が下手なもので、補足等あれば随時いたします。 使用環境はWindows2000、Office2000です。 よろしくお願いします。

  • excel2000のVBAについて

    excel2000でコマンドボタン(command1)をclickすると VBAの command1_click関数の処理をするという マクロをVBAで作成したいのですが、 (1)excelシート上にコマンドボタンの作成方法 を教えてください

  • EXCEL関数で指定セルに入力方法

    EXCEL関数で指定したセルに別のセルの値をコピーしたり、そのまま入力した数値が自動的に指定したセルに書き込まれる(リンクは張らずに)といった関数はないのでしょうか?マクロ処理であれば簡単のですが、マクロ無しで使いたいとおもいまして。

  • 【Excel VBA】携帯番号へ一括でハイフン挿入

    ExcelのC列に携帯番号の一覧が400件程度入力されています。 番号が入力されたセルに触れると頭のゼロが取れてしまう為、C列全体の携帯番号を、4桁-3桁-4桁で間にハイフンを一括挿入したいです。 当該ブックのデータは加工して使用します。その加工処理のため、VBAを用いているのでExcel関数ではなくVBA希望です。ただマクロ初心者で上手くコードが書けません。コードを、ご教示頂けますと助かります。

専門家に質問してみよう