2013-11-06 2 views
0

У меня есть пять столбцов, которые могут иметь значение «True», «False», «Bill-to Not in POVA» или «Logic Code Incorrect» и должны интерпретироваться эти пять столбцов и возвращают значение в другом столбце, основанном на иерархии.Ускоренный способ прокрутки ячеек с If, ElseIf

До сих пор я разработал только инструкции If/Elseif для ячейки. Я знаю, что могу перебирать ячейки, но этот код работает примерно на 5000 строк прямо сейчас и может достигать 15 000, поскольку прогресс в этом месяце.

Есть ли у кого-нибудь предложения относительно эффективного способа сделать это? Обратите внимание, что «Правила» относятся к именованному диапазону, который я назвал в более ранней части кода.

Sub Finalize_Formulas() 

    Dim Rules As Range 
    Set Rules = Range("Rules") 

    Dim NumRecords As Long 
    NumRecords = Workbooks("POVA Daily Reporter.xlsm").Worksheets("Paste Daily Data").Range("B" & Rows.Count).End(xlUp).Row 


'First, copy and paste special (values only) so that we aren't working with formulas anymore 
Cells.Copy 
Cells.PasteSpecial xlPasteValues 

'Now let's interpret the results in Column F based on Columns G-K (Rules 1-5) 
Rules.Select 
Rules(1, 1).Select 
Rules(1, 1).Activate 


If Rules(1, 1).OffSet(0, 1) = "True" And _ 
    Rules(1, 1).OffSet(0, 2) = "True" And _ 
    Rules(1, 1).OffSet(0, 3) = "True" And _ 
    Rules(1, 1).OffSet(0, 4) = "True" And _ 
    Rules(1, 1).OffSet(0, 5) = "True" Then 
    Rules(1, 1).Value = "True" 
ElseIf Rules(1, 1).OffSet(0, 1) = "Bill-to Not in POVA" Or _ 
    Rules(1, 1).OffSet(0, 2) = "Bill-to Not in POVA" Or _ 
    Rules(1, 1).OffSet(0, 3) = "Bill-to Not in POVA" Or _ 
    Rules(1, 1).OffSet(0, 4) = "Bill-to Not in POVA" Or _ 
    Rules(1, 1).OffSet(0, 5) = "Bill-to Not in POVA" Then 
    Rules(1, 1).Value = "Bill-to Not in POVA" 
ElseIf Rules(1, 1).OffSet(0, 1) = "Logic Code Incorrect" Or _ 
    Rules(1, 1).OffSet(0, 2) = "Logic Code Incorrect" Or _ 
    Rules(1, 1).OffSet(0, 3) = "Logic Code Incorrect" Or _ 
    Rules(1, 1).OffSet(0, 4) = "Logic Code Incorrect" Or _ 
    Rules(1, 1).OffSet(0, 5) = "Logic Code Incorrect" Then 
    Rules(1, 1).Value = "Logic Code Incorrect" 
ElseIf Rules(1, 1).OffSet(0, 1) = "False" Or _ 
    Rules(1, 1).OffSet(0, 2) = "False" Or _ 
    Rules(1, 1).OffSet(0, 3) = "False" Or _ 
    Rules(1, 1).OffSet(0, 4) = "False" Or _ 
    Rules(1, 1).OffSet(0, 5) = "False" Then 
    Rules(1, 1).Value = "False" 
Else 

End If 

End Sub 

Основная проблема у меня есть, как получить код для выполнения этой проверки на каждой строке в «Правилах» диапазона. Выше, кажется, работает нормально, но есть ли эффективный способ либо прокручивать строки в диапазоне (около 5000 строк), либо как-то оценить все сразу?

Я нашел это решение, которое не является именно то, что мне нужно, но выдвигает на первый план потенциально более быстрый способ Переберите строк: https://stackoverflow.com/a/8178637/2883304

ответ

1

Вы могли бы попробовать что-то вроде этого вместо того, чтобы ваш If statement:

If Application.CountIf(Range(Rules(1, 1).Offset(0,1), Rules(1, 1).Offset(0,5)), "True*") = 5 Then 
    Rules(1, 1).Value = "True" 
ElseIf Application.CountIf(Range(Rules(1, 1).Offset(0,1), Rules(1, 1).Offset(0,5)), "Bill-to Not in POVA") >0 Then 
    Rules(1, 1).Value = "Bill-to Not in POVA" 
ElseIf Application.CountIf(Range(Rules(1, 1).Offset(0,1), Rules(1, 1).Offset(0,5)), "Logic Code Incorrect") >0 Then 
    Rules(1, 1).Value = "Logic Code Incorrect" 
ElseIf Application.CountIf(Range(Rules(1, 1).Offset(0,1), Rules(1, 1).Offset(0,5)), "False*") >0 Then 
    Rules(1, 1).Value = "False" 
Else 
End If 

Однако, посмотрите на состояние True и False - из-за моего теста при регистрации CountIf condition необходимо добавить звездочку.

+1

Нет вам не нужно Asterix :) Попробуйте 'Application.CountIf (Range ("? G2: К2"), TRUE) ' –

+0

+ 1 на' Application.CountIf' –

0

Опираясь на ответ KazJaw в

Вам не нужно IF/ELSE или петли для достижения того, что вы хотите. Вы можете использовать метод AUTOFILL для достижения желаемого.

LOGIC

Если говорят, что значения в ячейке G2:K2, то, что вы на самом деле пытаетесь это формула

=IF(COUNTIF(G2:K2,TRUE)=5,TRUE,IF(COUNTIF(G2:K2,FALSE)=5,FALSE,IF(COUNTIF(G2:K2,"Bill-to Not in POVA")=5,"Bill-to Not in POVA",IF(COUNTIF(G2:K2,"Logic Code Incorrect")=5,"Logic Code Incorrect",""))))

Просто используйте, что в VBA.

Вот пример.

Допустим, у вас есть данные G2:K1000, а затем просто использовать этот код

Sub Sample() 

    With ThisWorkbook.Sheets("Sheet1") 
     .Range("F2:F1000").Formula = "=IF(COUNTIF(G2:K2,TRUE)=5,TRUE,IF(COUNTIF(G2:K2,FALSE)=5" & _ 
            ",FALSE,IF(COUNTIF(G2:K2,""Bill-to Not in POVA"")=5,""Bill" & _ 
            "-to Not in POVA"",IF(COUNTIF(G2:K2,""Logic Code Incorrect"")" & _ 
            "=5,""Logic Code Incorrect"",""""))))" 

     .Range("F2:F1000").Value = .Range("F2:F1000").Value 
    End With 
End Sub