TRUEを四則演算に用いるとうまくいかないが?

Question 57.3 Previous Next
エクセルとVBAの関数の処理結果の違いについて。エクセル2000を使用しています。
1. エクセルでたとえば何も入力していない状態でセルA5に =A1=A2 と入力すると答えはTRUEになります。
これ結果を掛け算すると
セルA6=A5*A5   の結果  1
セルA7=A6*A5   の結果  1
セルA8=A7*A5   の結果  1
セルA9=A8*A5   の結果  1
となりますが、これをVBAで処理すると答えは  セルA5: TRUE、セルA6: 1、セルA7: -1、セルA8: 1、セルA9: -1 となりエクセルの結果と一致しません。(奇数の場合) 尚、VBAのコードは下記の通りです。
Sub SAMPLE()
Range("A5") = Range("A1") = Range("A2")
Range("A6") = Range("A5") * Range("A5")
Range("A7") = Range("A6") * Range("A5")
Range("A8") = Range("A7") * Range("A5")
Range("A9") = Range("A8") * Range("A5")
End Sub

2. これを解決するために
Sub SAMPLE()
Range("A5") = Range("A1") = Range("A2")
Range("A6") = Range("A5") * Range("A5")
Range("A7") = Range("A6") * Abs(Range("A5"))
Range("A8") = Range("A7") * Abs(Range("A5"))
Range("A9") = Range("A8") * Abs(Range("A5"))
End Sub
としましたが Range("A6")の行を Range("A6") = Range("A5") * Abs(Range("A5")) とするとセルA6以降は全て-1になってしまいます。
これらは何故でしょうか?(VBAのTrueは虚数なのかな?) また、 Range("A6") = Abs(Range("A5")) * Abs(Range("A5")) のように Range("A5") 全てに Absを付けると良いことは確認済です。

3. この答えがわかると Sumpuroduct関数をVbaで使用した場合
通常の掛け算の合計(範囲1,範囲2,範囲3・・・・は数字列)
Range("H" & I) = Application.sumproduct(範囲1, 範囲2,範囲3,・・・・)
はきちんと計算できます。しかし下記のような複数の条件の合計では
Range("H" & I) = Application.sumproduct((範囲1 = 検索1) * (範囲2 = 検索2) * (範囲3 = 検索3), 集計)
はエラーとなります。(これは上記のためではないのか?)
とりあえず、対策として Range("H" & I) = "=SUMPRODUCT((範囲1=RC5)*(範囲2=RC6)*(範囲3=RC7),集計)" としてエクセル側で計算させるようにしていますが、うまくVBAで計算できる方法を教えていただきたく。

4. PS Applicationの後の関数の文字(大文字小文字)がエクセルと違う理由も教えてください。(エクセルは大文字で表示)  VBAの例 下記のように大文字、小文字がまちまちのようです。
Application.SUMIF全て大文字(SumIfになるときもある?)  .  Application.sumproduct全て小文字
Application.Sum先頭のみ大文字 Application.VLookup
Application.Average 〃 Application.Rank先頭のみ大文字
Application.Round 〃 Application.Match 〃
Application.Index 〃 Application.Small 〃
Application.Large 〃 Application.Rept 〃
Application.Floor 〃 Application.Trim 〃
Application.DSumDSUMになるときもある? Application.CountIf
Application.IsErr Application.RoundDown
Answer   Copyright (C) 2003.1.23 永井善王
長々と質問文のキーボード入力お疲れ様でした。読み手は (T_T) ですが順にお答えします。
1.
基本としまして、True(真)と False(偽)はブール型の値であり、それを他のデータ型に変換すると Trueは -1、Falseは 0に、逆に数値型をブール型の値に変換すると 0は Falseに、0以外の値はすべて Trueになると思います。
このことを踏まえられて再検証なさってください。VBAの処理結果を納得できると思います。なお、ブール型の値をワークシートで四則演算に使用することは、一般的に適さないのではないでしょうか。
2.
私は数学は苦手ですが、上記で -1となったものに Abs関数を冠して絶対値に変換してから演算すると、結果は当然変わるかと思います。
3.
SUMPRODUCT関数は、引数として指定した配列の対応する要素間の積をまず計算し、さらにその和を返してくれます。そして、その引数としては 2~30個までの「計算の対象となる要素を含む配列」を指定することになっています。
エラーになると言われる式を拝見すると、ルールを守っていないからではないでしょうか(間違っていたらすみません)。もう一度、ヘルプで書式をご確認くださるようお願いします。
4.
根気よくお調べになりましたね。何か実害がありましたか? そうなるとすると、その原因はExcelおよびVBAの仕様の問題になるかと思います。どうしても究明しておきたいのでしたら、MS社にお尋ねになられたらいかがでしょうか。
蛇足ではありますがきちっとされたいようですので、Excel2000以上のVisual Basicでは、Excelワークシート関数を使用する場合、WorksheetFunctionオブジェクトを介しておこなうように改められた(Excel97仕様の Applicationオブジェクトだけでも一応動きます)かと思います。

お願い
あなたは見落とされたようですが
期間限定のVBAの質問受付は先着3名さま (1人1問限り) となっています。ご協力ください。

 

Excel VBA Macro