★★★Access2000VBA・Excel2000VBA独学~上達を早める一番最初の条件:4流以下の講師たちを信用しない。4流以下の市販書籍やWeb記事に騙されない。コンピュータやExcel・ついでに自分も・を信用しすぎない。~小数計算での挙動の調査とイミディエイトウィンドウ、ローカルウィンドウ、ウォッチウィンドウの使い方を勉強しておく。理由は、現実には「そんなこと起こるはずがない」が起こるから。実際に自分でプログラムを作って仕事に利用してみればそれがウソかホントかわかります。~
  
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
  
  

※参考Webページ
VBA VBAでも発生する演算誤差をリテラル文字で解決する
【悲報】“達人”芳坂和行氏に学ぶ、エクセル「演算誤差」対策講座がPC Onlineから消えていた
VBA豆知識 String、Long、Doubleなどの型名の由来について
エクセルVBAの各データ型の特徴と変数宣言について
変数を使用する
VBA スコープ
VBA データ型
『』

※参考記事
★★★ Access2000VBA・Excel2000VBA独学~初心者の方や独学者の方へ:パソコンで小数計算をするということの重要性~関連して「変数の型は覚えなくていい」とか「変数は全部Variant型でいい」 、という最低で腐った教え方には、絶対に騙されないようにしてください。ベストセラーの「教科書」を名乗る本も真似していてとっても危険・かつ・迷惑です。~
  
  
=============
以下本文

以下に挙げたコードで、
・イミディエイトウィンドウ、
・ローカルウィンドウ、
・ウォッチウィンドウ、
にて、変数や値の型を調べる練習ができます。

変数の型はローカルウィンドウですべてわかります。
掛け合わせたりなど、計算後の型がどう変化するかは、ウォッチウィンドウで調べるとわかります。
  
  
プログラムを実行してエラーや計算ミス、挙動不審、などが出たときはこのように、
・イミディエイトウィンドウ、
・ローカルウィンドウ、
・ウォッチウィンドウ、
にて、
・計算やコード実行後の、「変数や計算の実際の型の変化」がどうなっているか?や、
・「実際に変数に格納された値が何なのか?」
などを調べる必要に迫られることが結構あります。

  
  
今回のこのプログラムでは、コンピュータの少数計算における計算ミスがどのようになるかを調べますが、それ以外にも・・・、

・文字列の切り出し・分解・結合、あるいは、
・オブジェクトの型調査、
・その時点での目的のオブジェクトの各種プロパティの値や型などの調査、
・上位、下位のオブジェクトの調査

・・・といったことなどが調べられます。
  
  

というわけで、エラーや計算ミス、挙動不審の解決にはかかせないので、是非、
・イミディエイトウィンドウ、
・ローカルウィンドウ、
・ウォッチウィンドウ、
の使い方を覚えてください。
  
  
上記のプログラムで、変数の型を色々にかえてみながら、
・イミディエイトウィンドウ、
・ローカルウィンドウ、
・ウォッチウィンドウ、
の内容をチェックしていきます。
「Stop」のところでいったん止まるので、そうしたら「F5」キーを押すと、再度、Stopのところまでを実行してくれます。
  
  
変数の型はローカルウィンドウを表示すれはすべてわかります。

掛け合わせたりなど、計算後の型がどう変化するかは、ウォッチウィンドウを表示して、例えば以今回のプログラム例の場合なら、次の項目をウォッチ式に追加すると色々とわかります。

a*b
b*a
a+c
2900 * b (型を指定しない値に型を指定した値をかけるとどうなるか?を調べられます。)
Range("A1")(計算結果をセルに入れるとどうなるか?などを調べられます。)
  
  
特に見てほしいのは、
「aとc」をLong型、「b」をSingle型 で宣言したときの結果です。

驚くべき計算ミスが発生します。
今回のテストでは、「下二桁がゼロの売価に、0.3かけただけ」なのに、「少数を含む答えになんかなるはずがない」のに、例えば以下のような答えが出てしまいます。

「aとc」をLong型、「b」をSingle型 、で掛け算する、というのは、例えば「小売業のバーゲンセール」などを意識した計算です。
バーゲンセールで7掛け(3割引き)とか、3掛け(7割引き)、といったことを想定しての、マジ、単純計算です。
「Long型とSingle型の数値の掛け算」は、初心者のうちはやってしまいがちです。
(っていうか、僕自身がそれやってハマりました。)

  
  
でもこれを実行するだけでも、「コンピュータやExcel」が「もともと」「いかにバカで信用ならないモノなのか」がよくわかると思います。(だから、少しでも信用度を上げるために、型の宣言が必要です。)
  
  
型をVariantに変えたり、Currency に変えたり、「b」だけをDoubleに変えたり、あと、少数(つまり「b」)だけをLong型などに変えてみるのもいいです。
ご自分で色々と調べてみてください。

