2013-11-20 3 views
0

У меня очень длинная формула IF AND OR, которую я пытаюсь преобразовать в VBA, поэтому она быстрее.Если функции ElseIf 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 

плюс я надеялся, что в цикле это так оно применяет этот целом, если формула пока значение ячейки А (в зависимости от того строка) не является пустым.

Я вроде знаю, что цикл должен быть

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

любая помощь приветствуется!

+1

Ваше условие 'OR' не имеет смысла - если все эти значения (или адреса ячеек) не являются indentical, это всегда будет FALSE. – brettdj

ответ

1

Первое правило хорошего кода заключается в том, что оно должно быть понятным - легко читать и отлаживать. Только после этого вы пытаетесь сделать его «быстрым». Преобразование вашего текущего выражения в VBA может дать преимущество в скорости, но вы все еще не отвечаете первому тесту ...

Вы можете сделать вещи более чистыми с таким выражением (вы можете поместить это прямо в свою электронную таблицу):

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

Это будет оцениваться как «истинное», если значение в H10 не соответствует ни одному из значений в массиве. Если у вас есть много условий 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 
0

Это не будет работать, как ожидалось:

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

потому что 2 и 3 не являются логическими (истинными/ложными) условиями (по крайней мере, не так, как вы ожидаете от них).

Правильный синтаксис:

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

Это лишь частичный ответ, который тем не менее, решить одну из многих проблем в вашем коде.

Смежные вопросы