[[20170220171148]] 『vba IF文について』(T17) ページの最後に飛ぶ

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

 

『vba IF文について』(T17)

お世話になります。

以下の例1は「型エラー」となりますが、例2はなりません。
この違いを教えていただけないでしょうか?

 例1)
 Dim dif1 As Variant    
 Dim dif2 As Variant    
 Const thd2 = 10      
 If Not dif1(i, 0) = "-" And Not dif2(i, 0) = "-" And _
	(dif2(i, 0) > thd2 Or (dif1(i, 0) - dif2(i, 0)) > thd2) Then
 (処理...)
 例2)
 If Not dif1(i, 0) = "-" And Not dif2(i, 0) = "-" Then
	If dif2(i, 0) > thd2 Or (dif1(i, 0) - dif2(i, 0)) > thd2 Then
 (処理...)

よろしくお願いします。

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


 >例2はなりません。

 本当ですか?

 追試したいので、テスト用のフルコードをアップしてください。

(半平太) 2017/02/20(月) 17:41


 Dim dif1(要素数1, 要素数2) As Variant
 Dim dif2(要素数1, 要素数2) As Variant

 と宣言すればいいだけでは?

 例2でも型エラーはおきましたけどね
(nazo) 2017/02/20(月) 17:44

どっちも型が一致しないエラーになりますよ? また、どっちもdif1とdif2を配列宣言にすると、通るようになります。
コードを全部書いてくれないと、おっしゃっている現象は再現しません。肝心なところを省略しないでください。
dif1とdif2は、Variant型ではなく、Long型かDouble型にすべきかと思います。何故Variant型にしたのか、理由を説明してください。

また、書いた本人が説明できない論理式は、人に直してもらうものではありません。ご自分でデバッグしてください。
(???) 2017/02/20(月) 17:50


例2では

dif1(i, 0) - dif2(i, 0)

の計算が評価されないからエラーがでません。

例1では計算が評価されて、文字列の引き算はできませんという値の型が違うエラーです。

※ちゃんと最低限、動作確認できるコードを提示しましょう。
回答者に手間かけさせるのは、
いい回答を得るための、得策とは言えないと思います。
(変数の比較式の話なのに変数に何が入っているか、
想像して動作確認しないといけないようになっている)

(まっつわん) 2017/02/20(月) 17:52


 >以下の例1は「型エラー」となりますが、例2はなりません。

 次のように書くと、例1も例2も、ともにエラーになりません。
 例1はIf文が1つ、例2はIf文が「入れ子」になっていて、
 If文が2つという違いですね。

 例1は、If文で、比較演算を4つ行ってます。
 例2は、1つ目のIf文で、比較演算を2つ行った後に、
        2つ目のfF文で、比較演算を2つ行っています。

 *****************************************************************
  Option Explicit

 Sub test1()
     Dim i As Long
     i = 1
     Dim thd2 As Long
     thd2 = 10

     ReDim dif1(0 To 10, 0 To 10) As Variant '★1次元、2次元ともに、0〜10とする
     ReDim dif2(0 To 10, 0 To 10) As Variant '★1次元、2次元ともに、0〜10とする
     dif1(i, 0) = "123"
     dif2(i, 0) = "456"

     If Not dif1(i, 0) = "-" And Not dif2(i, 0) = "-" And _
        (dif2(i, 0) > thd2 Or (dif1(i, 0) - dif2(i, 0)) > thd2) Then
         MsgBox "テスト1"
     End If
 End Sub

 Sub test2()
     Dim i As Long
     i = 1
     Dim thd2 As Long
     thd2 = 10

     ReDim dif1(0 To 10, 0 To 10) As Variant '★1次元、2次元ともに、0〜10とする
     ReDim dif2(0 To 10, 0 To 10) As Variant '★1次元、2次元ともに、0〜10とする
     dif1(i, 0) = "123"
     dif2(i, 0) = "456"

     If Not dif1(i, 0) = "-" And Not dif2(i, 0) = "-" Then
        If dif2(i, 0) > thd2 Or (dif1(i, 0) - dif2(i, 0)) > thd2 Then
           MsgBox "テスト2"
        End If
     End If
 End Sub

(マリオ) 2017/02/20(月) 17:52


なるほど、1行に全部まとめると…、という話のようですね。

If文は、Then までの全ての計算、評価を行います。だから、全部1行に書いた場合、全ての式を評価します。左側で条件から外れるから後は見なくても良い、と思っても、Then まで全ての評価を続けるのですよ。
(???) 2017/02/20(月) 17:58


皆さま、 ありがとうございます。

半平太さん、nazoさん、まっつわんさん
テストコードをわかりやすく書くことができず逡巡しております。
申訳ありません。

???さん、マリオさん

 >書いた本人が説明できない論理式は、人に直してもらうものではない..

その通りですね...言葉がありません。

dif1, dif2は何れも二つのセル値の差を入れているのですが、そのセル値が数値のみとは
限らないため数値以外の時は「-」を入れています。
それゆえに、

 >If文は...左側で条件から外れるから後は見なくても良い、と思っても、Then まで全ての評価を続ける..

から、例1)は「型エラー」になるということですね。

ようやく理解できたように思います。

質問のレベルを上げるように努めますので、これからもよろしくお願いします。

(T17) 2017/02/20(月) 23:32


コメント返信:

[ 一覧(最新更新順) ]


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