A1セルに代入した値の変化も数式バーなどでも確認しながらチェックしてみてください。

ついでですが、Single型を使うと、さらに、以下のような恐ろしいことが起こります。

※参考記事
★★★ Access2000VBA・Excel2000VBA独学~初心者の方や独学者の方へ:パソコンで小数計算をするということの重要性~関連して「変数の型は覚えなくていい」とか「変数は全部Variant型でいい」 、という最低で腐った教え方には、絶対に騙されないようにしてください。ベストセラーの「教科書」を名乗る本も真似していてとっても危険・かつ・迷惑です。~

このようなことは、「Single型」だけしか起こらないのか、その他の型やVariant型では上記記事のようなことは「ホントウに起こらないのか?大丈夫?」それに明確に答えたことがあるExcelVBA講師やExcelVBA市販書籍の著者は僕はまだ見たことがありません。

Excelって「表計算」するソフトですよね?

「計算」するソフトなのに、でも「コンピュータやExcelは小数計算ミスするのがあたりまえな機械」なのに、それらのこと、そこをどう考えたらいいか?どう処理したらいいか?の説明をしない講師だらけ・・・という状況が、「20年前とまったく変わってない」、ということが僕には信じられません。

僕も、ExceVBAの初心者なので、「本当のところどうなのか?」を学びたいのですが、ちゃんと説明してくれている講師や書籍の著者にはまだ出会ったことがありません。

もちろん、僕は超いい加減で「数字自体を特段信用しているわけでもない。」ので「そんなさあ、0.001とか微細な数字、ビジネス定型集計なんだから、ちょっとくらい違ってもいいだろ?」と言ってくれれば、まあ「ビジネス定型集計」の「集計結果」「だけ」のお話なら、「ああそうですか。それならそれでいいです。」、と納得しますけど・・・(^^)。
でも、そうじゃない方にとっては、大切なことだと思います。

また、「集計結果」「だけ」のお話だけならそう納得しますけど、「条件分岐」の話になると、「誤作動・逆の動き」の話になるのでそれは最終的に「お客様にウソ(逆のこと)をしてしまい、ご迷惑をおかけする」ということになるので、ちょっと、無視できないことになります。

もしかしたら、VBAの場合、「数値を条件分岐に使う」のなら、小数部分を明示的に切り捨てるような恰好で、数値同士を比較する必要があるのかもしれません。(わかりませんけど)

  
  
ところで、今回のテストプログラムでは、型の宣言を全部、Variant型にすると少数の計算ミスは発生しません。

でも、「ほら見ろ!だからいつもVariant型にしておけばいいんだ!」と安易にVariant型を信用すると、別のこと・・・、例えばユーザーフォームがらみ、関数の戻り値がらみ、その他、でエラーや誤作動を起こすことに気がづけず、ハマります。
もしかしたら、ビジネス以外の別の(複雑な)小数計算ではおかしな結果になるかもしれません。

そして、Variant型に対してこそが、今回のこの記事のようなチェックが必要なのです。
少数だけでなく、その他の型、オブジェクト型、すべて、生データやオブジェクト式、関数の戻り値を代入した瞬間に、内部的に「勝手に ” 自称最適 ” な方に勝手に自動変換する」からです。
でもこれは、「自称最適」なだけで、「完璧」ではないので、「目的からすると間違った型」に勝手に変換されることがあるんです。
だからVariant型を使うときのほうが、「一般的な明示的な型宣言」をしたときよりも、「より、イミディエイトウィンドウ、ローカルウィンドウ、ウォッチウィンドウでのチェック方法の学習が必須」となってきます。

イコール、「コンピュータやExcel」は「特に小数計算では、バカで信用ならない」からです。
ものごとに、「万能」なんてありえないんです。
実際、セル内とVBAコード内では、数字の扱いも若干異なるようです。

Variant型のことや、その他の注意としては、以下のようなこともあるようです。ご参考にしてください。

Excel で実数を扱うときの注意 セルの謎
Excel VBA プログラミング 実数を扱うときの落とし穴
Excel VBA プログラミング 「自動型変換」に関する落とし穴
VBAはクソだが最強の言語だ

  
  

よく「変数の型なんて覚えなくていい」とか、「変数なんて誰かが使ってるとき、そんなコードを見たときにちょっとだけ調べればいい・意味さえわかってればいい。」などというバカなことが書いてある「4流以下の講習・4流以下の市販書籍・4流以下の雑誌記事・4流以下の市販Web記事」がありますが、絶対に信用しないでください。
  
  
本当のところは・・・

