[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『式の判定について』(基本が・・・)
基本的なロジックが分からなくなったのでご教授ください。
まず下記の悪いプログラムを見てください。
(地名が切り替わるタイミングで合計処理のようなことを行いたい)
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
正確には >異なる種類の演算子が 1 つの式の中で使われている場合、算術演算子、比較演算子、論理演算子の順序で評価されます。 か。 (VBAのほうのヘルプで「演算子の優先順位」から)
<,>,=は比較演算子、And、Orは論理演算子。 (ねむねむ) 2015/07/29(水) 16:29
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.