我有一个非常长的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
任何帮助表示赞赏!
答案 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
您可以使用其他表达式重复类似的代码,构建match2
,match3
等 - 然后与您想要的所有And
和Or
结合使用 - 例如
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
因为2
和3
不是布尔(true / false)条件(至少不是你期望它们的方式)。
正确的语法是:
If x = 1 Or x = 2 Or x = 3 Then
MsgBox "x is either 1, 2, or 3"
End If
这只是部分答案,但仍解决了代码中的众多问题之一。