次の方法で共有

Excelで同一の15桁の整数同士を比較した際にFALSEが返ってくる

Anonymous
2025-02-04T23:37:40+00:00

-事象

とあるExcelブックで生じた「おかしなセル」(外見:100000000000000)をコピーして、新しいブックのSheet1のA1セルに値貼り付けしたあと、
同A2セルに100000000000000を手入力し、

A3セルに「=A1=A2」という数式を入力すると、FALSEが返ってくる。

なお、A1セルで一度F2キーを押して、特に入力内容を変えずにEnterを押すと、A3セルがTRUEを返すようになる。

A1セルのValueプロパティを確認すると100000000000001が返ってくる。

-事象のキャプチャ動画: https://video.twimg.com/ext_tw_video/1886918772327636992/pu/vid/avc1/854x480/zL00zCKVV-9I7pU0.mp4

-事象が生じたExcelファイル: https://83.gigafile.nu/0210-be44934d93926498f9ef3fab26f1b0948

-質問

この現象(外見とValueプロパティが1ズレる現象)の発生要因(どうすれば再現できるか⇒発生を回避できるか)を教えてください。

Microsoft 365 と Office | Excel | その他 | Windows

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

motosan 3,230 評価のポイント
2025-02-05T23:18:05+00:00

今一つわかりにくいですが、参考になりそうな記事です。

データ型の概要 | Microsoft Learn

通貨データ型(Currency) | Microsoft Learn

Double データ型 | Microsoft Learn

Range.Value2 プロパティ (Excel) | Microsoft Learn

Range.Value2 プロパティの記事の注釈にあるように

セルには倍精度浮動小数点型として格納されます。

つまり、丸められます。

Value プロパティに代入した場合も Variant(Double)となりますが、丸め方が違うようです。

(有効数字15桁に丸めてから格納している?)

具体的には下記のようになります。(末尾の@はCurrency型を示します)

.Value2 = 100000000000000.4999@

.Value2 → Currency型の変数へ代入した場合、100000000000000.5 となります。

.Value = 100000000000000.4999@

.Value → Currency型の変数へ代入した場合、100000000000000 となります。

これはバグではなく、仕様のようです。

ご参考までに

追記)

Currency型でなくDouble型でもValue2 プロパティに格納した場合は同じようになります。

.Value2 = 100000000000000# + 0.4999

失礼しました。

この回答は役に立ちましたか?

2 人がこの回答が役に立ったと思いました。
0 件のコメント コメントはありません

6 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2025-02-06T13:51:42+00:00

    ありがとうございます。

    お聞かせいただいた情報を咀嚼し、①~③のように理解いたしました。

    ①Valueに100000000000000.4999(10)を入力すると、
    あるいはセルに100000000000000.4999(10)を手入力すると、
    「有効な数字 15 桁のみを格納し、15 位以降の桁をゼロに変更します」というルールに則り
    100000000000000(10)がセルに格納される。

    ②Vlaue2に100000000000000.4999(10)を入力すると、
    「IEEE 754 仕様に準拠」して丸められ、
    42d6bcc4(IEEE 754倍精度)=100000000000000.5(10)がセルに格納される。

    ③42d6bcc4(16)=100000000000000.5(10)が格納されたセルのValue又はValue2を参照すると、15桁に四捨五入により丸められた100000000000001を返す。

    他のセルから数式により参照される場合も、100000000000001として扱われる。

    Excel のセルに長い数値を入力すると最後の桁がゼロに変更される | Microsoft Learn<br><br>「Excel は、浮動小数点数の格納および計算方法について IEEE 754 仕様に準拠しています。 したがって、Excel は、数値に有効な数字 15 桁のみを格納し、15 位以降の桁をゼロに変更します。」

    「15 位以降の桁をゼロに変更します。」と説明しているのに、実際にはそのとおり取り扱っていないのだなぁという感想を抱きました。

    この回答は役に立ちましたか?

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  2. Anonymous
    2025-02-05T02:51:24+00:00

    ありがとうございます。

    元のセルの値は小数点以下の数字を含む値の加減算の結果の数値であり、再現してくださった状況に近いものと存じます。

    小数を含む16桁以上の演算結果が15桁に丸められた場合、表示上のデータと内部データが相違する仕様(バグ?)があるのですね。

    拡張子xlsmをzipにして中身のxmlデータを確認したところ、
    100000000000000.5
    が格納されておりました。

    大変参考になりました。

    この回答は役に立ちましたか?

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  3. motosan 3,230 評価のポイント
    2025-02-05T02:33:50+00:00

    massanpc さま

    セルの値をどのように作成したか不明ですが、

    無理やりマクロでその状況を再現してみました。

    Excel2019 です。

    マクロ

    Sub a() <br><br> Dim x As Currency <br><br> <br><br> x = 100000000000000# + 0.4999 <br><br> <br><br> With Range("A1") <br><br> Debug.Print x <br><br> .Value2 = x <br><br> Debug.Print "Value=" & .Value <br><br> Debug.Print "Value2=" & .Value2 <br><br> End With <br><br>End Sub

    実行結果です。

    ご参考になれば、幸いです。

    この回答は役に立ちましたか?

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  4. Anonymous
    2025-02-05T00:05:02+00:00

    ご返信ありがとうございます。

    次の画像の「数値」を選択しても、セル上も数式バー上も100000000000000のままです。

    この回答は役に立ちましたか?

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません