VBAでの数字判定の違いについて

このQ&Aのポイント
  • VBAでの数字判定において、同じ数字でも異なると判定される現象が発生することがあります。
  • 人の目では同じ数字に見えるが、VBAでは異なる数字として扱われているためです。
  • 他の人が作ったファイルの数字を手入力すると正しく判定される場合もあります。
回答を見る
  • ベストアンサー

VBA 人の目には同じ数字に見えるのに、VBAは違う数字として判定してしまう

あるセルに1826.97792という数字が入力されており、 別のセルにも1826.97792と同じ数字が入力されています。 人間の目で見る限りまったく同じ数字です。 また、エクセル関数=if(・・・・・)で判定しても同じ数字という判定がでます。 しかしながら、VBAにて if セル1=セル2 then などとして比較すると、同じでないという判定結果になります。 どうしてこういうことが起きるのでしょうか? また、プログラムを書くうえでの対処方法はどうすればいいのでしょうか? ちなみに、数字は他の人が作ったファイルのもので、 改めて、手で入力しなおすと正しく判定されます。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 この前、同様の内容の質問が出ていました。 >if セル1=セル2 then >などとして比較すると、同じでないという判定結果になります。 おっしゃるとおり、そのままでは比較できません。 >1826.97792という数字が入力されており、別のセルにも1826.97792と同じ数字が入力されています。 これは、Double型です。Double型で、小数点が入っているので、無限小数が含まれていたりする可能性が高く、同じ数だと思っても違ってしまいます。(そのまま入力しても、入ることがあります) その対処法は、 例えば、 Dim a As Double Dim b As Long Dim c As Double Dim d As Long  a = Cells(1,1).Value  b = CLng(Fix(a * 100000))  c = Cells(1,2).Value  d = CLng(Fix(c * 100000)) というような、 方法で、一旦、小数点を固定してあげないと、比較できません。 なお、日付や時間値の場合は、Format$ 関数で、一旦、文字にして日時で比較する方法もあります。

VitaminBB
質問者

お礼

回答ありがとうございます。 色々確認した結果、やはり小数点以下何十桁あたりにごみが あるみたいです。

