[[20150729151904]] 『式の判定について』(基本が・・・) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『式の判定について』(基本が・・・)

基本的なロジックが分からなくなったのでご教授ください。

まず下記の悪いプログラムを見てください。
(地名が切り替わるタイミングで合計処理のようなことを行いたい)

    Dim wArray As Variant '地名

    wArray = Array("東京", "東京", "神奈川", "神奈川", "埼玉", "埼玉")

    For i = 0 To UBound(wArray)

        If (i < UBound(wArray) And wArray(i) <> wArray(i + 1)) Or _ 
           (i = UBound(wArray)) Then
              合計処理を行う。
        End If

    Next i

添字が、配列数より小さい かつ 次の地名が変わった場合、 または
添字が、配列数の最後の場合
というような事をしたかったのですが、
 「i < UBound(wArray) And wArray(i) <> wArray(i + 1)」
の所で i=5(UBound(wArray)=5) の場合も
 「wArray(i) <> wArray(i + 1)」
が判定されてしまい。¥、
 「インデックスが有効範囲にない」
エラーが出力されてしまいました。

AND文は、左から順に判定しないのでしょうか?

< 使用 Excel:Excel2013、使用 OS:Windows7 >


優先度の同じ論理式は、左から判定されますよ。

ただし、1つ目の条件と2つ目の条件をOr等で結んだ場合、両方の条件を計算してしまいます。
なので、今回のような場合は1行にまとめず、2つのIf文に分けるべきでしょうね。
(見た目1行で短く見えるけど、実際には常に2つ目の条件まで計算していて無駄だという…)

ところで、Arrayの中身が必ず2つずつセットならば、ループを1つ飛びにするだけでは済まないのでしょうか?

また、UBound(wArray) - 1 までループすれば、判定が減ったりしませんか?
(???) 2015/07/29(水) 15:59


 かぶったが。

 And(Orも)は演算子(A And BでAとBの論理積を求める)なためその両辺が式の場合、両方の式を評価後、その論理積を計算する。
(ねむねむ) 2015/07/29(水) 16:03

 ???さんと同意見で、配列の中身が
 Array("東京", "神奈川", "東京", "神奈川", "埼玉", "埼玉")
 こうなっていたらどうするのかなーと。

 Dictionaryとか使われてみてはどうですか?
 今回のような事例によくつかわれますよ。
(稲葉) 2015/07/29(水) 16:06

???さん。回答ありがとうございました。
初歩的な質問で申し訳ございません。式を2つに分けるように修正します。
(基本が・・・) 2015/07/29(水) 16:13

 正確には
 >異なる種類の演算子が 1 つの式の中で使われている場合、算術演算子、比較演算子、論理演算子の順序で評価されます。
 か。
 (VBAのほうのヘルプで「演算子の優先順位」から)

 <,>,=は比較演算子、And、Orは論理演算子。
(ねむねむ) 2015/07/29(水) 16:29

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.