如果ElseIf和Or功能VBA

时间:2013-11-20 06:13:48

标签: vba

我有一个非常长的IF AND OR公式,我正在尝试转换为VBA,所以它更快。

=IF(OR(H10<>"GL402",H10<>"GL412",H10<>"GL422",H10<>"GL432",H10<>"GL442",H10<>"GL452",H10<>"GL492",
H10<>"GL480",H10<>"GL370",H10<>"GL380",H10<>"GL710")*AND(OR(D10<>3,D10<>9,D10<>10),E10<>"ASX",
F10<>"AUD"),"F126",(IF(OR(H2="GL402",H2="GL412",H2="GL422",H2="GL432",H2="GL442",H2="GL452",H2="GL492")*
AND(OR(D2<>"3",D2<>"9",D2<>"10"),E2="ASX",F2="AUD"),"D111",.......))

我认为这应该是这样的:

IF range("H10").Value <>""GL402"" or ""GL412"" or ""GL422"" or ""GL432"" or ""GL442"" _
or ""GL452"" or ""GL492"" or ""GL480"" or ""GL370"" or ""GL380"" or ""GL710"" AND _
range("D10").Value <>3 or 9 or 10 and range("E10").Value <>""ASX"" and _
range("F10").Value <>""AUD""

then
    range("I10").Value = ""F126""

elseif
Range("H2").Value = ""GL402"" Or ""GL412"" Or ""GL422"" Or ""GL432"" Or ""GL442"" Or ""GL452"" Or ""GL492"" _
And Range("D2").Value <> 3 Or 9 Or 10 And Range("E2").Value = ""ASX"" And Range("F2").Value = ""AUD""

then
    Range("I2").Value = ""D111""
elseif
another lengthy conditions with ANDs and ORs

加上我希望循环这个,所以它应用整个IF公式,直到单元格A(无论哪一行)的值为空。

我知道循环应该是

Do .........
next (with something like A1 + 1)
until A1 + 1 = ""
loop

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

良好代码的第一条规则是它应该清晰 - 易于阅读和调试。之后才会尝试“快速”。将当前表达式转换为VBA可能会带来速度优势,但您仍然无法满足第一次测试......

您可以使用这样的表达式来清理事物(您可以将其放在电子表格中):

=ISERROR(MATCH(H10,{"GL402","GL412","GL422","GL432","GL442","GL452","GL492","GL480","GL370","GL380","GL710"},0))

如果H10中的值与数组中的任何值都不匹配,则会评估为“true”。 如果并行有很多or个条件,那么当第一个条件为真时基本上可以停止。

这样的表达式可以用VBA编写如下:

Sub test()

    Dim matchStrings
    Dim match1, match2

    matchStrings = Array("GL402", "GL412", "GL422", "GL432", "GL442", "GL452", "GL492", "GL480", "GL370", "GL380", "GL710")

    firstPart = Application.Match(Range("H10"), matchStrings, 0)
    If IsError(firstPart) Then
      MsgBox "no match found"
    Else
      match1 = true
      MsgBox "match found at index " & firstPart
    End If

End Sub

您可以使用其他表达式重复类似的代码,构建match2match3等 - 然后与您想要的所有AndOr结合使用 - 例如

If match1 And (match2 Or match3) Then
  ... do something
Else
  ... do something else
End If

答案 1 :(得分:0)

这不会按预期工作:

If x = 1 Or 2 Or 3 Then
    MsgBox "x is either 1, 2, or 3"
End If

因为23不是布尔(true / false)条件(至少不是你期望它们的方式)。

正确的语法是:

If x = 1 Or x = 2 Or x = 3 Then
    MsgBox "x is either 1, 2, or 3"
End If

这只是部分答案,但仍解决了代码中的众多问题之一。