0

「True」、「False」、「Bill-to Not in POVA」、または「Logic Code Incorrect」の値を持つ可能性のある 5 つの列があり、これらの 5 つの列を解釈し、に基づいて別の列に値を返す必要があります。階層。

これまでのところ、1 回のセルに対する If/Elseif ステートメントのみを作成しました。セルをループできることはわかっていますが、このコードは現在約 5,000 行で実行されており、月が進むにつれて最大 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

私が持っている主な関心事は、範囲「ルール」の各行でこのチェックを実行するコードを取得する方法です。上記は正常に動作するようですが、範囲内の行 (約 5,000 行) をループするか、何らかの方法で一度に評価する効率的な方法はありますか?

私はこの解決策を見つけましたが、これはまさに私が必要としているものではありませんが、行をループする潜在的に高速な方法を強調しています :

4

2 に答える 2

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ます。

于 2013-11-06T16:58:19.853 に答える
0

KazJawの答えに基づいて構築

IF/ELSE必要なものを達成するためにまたはループする必要はありません。メソッドを使用して、AUTOFILL目的を達成できます。

論理

値が cellG2: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
于 2013-11-06T17:12:58.030 に答える