【问题标题】:VBA For loop with If loop带有 If 循环的 VBA For 循环
【发布时间】:2015-07-20 19:28:41
【问题描述】:

我的 VBA 代码有问题。我尝试比较 2 列,A 列和 B 列。如果某些数据匹配,例如假设 A2 包含 B3 中的文本,那么我需要将单元格 C2 与列 D 进行比较。我不明白为什么,但我收到错误“End If without block If”。非常感谢你们的帮助。

这是我的代码:

Sub Compare()
For i = 1 To 100
   For j = 1 To 50
     If InStr(1, ActiveSheet.Cells(i, 1).Value, ActiveSheet.Cells(j, 2).Value, vbTextCompare) <> 0 _
     Then For k = 1 To 20
        If InStr(1, ActiveSheet.Cells(i, 3).Value, ActiveSheet.Cells(k, 4).Value, vbTextCompare) <> 0 Then MsgBox i
        End If
     Next k
     End If
   Next j
Next i

End Sub  

【问题讨论】:

  • 您构建 IF 语句的方式(所有内容都在 1 行) End If 不是必需的。摆脱两个 End If,你应该很高兴。
  • 或者 -- 如果毕竟 -- 在单词 Then 之后插入一个换行符,则将它们设为一个块。您使用换行符这一事实表明您的行变得笨拙。

标签: vba excel if-statement for-loop


【解决方案1】:

我发现您的 if 语句的结构有点令人困惑,我不完全确定您是否可以像这样将 for 循环作为单行来摆脱所有结束 if。对于它的价值,我认为这段代码更容易理解:

Sub Compare()
For i = 1 To 100
   For j = 1 To 50
     If InStr(1, ActiveSheet.Cells(i, 1).Value, ActiveSheet.Cells(j, 2).Value, vbTextCompare) <> 0 Then
        For k = 1 To 20
            If InStr(1, ActiveSheet.Cells(i, 3).Value, ActiveSheet.Cells(k, 4).Value, vbTextCompare) <> 0 Then MsgBox i
        Next k
    End If
   Next j
Next i

End Sub

运行时没有编译错误,但不能评论它是否符合您的要求。

【讨论】:

    【解决方案2】:

    sous2817 在他们的回答中提出了一个有趣的问题,即如果 if 语句的主体本身就是一个 for 循环,那么 1 行语句是否有效。答案似乎是“否”——除非使用冒号语句分隔符将 for 循环本身压缩到一行:

    Sub test1() 'compile error
        Dim i As Long, s As Long
        If i = 0 _
        Then For i = 1 To 10
           s = s + i
        Next i
        MsgBox s
    End Sub
    
    Sub test2() 'compiles okay
        Dim i As Long, s As Long
        If i = 0 _
        Then For i = 1 To 10: s = s + i: Next i
        MsgBox s
    End Sub
    

    【讨论】:

    • 这是一种有趣的方式!
    【解决方案3】:

    一行的if语句不需要End If语句。

    End If without block If

    【讨论】:

      【解决方案4】:
      Sub comparison()
      For i = 2 To 1000
          For j = 2 To 1000
              If Worksheets(Worksheet).Range("A" & i).Value = Worksheets(Worksheet).Range("L" & j).Value Then
                  Worksheets(worksheet).Range("N" & j).Select
                  With Selection.Interior
                      .Pattern = xlSolid
                      .PatternColorIndex = xlAutomatic
                      .Color = 65535
                      .TintAndShade = 0
                      .PatternTintAndShade = 0
                  End With
      
              End If
          Next j
      Next i
      End Sub
      

      【讨论】:

      • 我对这个答案投了反对票,因为这个代码没有做 OP 的示例代码试图做的事情,也没有回答有关 OP 收到的错误的问题。
      猜你喜欢
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多