【问题标题】:exiting for loop too quickly vba退出for循环太快vba
【发布时间】:2016-09-09 15:17:35
【问题描述】:

我是编程新手,目前正在努力学习 vba。我在尝试运行的每个循环都遇到问题,因为我太快退出循环。我有一个范围,我想测试它们是否存在某些值,如果存在,我想删除该列。但它只测试一次条件,然后退出循环。非常感谢您对此的任何帮助!

  For Each cell In ActiveSheet.Range("S1:AA1")


    If ActiveCell.Value = "Actual" Then
        ActiveCell.EntireColumn.Delete


    ElseIf ActiveCell.Value = "" Then
        ActiveCell.EntireColumn.Delete


    Else: ActiveCell.Offset(, 1).Select


    End If

Exit For

Next

【问题讨论】:

  • cell代替ActiveCell,就不用Select了。
  • 另外,您的Exit For 声明似乎很可疑,这将在第一个单元格上退出。

标签: vba excel


【解决方案1】:

cell代替ActiveCell,也不需要Select

另外,您的Exit For 语句似乎很可疑,这将在第一个单元格上退出。您通常仅在满足某些条件时才使用Exit 语句,该条件需要在处理所有项目之前退出循环(即,旨在找到 first 的循环something 等的实例。

最后,从集合中删除成员时,需要以相反的顺序进行(否则必须采取非常措施来确保处理所有项目)。

Dim i as Long
Dim cell as Range
For i = ActiveSheet.Range("S1:AA1").Columns.Count to 1 Step - 1
    Set cell = ActiveSheet.Range("S1:AA1").Cells(i)
    Select Case cell.Value
        Case "Actual", ""
           cell.EntireColumn.Delete
        Case Else
           'Do nothing, unless you need to do something...
    End Select
Next

注意:区分大小写和尾随/前导空格。如果您担心“ACTUAL”、“actual”、“AcTuAl”等,以及“”和“Actual”等值,您应该这样做:

Select Case UCase(Trim(cell.Value))
    Case "ACTUAL", ""
...

【讨论】:

  • 我可能会说Next i 是更好的做法——不过答案很好——我忘了​​向后删除!
  • 我认为Next i 是多余的,但它可能是最佳实践。我几年前就停止使用它了:D
  • Next i 至少在您有嵌套循环时是一个很好的视觉提示
  • @Brad 非常正确,但适当的缩进(即使 VBA 不需要它)更好的 IMO。
  • 哦,是的,毫无疑问。永远不要缩进。但有时我会尽我所能保持一切顺利
猜你喜欢
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 2011-01-22
  • 2021-10-01
  • 2012-03-13
  • 2021-06-07
相关资源
最近更新 更多