『 変数については、初心者のうちは一度に全部言っても理解できないことが多いので、” 仕方がないから ” 、最初のうちだけ Variant型を使って説明します。
Variant型は、値を代入した瞬間に、その値に見合った ” そこそこ適切な型 (でも完ぺきではない・穴アリ)”に、オートで自動変換を行ってくれるからです。
そんなわけで、まだ色々わからないうち、「だけ」は、無理にデータ型を覚えなくてもいいです。
でも、最終的はデータ型について、色々なことをちゃんと覚えないと(=色々に書き分けられないと)、例えば「複数のExcelファイルをいっぺんに開きながら転記処理やいろんな書き換えをする・・・」といったような処理や、その他の思い通りのことは何もできません。
ミスやエラー・挙動不振がどうしても起こり、でも、それを自力で解決することもできないです。
Q&Aサイトで質問しても、回答者が言っている意味が理解できません。
当然、値やオブジェクトを返す自作関数なんて作れるわけもないので、ヘルプも読みこなせないし、オブジェクトブラウザも扱えません。
ヘルプが読みこなせなくて、オブジェクトブラウザが扱えなかったら、100%上達は絶対に不可能です。
そして、初心者の域から抜け出ること自体が100%、不可能です。
例えば本を買っても買っても自信がつかない。
「確信」が持てない。
新しい(ウソの)Web記事を発見するたびに「フラフラ」する。
そして現実にうまく処理できない。
そんな風になりたいですか?
たとえばこちらのサイトには、「変数やオブジェクトのことなんて知らなくても高度なマクロが組める」と説明されていますが、それはやっぱり「ウソ」なのです。
このサイトはレジェンドさんたちのサイトと比較しても、コスパを考えるにはすごく良いサイトなんですが、著者の思い込みが激しすぎるため、話半分で見ないとハマります。
それは「ビジネス計算の小数計算があまり多くない主に個人用プログラム」「限定」の「狭い業種」「狭いシーン」の話で、しかも、やっぱり高度なプログラムなど作成はできません。
そもそもどうやって「Excelだけ」で、複数クライアントPCが同時アクセス可能がで・かつ・同時書込が可能なクライアントサーバのシステム作るの?
(ExcelじゃあAccessのmdbファイルみたいな、その「もどき」すら作れません。)
システム屋さんとか、あるいは、私らのような素人でも、 ” データベース や SQL ” を少しでもかじったことのある人間からすれば、ぜんぜん大したことないシステムの作り方しか紹介されていません。7万近く払ってCD買っても。(でも全体的には「現場に対するひとつのコスパの考え方」として、かなり良いサイトです。マクロの記録機能を「あえて」活用してコスパを上げたい人、ExcelVBAのオブジェクト構造がある程度わかって来た人の「まったく " 違う発想・別の手 " としての」再学習、などにとても参考になります。ただ、「ごく一般的なチームでの作業ではなかなか受け入れてもらえない手法なので、全部をこれでやれる状況は少ないし、世間一般に言われる ” 実際に高度なシステム・特にごくごく普通のぜんぜん大したことないクライアントサーバーなどのシステム ” すら作れない。」というところだけ、注意が必要です。)

やっぱり、変数やオブジェクトの知識なしでは、どんなにあがいても、高度なことは何一つできないのです。
どれだけ本を買って読んでも、どれだけお金を払って習っても、意味が理解できず、いつまでたっても初心者のままです。
Excel自体もマイクロソフトが「仕様変更」ってやつ(迷惑行為)をしてくるしね。
なので、学習が進むにつれて、変数の型や詳細、少数の扱い、オブジェクト自体の各種機能やその階層構造の全像などについては、必ずしっかり勉強することが「必須」というか、「絶対」です。』

・・・ということなのです。
  
  
それを「腐った4流以下の講師たち」はそのような但し書きをせず「変数なんて全部Variant型でいいんだよ~ん!!ね?簡単でしょ?」と「騙してきます。」

「Excelは計算をするソフト」なのに、あのバカどもは、「計算ミスや誤作動を起こす方法を推奨」してきます。責任もとりません。

十分にお気をつけください。

(僕のようなExcelVBA勉強中の初心者にとっては、ほんとうにあの4流以下の講師たちが邪魔です。いいかげんなこと書籍とかで書かないでほしいです。)
  
  

ちなみにですが、ヘルプによると、「もし計算結果が小数点第4位まででOKな場合」は、一番計算ミスが少ないのは、すべてをDouble型を使うよりも、すべてCurrencyで計算するのが良いそうです。(動作速度のことを考えなくてもよければ)
Variant型は基本、数値を勝手にDouble型に変換しますが、『VBA VBAでも発生する演算誤差をリテラル文字で解決する』によりますと、「実はDoubleでありDecimalまた、本来のDobuleよりバイト数が大きくなっている。」とのことなので、ビジネス定型集計のような、「小数点第2位くらいまで出ればいい」という計算なら、計算ミスは生じにくいとは思いますが・・・。
統計やもっと細かい数値を分析するような場合は、ちゃんと挙動をチェックしたほうがいいかもしれません。