1

私は次のコードを持っています:

Columns("F:F").Select

For Each cell In Selection
    Select Case cell
        Case InStr(1, cell, ",") <> 0
            MsgBox ("found")
        Case IsEmpty(cell) Or Null
            MsgBox ("empty")
        Case Else
            Stop
    End Select
Next

列F:FIには、次の順序があります"Marc Jacobs", "", "Renolds, Bob"。InStrが適切なcaseステートメントを検出していません。

  1. 「マークジェイコブス」の場合、Case Elseコール(正しいコール)を受け取ります
  2. 「」の場合、見つかったメッセージが表示されます(空のメッセージである必要があります)
  3. 「Renolds、Bob」の場合、Case Elseコールを受け取ります(見つかったメッセージを受け取る必要があります)

何が起きてる?

4

2 に答える 2

4

SelectCase構文の使用方法が問題のようです。各ケースには計算が含まれています。したがって、VBは、「ケースの選択」の比較を行う前に、各ケースの計算を行います。

例:最初のループの場合、cell = "Renolds、Bob"。したがって、最初のケース条件はInStr(1、cell、 "、")を8と評価し、(8 <> 0)をTrueと評価します。ただし、「Renolds、Bob」は(InStr(1、cell、 "、")<> 0)'と等しくなく、Trueと等しくなります。奇妙なことに、VBAが ""をブール値に変換して比較できるようにすると、""はTrueに変換されます。

おそらく書きたかったのは

For Each cell in Selection
    If InStr(1, cell, ",") <> 0 Then
        MsgBox("found")
    ElseIf IsEmpty(cell)
        MsgBox("empty")
    Else
        Stop
    End If
Next
于 2012-08-24T17:23:02.067 に答える
1

Select...Caseステートメントも使用できます。

For Each cell In Selection
Select Case True
    Case InStr(1, cell, ",") <> 0
        MsgBox ("found")
    Case IsEmpty(cell) 
        MsgBox ("empty")
    Case Else
        Stop
End Select
Next
于 2012-08-24T21:42:39.267 に答える