【问题标题】:How to do a 3-part IF statement in VBA?如何在 VBA 中执行 3 部分 IF 语句?
【发布时间】:2015-03-26 11:52:09
【问题描述】:
'8
If Not IsEmpty(Range("A7")) And Range("C7") = "\" Then
    Range("W7") = "\"
ElseIf Not IsEmpty(Range("A7")) And Range("C7") <> "\" Then
    Range("W7") = "\L"
ElseIf IsEmpty(Range("A7")) Then
    Range("W7") = ""
End If

With Sheets("DL Data")
    .Range("W7:W" & .Cells(.Rows.Count, "A").End(xlUp).Row).Formula = "\L"
End With

我似乎无法弄清楚 WITH 部分,或者我可能对 IF 语句一无所知。我在这里要做的是:

如果 A7 不为空并且它等于“\”,那么 W7 等于“\”,同样 IF A7 不为空且不等于“\” THEN W7 等于“\L”,也 IF A7 为空 THEN W7 等于空白

然后我希望它这样做以搜索列并给我适当的答案,在必要时插入空格,在必要时插入“\”并在必要时插入“\L”。

希望我在这里澄清自己,提前感谢所有帮助!

问候,

雅兹

【问题讨论】:

  • 你的第一个逻辑是多余的。如果A7="\",那么显然不能为空
  • 您的第一个 if 子句的代码与您的解释不同。 A7 &lt;&gt; "" and A7 = "\"A7 &lt;&gt; "" and C7 = "\" ?

标签: vba excel if-statement with-statement


【解决方案1】:

With 只是一个缩写。

例如

With Sheets("DL Data")
    .Range("W7:W" & .Cells(.Rows.Count, "A").End(xlUp).Row).Formula = "\L"
End With

等价于

Sheets("DL Data").Range("W7:W" & Sheets("DL Data").Cells(Sheets("DL Data").Rows.Count, "A").End(xlUp).Row).Formula = "\L"

您需要一个循环才能将此条件应用于所有行,例如:

Dim i as Integer
For i = 7 To Sheets("DL Data").Range("A7").End(xlDown).Row
If Not IsEmpty(Range("A" & i)) And Range("C" & i) = "\" Then
    Range("W" & i) = "\"
ElseIf Not IsEmpty(Range("A" & i)) And Range("C" & i) <> "\" Then
    Range("W" & i) = "\L"
ElseIf IsEmpty(Range("A" & i)) Then
    Range("W" & i) = ""
End If
Next i

【讨论】:

  • Uri Goren...长大后,我想和你一样。它就像一个魅力。我要研究这个并理解逻辑。我想我需要复习一下我的 LOOP 函数,因为这似乎是我大多数 VBA 问题的答案。非常感谢你。巨大的帮助!
  • 嘿,Uri,如果我只有一行需要搜索而不是该列中的“多个”,它会给我一个错误,我猜是因为 xlDown 函数看不到任何进一步第一个条目下方的行...有没有办法让它不这样做,即使第一行中只有一个条目?
  • 7IIf(Sheets("DL Data").Range("A8")="",7,Sheets("DL Data").Range("A7").End(xlDown).Row)运行For循环
  • 什么......我只是敬畏老兄......我认为“IIF”是一个错字,所以我没有它就复制了它,它没有工作,当我这样做时,现在它工作了。 ..我只是...该死,如果您对在哪里学习 Loop、For、语句有任何建议,我很想知道!谢谢!
【解决方案2】:

此代码更新将根据您的公式更新W 列。我稍微优化了If 语句以减少冗余。

此外,我还包含了几个 With 块用于说明目的。

With Sheets("DL Data")
    Dim row As Long
    For row = 7 To .Cells(.Rows.Count, "A").End(xlUp).Row)

        With .Range("A" & row)
            ' IF A is empty THEN W equals blank
            If .Value = "" Then
                Range("W" & row).Value = ""

            ' IF A is not empty AND it equals "\" THEN W equals "\"
            If .Value = "\" Then
                Range("W" & row).Value = "\"

            ' IF A is not empty AND it does not equal "\" THEN W equals "\L"
            ' A is not empty (first condition checked above).
            ElseIf .Value <> "\"
                Range("W" & row).Value = "\L"

            End If
        End With

    Next
End With

【讨论】:

    【解决方案3】:

    如果你想在整个列中运行它,你需要将相同的 If-block 嵌套到一个循环中:

    With Sheets("DL Data")
    For j = 7 To .Range("A7").End(xlDown).Row
        If .Range("A" & j) <> "" And .Range("C" & j) = "\" Then
            .Range("W" & j) = "\"
        ElseIf .Range("A" & j) <> "" And .Range("C" & j) <> "\" Then
            .Range("W" & j) = "\L"
        ElseIf .Range("A" & j) = "" Then
            .Range("W" & j) = ""
        End If
    Next j
    End With
    

    警告我已关注您当前的实施;但是,如果您的列“A”之间可能有一些空单元格(这可以解释ElseIf .Range("A" &amp; j) = "" 的存在),请注意计数器.Range("A7").End(xlDown).Row 将在第一个空单元格处停止这一事实。您可能希望将计数器索引到始终填充的列中(例如数据集的记录 ID)。

    【讨论】:

    • 我所拥有的其他标准只有 IF A7 "" THEN C7 = "whatever" ElseIF A7 = "" THEN C7 = ""...我的标准按照我想要的方式工作它可以,但问题在于 WITH 语句。我无法让它扫描整个列,如果 A 为空,那么也将所有内容都留空,中间没有空格,所以如果你有 100 个条目,你将有 100 个填充的条目,然后在最初的 100 个之后全部空白中间跳过
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2010-11-12
    相关资源
    最近更新 更多