2016-07-26 5 views
0

Я хотел бы моя процедура удалить любую строку, в которой column a (cA) is Fund ID 6347 OR 6349И имеет влияние основы точечной less than +/-100Иless than +/-50% price changeГоловокружение Excel VBA И ИЛИ логические операторы

Следующий код работает для удаления строк с: either fund and a basis point impact +/- 100 но я не верю, что он работает в соответствии с моими намерениями, так как среди чрезвычайно запутанных круглых скобок в сочетании с плохим интерфейсом IDE 2007 года, когда я удаляю код cells(i, cJ) >= -100) в первой строке, мой тест терпит неудачу, заставив меня поверить, что в каким-то образом мой код работает частично, но в случае аварии.

Кто-нибудь понимает логику, которую я пытаюсь закодировать? Есть ли какой-либо веб-интерфейс, я могу кодировать Excel VBA и видеть скобки выделены для лучшего опыта в этих ситуациях? Спасибо

 For i = LR To 2 Step -1 

        If (Left(CStr(cells(i, cA)), 4) = "6347" And (cells(i, cJ) <= 100 And cells(i, cJ) >= -100)) Or _ 
        (Left(CStr(cells(i, cA)), 4) = "6349" And (cells(i, cJ) <= 100) And cells(i, cJ) >= -100) Or _ 
        Left(CStr(cells(i, cC)), 4) = "Trs " Or _ 
        Mid(CStr(cells(i, cC)), 15, 8) = "bcomf1t " Or _ 
        Mid(CStr(cells(i, cC)), 15, 7) = "bcomtr " Then 
+1

re: * '... в сочетании с бедным интерфейсом IDE Excel 2007' * Это плохой рабочий, который обвиняет свои инструменты. – Jeeped

+3

разделил бы каждое утверждение «Или» на свое утверждение «Если» поможет вам вывести логику из строя? – sous2817

+0

вы также проверяете значения в столбце 'cC' как« Trs »или« bcomfit »или« bcomtr », чтобы идти вперед. Это не то, что вы заявили в начале своего повествования. Кто прав? – user3598756

ответ

1

Если вы беспокоиться только о «фонде» и " удар », то пошли следующим образом:

Dim okFund As Boolean, okImpact As Boolean 

For I = LR To 2 Step -1 

    okFund= Left(CStr(Cells(I, cA)), 4) = "6347" Or (Left(CStr(Cells(I, cA)), 4) = "6349" 
    okImpact = Cells(I, cJ) <= 100 And Cells(I, cJ) >= -100 

    If okFund And okImpact Then 
4

Вытащите переменные из таблицы , прежде чем вы строите свой, если заявление, а затем положить их один на каждой линии. Это намного эффективнее и значительно облегчает чтение. После вашей спецификации заявление:

Я хотел бы моя процедура удалить любую строку, в которой столбец а (Калифорния) Фонд ID 6347 ИЛИ 6349 и имеет влияние базисных пунктов меньше, чем +/- 100 И меньше +/- 50% изменение цены

это будет выглядеть следующим образом (обратите внимание, что я предполагаю, на какие ценности приходят от того, где и ваш код имеет дополнительные условия, не поясните):

Dim FundId As String 
FundId = Left$(Cells(i, cA).Value, 4) 
Dim BasisImpact As Long 
BasisImpact = Cells(i, cJ).Value 
Dim PriceChange As Long 
PriceChange = Cells(i, whereever).Value 

If (FundId = "6347" Or FundId = "6349") And _ 
    (BasisImpact >= -100 And BasisImpact <= 100) And _ 
    (PriceChange >= -50 And PriceChange <= 50) Then 

Как указано out by @Jeeped в комментариях, VBA выполнит все тестов в операторе If (это не короткое замыкание). Если это в исполнении критической части кода или у вас есть огромный набор данных, гнездящихся на If заявления и лист доступов даст вам лучшую производительность:

If FundId = "6347" Or FundId = "6349" Then 
    Dim BasisImpact As Long 
    BasisImpact = Cells(i, cJ).Value 
    If BasisImpact >= -100 And BasisImpact <= 100 Then 
     Dim PriceChange As Long 
     PriceChange = Cells(i, whereever).Value 
     If PriceChange >= -50 And PriceChange <= 50 Then 
      'Do your thing 
     End If 
    End If 
End If 
+0

Зачем обрабатывать все условия каждый раз? Вложение каждого набора условий может упростить процесс, и внутренние «гнезда» не будут оцениваться, если внешние не будут сопоставлены. * Подсказка: * Для лучшей оптимизации наименее вероятно, должны быть внешние условия. если было 7000 идентификаторов фонда и только два возможных совпадения, то это, вероятно, было бы лучшим внешним состоянием. – Jeeped

+1

Потому что ... причины?* Реальная * причина в том, что большая часть моего кодирования на работе находится на C#, и иногда я забываю, что VBA не замыкается. – Comintern

+0

:) Просто предложение для оптимизации ... не унижение. – Jeeped