関連するQ&A

  • EXCELのVBAの数字。

    VBAで「Maisuu」に応じて、セルに表示される数字を制御するようにして有ります。 If iMaisuu > 1 Then suuji = Chr(48 + pg) End If というようなかんじにしてあるのですが、10を超えると数字が出なくなってしまいます。 これを回避するにはどうしたらいいのでしょうか? Win・Ex2000です。

  • VBAでブック保護非保護を判定するには?

    エクセルVBAでブックが保護されているのかどうかを判定するにはどう書けばいいのでしょうか? If ActiveWorkbook.Protect Then ではだめでした。 また、シート保護の判定方法も教えてください。

  • エクセルで条件に合わせて数字を合計

    エクセルの表にて、 セルに”○”が入っている場合は2、”×”が入っている場合は1で、その結果を合計したいのですが(例:○が3個・×が2個入ったセルがあれば、合計は8というふうに) 入力用と合計用に列を分けて、合計用にIF関数を使って数字を代入し合計するという方法しか思いつきません。VBAなど高度な技術を持ちませんので、やはりこの方法がベストになるのでしょうか? 列を増やさずに出来る方法があればご教授下さい。

  • VBAでの全角数字と半角数字の判断について

    はじめまして、こんにちは。VBAのプログラムについて教えて欲しいのですが、「ぐう1」のように文字列の一番後ろの数字を削除するプログラムを作成したいです。asc関数を利用して str="ぐう1234" StrLenNum = Len(str) If Asc(Right(str, 1)) >= 48 And Asc(Right(str, 1)) <= 57 Then str = Left(str, StrLenNum - 1) としたのですが、これでは 「ぐう1」という全角数字に対応することができませんでした。 全角文字に対応するにはどうすればよいでしょうか? よろしくお願いします。

  • vb6でテキスト入力の数字を判定したい。

    お世話になります。 XPでvb6を使ってプログラムを作っています。 テキスト形式で入力された文字が数字の0から15までの数字かを判断したいのですが IsNumeric関数で数字か数字以外の文字かを判定した後、 VAL関数で判定とプログラミングしたところ 入力された値が”1d1”だと IsNumeric関数はTrue、VAL関数は10になり 正しい入力と判断されてしまします。 何かいい方法があればご教授頂きたく宜しくお願いします。 以上です。

  • スプレッドシートの文字の色判定

    スプレッドシートを使っているのですが、文字の色を判定したいのです。 例えば「A1」のセルに入力されている文字が、赤なら「1」黒なら「2」などの判定ができるような関数を作る事はできますでしょうか? 別に判定結果は「1」や「2」でなくても構いません。 何をしたいかというと、IF関数を使って文字の色の判定結果によって別のセルの内容を「表示させる」か「表示させないか」の振り分けをしたいのです。 関数名を例えば「FontColor」などにして、「A2」に =IF(FontColor(A1)=1,"",何かしらの関数)のようにできないものかと思っております。 宜しくお願い致します。

  • Excel VBA Worksheet_Change イベントについて

    Excel VBA Worksheet_Change イベントについて質問です。 セルH8とI8を結合し、入力規則よりリストボックスを配置しました。 本シートにWorksheet_ChangeをVBAで作成しましたが、 セルH8:I8をDeleteすると実行時エラー13が発生します。 If Target = "" then exit sub end if や If Target.value = "" then exit sub end if や If Target <> "" then 処理 end if としても対処できませんでした。 よい対処方法のアドバイスよろしくお願いします。

  • VBAによる第3、4水準文字の判定について

    表題の件についてご質問させてください。 環境 OS:WinVista Office:2007 Accessのフォーム画面の入力内容に対して、Vistaから追加された機種依存文字である第3水準、第4水準漢字の入力があるかどうかをチェックしたいと考えています。 ネット等でいろいろと情報を仕入れてプログラムを組んでみたのですが、一部うまくいかない所があるのでご質問させていただければと思います。 ◎自前で組んだロジック  ※試験的にExcelで作成中 (入力された文字数分繰り返し)    lWork = Asc(Mid(ThisWorkbook.Sheets(1).Range("B2"), iCnt1, 1))   '読み込んだ文字が"?"となり文字が化けた場合   If iWork = 63 Then     bFlg = True   End If      If bFlg = True Then     '読み込み文字を十進数へ      iWork = AscW(Mid(ThisWorkbook.Sheets(1).Range("B2"), iCnt1, 1))      If iWork < 0 Then  ……(1)        iWork = iWork + 65536         sWork = "&H" & Hex(iWork)         ThisWorkbook.Sheets(2).Range("D" & iCnt2 + 3) = ChrW(iWork)     Else   ……(2)         ThisWorkbook.Sheets(2).Range("D" & iCnt2 + 3) = ChrW(iWork)     End If (繰り返しここまで) 上記の様なロジックでまずは判定を行い、その上で、判定に引っかかった文字から文字コードを取得し、文字をセルの値として出力する形でサンプルを作ってみました。 ※文字コードを取得して、文字自体を出力してるのはメッセージでどの文字が知らせる必要があるため 【質問事項】 (2)のElse以下の条件については上手くいくのですが、AscW関数にて取得した値がマイナスだった際にChrW関数でチェックで引っかかった値を出力することができません(出力内容がブランク)。 65536を加算すれば、という内容をネット見たので試してみたのですが、セルに出力される値がブランクとなってしまいます。チェックした文字の文字コードもプログラムの中で使用している数値と実際の数値と異なっています。 上記事象についての解決策などをご存じの方がいらっしゃいましたらご助言願います。 (より具体的に言うと、文字コードが”&4E08”(十進数だと19976)である感じを読み込んだ際、なぜかAscW関数で値を取得すると値が”55360”となってしまい、16進数に変換してChrWで文字に変換しても変換後の文字がブランクとなってしまう) また、第3水準漢字と第4水準漢字であることの判定についても、上記の判定(VBEで読み込んで”?”に化けてしまう)以外に、確実に判定を行う方法などがあったらごアドバイス等をお願いいたします。 VBAは多少扱ったことはあるのですが、文字コード関連はあまり詳しくないので、ご助言をお願いします。

  • VBAの判定の仕方を教えてください。

    EXCEL2000のVBAでの判定の仕方を教えてください。 あるセルに答えを入力します。答えが合っていれば”正解”、合っていなければ”間違っています”というようにしたいのです。 例えばC1のセルに「abc」を入力したらD1のセルに ”正解”と表示し、「abc」以外の入力の時には”間違っています”と表示させます。 答えは英文字の他に数字「123」・文字「マクロ」等を考えています。不正解についても幾通りか表示させたいのですがやり方が解りません。 「例えば半角で入力してください」と表示する。 参考になる事、解るとこだけでもかまわないです。 宜しくお願いします。

  • 数字をくっつける!

    エクセルで日付を一つのセルにしたいです!? 2006 5 29 と別々にセルに数字が入力されています。 これを 20060529 と一つのセルにしたいです。 &関数で試しましたが出来なかったです。

専門家に質問してみよう