【问题标题】:VBA to replace large Excel Nested IF AND StatementVBA 替换大型 Excel 嵌套 IF AND 语句
【发布时间】:2016-11-20 03:37:43
【问题描述】:

我有一个大型嵌套 IF AND 语句,我想避免在 vba 中按原样使用它,因为它无法管理。

我将使用一个简单的例子:

Range("O2").Formula = "=IF(M2>TODAY(),""VALIDATED"",IF(AND(N2="""",M2=""""),""NEW ITEM"",IF(AND(N2=""NEW ITEM"",M2<TODAY()),""NOT VALIDATED"")))

我可以改用什么 VBA 代码,因为要添加更多的 IF 语句。另外我想避免使用循环,因为会有 1000 行。

更新...我添加了一些新代码,这些代码可以工作,但代码会通过每个单元格,并且会对宏的运行时间产生影响。有什么办法可以加快速度吗?

Set Col = Range("O2:O" & lastrowOU3)
For Each Cell In Col
If Cell.Offset(0, -2) = 0 And Cell.Offset(0, -1) = 0 Then Cell.Value = "NEW ITEM"
If Cell.Offset(0, -2) = 0 And Cell.Offset(0, -1) = "NEW ITEM" Then Cell.Value = "NOT VALIDATED"
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NEW ITEM" Then Cell.Value = "NOT VALIDATED"
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "VALIDATED" Then Cell.Value = "NOT VALIDATED"
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NOT VALIDATED" Then Cell.Value = "NOT VALIDATED 1"
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NOT VALIDATED 1" Then Cell.Value = "NOT VALIDATED 2"
If Cell.Offset(0, -2) >= Date Then Cell.Value = "VALIDATED"
Next

任何帮助将不胜感激。

干杯,

康纳

【问题讨论】:

  • 对不起,我忘了添加我想对该列中从第 2 行到最后一行的所有行应用相同的逻辑。
  • 抱歉我不知道怎么上传
  • 基本上如果 col M 大于今天,则 col O = "VALIDATED" 中的值
  • 如果您想添加一些内容,请编辑您的问题。还将代码缩进 4 个空格,以便将其显示为代码。也许If ... Then ... ElseIf ... Else 是一个选项。 Select Case 也可能值得研究。不管怎样,如果你先把它写成 VBA 代码,可能更容易看出它可以改进的地方。
  • 如果 col N 为空白,Col M 为空白,则 Col O = "NEW ITEM"

标签: vba if-statement nested conditional


【解决方案1】:
this = Format(Now, "yyyy-mm-dd")
Set rNg = ThisWorkbook.Sheets("Sheet1").Range("m1:m200")
For Each rCell in rNg.Cells
    If rCell.Value > Weekday(This) Then rCell.Offset(0,2).Value = "Validated"
    If rCell.Value = "" And rCell.Offset(0,1) ="" Then rCell.Offset(0,2).Value = "New Item"
    If rCell.Value < Weekday(This) And rCell.Offset(0,1) ="New Item" Then rCell.Offset(0,2).Value = "Not Validated"
Next rCell

使您自己的变量变暗,并且可能无法用“.value”引用“””,但无论哪种方式,您都没有尝试自己的代码。这就是你要找的东西:P

【讨论】:

  • 如果M列中的整个集合都是空的,并且需要将所有“新项目”返回到O列,你会怎么做?这就是你使用常量 Range 的原因?
  • 嗯,你没有给我太多的东西,更不用说你在帖子中提到的唯一列要求它们以某种方式为空白。如果您知道停止循环的标准,您可以轻松地调整我所建议的“IF 单元格某某 =”“然后退出”,更正@ShaiRado OP 并没有给我太多的工作。他的描述性不够,我给了他他要的东西,哈哈
  • @Doug:你根本不需要Weekday()函数,只需将值与this进行比较即可;我称之为now,因为它是一个时间值。其次,OP 指定从第 2 行循环到 M 列中最后填充的行,而不是在一个恒定范围内。
  • @user1016274 是的,但他也没有指定哪一行。如果你要为这样的事情对我大发雷霆,你最好准备好解释一下我到底应该如何以最低限度的要求做到这一点。从技术上讲,没有人能真正满足他的要求,因为他无法准确地给我们他需要的东西。所以你去:P
  • 耶稣 - 道格也祝你周日快乐。我是初学者,我们都必须从某个地方开始。
【解决方案2】:

我找到了 IF 语句的代码,但是这一次会遍历每个单元格,这可能很耗时。有没有办法加快速度?

Set Col = Range("O2:O" & lastrowOU3)
For Each Cell In Col
If Cell.Offset(0, -2) = 0 And Cell.Offset(0, -1) = 0 Then Cell.Value = "NEW ITEM"
If Cell.Offset(0, -2) = 0 And Cell.Offset(0, -1) = "NEW ITEM" Then Cell.Value = "NOT VALIDATED"
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NEW ITEM" Then Cell.Value = "NOT VALIDATED"
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "VALIDATED" Then Cell.Value = "NOT VALIDATED"
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NOT VALIDATED" Then Cell.Value = "NOT VALIDATED 1"
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NOT VALIDATED 1" Then Cell.Value = "NOT VALIDATED 2"
If Cell.Offset(0, -2) >= Date Then Cell.Value = "VALIDATED"
Next

【讨论】:

  • 如果您使用ElseIf 而不是If,它不会检查每个单元格的每个条件,而是在找到匹配项后停止。此外,就像现在一样,您在第二个If 中立即用"NOT VALIDATED 覆盖"NEW ITEM"。您还可以对 =0&lt; Date&gt;= Date 进行分组,并使用嵌套的 Ifs 或 Select Case 进行子案例。一旦你的代码工作,你可以前往 codereview.stackexchange.com 来改进它。使用数组可能会加快它的速度...
  • 很高兴您通过修补找到了解决方案,这是学习的最佳方式:)
猜你喜欢
  • 2013-10-27
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 2018-10-26
  • 1970-01-01
  • 2016-04-23
相关资源
最近更新 更多