tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルiifでエラーになってしまう
記事No4059
投稿日: 2006/08/08(Tue) 13:32
投稿者きょろ
はじめまして。きょろと申します。
VB6のソースをVB2005に変換して動作の確認をています。

ADOのレコードセットから取得した値をIIFで判定するとエラーになりますが
IF文ではエラーになりませんでした。

なぜIIFだとエラーが起こってしまうのかご教授頂けないでしょうか?                  
また、IIF関数で問題が起こらない方法はありますか?

どうぞ宜しくお願い致します。


IIF: "引数 'Expression' は有効な値ではありません。"とエラーになります。
**********************************************************
Str = IIf(IsDBNull(ObjRS.Fields("COL01").Value), _
                   "", _
                   Strings.Format(ObjRS.Fields("COL01").Value, "#,##0"))
**********************************************************

IF:問題なし
**********************************************************
If IsDBNull(ObjRS.Fields("COL01").Value) Then
  Str = ""
Else
    Str = Strings.Format(ObjRS.Fields("COL01").Value, "#,##0")
End If
**********************************************************

[ツリー表示へ]
タイトルRe: iifでエラーになってしまう
記事No4060
投稿日: 2006/08/08(Tue) 15:51
投稿者Blue
おそらく、IIf関数ではすべての式を評価してしまうからでしょう。

簡単な例)
Sub Test()
    Dim i As Integer
    
    i = IIf(Sample(1) = 1, Sample(2), Sample(3))
End Sub

Function Sample(ByVal i As Integer) As Integer
    Debug.Print i
    Sample = i
End Function


この結果としては、iは 2 になるのですが、Sample(2)もSample(3)も実行しているというのが
わかります。


よって、
> Str = IIf(IsDBNull(ObjRS.Fields("COL01").Value), _
>                   "", _
>                   Strings.Format(ObjRS.Fields("COL01").Value, "#,##0"))
はすべての式を評価する、つまり
IsDBNull(ObjRS.Fields("COL01").Value)
でも
Strings.Format(ObjRS.Fields("COL01").Value, "#,##0")
をやってしまうということです。(結果は期待通りですが。)

なので、IIf文ではかけないんじゃないかなぁと思います。


ちなみに、C/C++やJavaの三項演算子は、全部評価するということはないです。
「三項演算子 VB IIf」等をキーワードに検索してみると同じような話題が見つかると思います。

[ツリー表示へ]
タイトルRe^2: iifでエラーになってしまう
記事No4065
投稿日: 2006/08/09(Wed) 11:34
投稿者きょろ
返信遅くなり申し訳ありません。Blueさんありがとうございます。
教えて頂いたキーワードで調べてみましたがVB.netのIIFでは難しいようですね。

どうもありがとうございました。

[ツリー表示へ]