エクセル2013です。
A1セルからA100セルにすべて1%と入力されています。
BIセルに
=SUM(A:A)
と数式が入っており、100%と表示されています。
A,B列のセルの書式はすべてパーセテージです。
101行以下には何も入っていません。
C1セルに
=B1=1
と数式が入っており、TRUEが表示されています。
標準モジュールに
Sub test01()
MsgBox Range("B1").Value = 1
End Sub
と書きました。
実行したところFalseが帰ってきました。
なぜ、TRUEにならないのでしょうか?
なお、
Sub test02()
MsgBox Val(Range("B1").Value) = 1
End Sub
とすると、TRUEが帰ります。
でも、Val関数はStringを数値化するものですよね?
B1セルはもともと数値なのでVal関数で答えが変わるのも不思議です。
どなたか、わかるように教えていただけないでしょうか?
No.2ベストアンサー
- 回答日時:
本当に正確・詳細な仕様(内部計算)のこととなると、Microsoft の社員でなければ説明できないかもしれませんが、分かっていることについて書きます。
Excel では、小数の計算をするとき、誤差がある程度小さい場合に、自動的にそれを除去するという機能があります。申し訳ないですが、詳しい発動条件は説明できません。それらしいケースがあるのは確かだと分かっているだけです。
参考 URL を参考にしてください。ページ中、5 ~ 6 割くらい進んだ位置に、「実は、エクセルには自動的に……」と述べられています。できればページ全部を読んでみることをお勧めします。
>=ROUND(SUM(A:A),100) としても……が、TRUEを返すのはなぜでしょう?
先ほどの Val 関数というのは丸めることが目的の関数ではないわけですが、結果として、数値から誤差が取り除かれていました(いたようでした)。同様に ROUND も、何桁であろうとも、関数を通すだけで誤差を取り除いてしまうと考えるほかないのではないかと思います。
他のセルの Value プロパティに、SUM による誤差を含む計算結果を放り込むということをしても、誤差は消えているようです。そこから更に 1 を引いて 10^16 を掛けても、結果は 30 桁、ゼロ行進です。
一般には、このような微小な差分や関数の性質まで含めて考えるとなると、ワークシート上の数式と VBA プロシージャでの計算の双方で、同様な処理を行ったとして、両者の挙動が一致する保証、あるいは一致しない保証は、ないと思います。
誤差が発生する可能性の有無が不明な場合は、参考 URL でも言及されていることですが、適度な桁数で ROUND しておけということですね。発生し得るのは小数の場合のみですから、整数化しておけば安心です。ただし整数ではなく小数点以下に何桁か残す場合の、ROUND による計算結果も誤差を含む場合があるという問題が実はありますが。
>ますますわからなくなってきました・・・・・。
正直、キリがなくなりますんで、あまり深く考えないことをお勧めします。ご関心があるようなら、追々研究していくという方針がよろしいかと。
参考URL:http://pc.nikkeibp.co.jp/pc21/special/gosa/eg1.s …
ありがとうございます。
参考URL読ませていただきました。
小数点以下も扱うので、今回はB1セルの数式を =Round(SUM(A:A),8) として対応しました。
よいお年をお迎えください。
No.1
- 回答日時:
どこかのセルに、=(b1-1)*10^14 と記入してみてください。
計算誤差が発生していることが分かります。小数を交えた計算では、こういうことが起こり得ます。B1 セルの数式を =round(SUM(A:A),5) といった感じに丸めるように書き換えて、もう一度 MsgBox Range("B1").Value = 1 を実行してみてください。今度は True になると思います。
VBA の Val 関数が型変換の過程で、丸めてしまうのですかね。しかしワークシート関数の VALUE で SUM の戻り値を処理しても、True にはなりませんでした。
ありがとうございます。
=(B1-1)*10^14 でエクセルの計算誤差が見えました。
0.0666133814775094
が返りました。
ただ、それならなんでワークシート上では
=B1=1
が、TRUEを返すのでしょう?
また、計算誤差部分を丸めないように
=ROUND(SUM(A:A),100)
としても
MsgBox Range("B1").Value = 1
が、TRUEを返すのはなぜでしょう?
ますますわからなくなってきました・・・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Excel(エクセル) エクセルVBAでセルに表示されているとおりの数値を取得したい(時間の計算結果) 1 2022/03/30 17:52
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) エクセルの関数式を教えてください。 2 2022/11/29 21:09
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) 複数シート一括作成後に、特定範囲の数式は値で貼り付けしたい 3 2022/10/07 11:18
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ヘッダー
-
エクセルの使い方 1日=7時間45...
-
IF関数で、時間を条件にしたい...
-
AかBに入力があった時Cに反映、...
-
エクセルで 足し算や割り算の...
-
Excelの計算式内の文字列の一括...
-
エクセル 1万時間を越える際の...
-
EXCELの関数に関する質問です
-
エクセルでの時間計算(2時間30...
-
多項式の計算
-
IF関数で出した数値をSUM関数で...
-
計算結果が「0」のセルだけを「...
-
【エクセル】あるセルのみ自動...
-
数式の計算結果により表示され...
-
excel 参照しているセルに色が...
-
エクセル 月数を0.5ヶ月単位で...
-
エクセル・計算式をテキストデ...
-
エクセルで足し算と掛算を混ぜ...
-
エクセルで、時間の計算をした...
-
エクセルの計算結果が0になって...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ヘッダー
-
IF関数で、時間を条件にしたい...
-
エクセルの使い方 1日=7時間45...
-
エクセルで、時間の計算をした...
-
エクセルで 足し算や割り算の...
-
エクセルでの時間計算(2時間30...
-
EXCELの関数に関する質問です
-
計算結果が「0」のセルだけを「...
-
エクセルの計算結果が0になって...
-
数式の計算結果により表示され...
-
Excel 関数? 文字列に...
-
Excelの計算式内の文字列の一括...
-
TEXTCALCの使い方
-
エクセル・計算式をテキストデ...
-
エクセル 1万時間を越える際の...
-
エクセル 月数を0.5ヶ月単位で...
-
AかBに入力があった時Cに反映、...
-
多項式の計算
-
エクセルで足し算と掛算を混ぜ...
-
エクセルで比率を計算
おすすめ情報