Игнорировать строку, если все 4 ячейки равны 0; получить имя, если любая из 4 ячеек больше 0 - PullRequest
0 голосов
/ 30 марта 2020

у меня есть список имен (столбец A), числа в столбцах с B по F являются результатом формулы. Я пытаюсь создать код FOR L OOP, который будет проверять столбцы с B по F, если все ячейки от B до F равны нулю, тогда код должен игнорировать текущую строку и переходить к следующей строке; если какая-либо из ячеек в столбцах с B по F больше 0, тогда код должен получить соответствующее имя в колонке А.

Пример: Если какая-либо из ячеек в B2, C2, D2 и E2 больше 1, тогда я должен получить имя / значение A2. если все клетки в B2, C2. D2 и E2 - все нули, затем перейдите к проверке следующей строки и сделайте то же самое.

вот код, который я использовал, чтобы попытаться получить имена, у которых любое из четырех значений ячейки столбца больше чем 1

     For i = 2 To LastCalcAnalystRowIndex '//wsCalculations.Cells(Rows.Count, "CP").End(xlUp).Row

    '//Get Component from cell in column "BP"
        Analyst = wsCalculations.Cells(i, "CP").Value
        Component = wsCalculations.Cells(i, "CN").Value
        weeknumber = wsCalculations.Range("BR2").Value + 3

            If wsCalculations.Cells(i, "B").Value = 0 And wsCalculations.Cells(, "C").Value = 0 _
            And wsCalculations.Cells(i, "D").Value = 0 And wsCalculations.Cells(i, "E").Value = 0 _
            And wsCalculations.Cells(i, "F").Value = 0 Then
            Exit For
            Else
            wsCalculations.Cells(i, "A").Value = wsCalculations.Cells(i, "CP").Value
            End If
            Next

, используя приведенный выше код, я попытался получить имена, значения всех четырех столбцов которых не равны нулю, но результат, который я получаю, является просто копией исходного списка. я выделил строки, я хочу, чтобы мой код пропустить. я также включил результат, который я получаю, и результат, который я хочу получить. Ниже приведен пример данных. Мои исходные данные имеют 54 строки. data. Может кто-нибудь сказать, пожалуйста, что я делаю не так?

Ответы [ 4 ]

3 голосов
/ 30 марта 2020

Нет реальной необходимости в VBA.

Обратите внимание, что я использовал таблицу со структурированными ссылками. При желании вы можете изменить его на диапазон с обычными ссылками.

Если у вас есть O365, вы можете использовать вспомогательный столбец и формулу.

Добавить вспомогательный столбец, который SUM ' s ячейки в каждой строке (и вы можете при необходимости скрыть этот столбец).

eg:  G2:  =SUM(Table3[@[Column2]:[Column6]])

Затем, предполагая, что данные находятся в Таблице с именем Table3, используйте формулу:

=INDEX(FILTER(Table3,Table3[sumRow]>0),0,1)

Если у вас более ранняя версия Excel, вы можете использовать:

I2: =IFERROR(INDEX(Table3[Column1],AGGREGATE(15,6,1/(Table3[sumRow]>0)*ROW(Table3)-ROW(Table3[#Headers]),ROWS($1:1))),"")

и заполнить всю длину таблицы.

enter image description here

1 голос
/ 30 марта 2020

Не решение, но может сократить ваш исходный код

Почему бы не создать скрытый столбец *, который = СУММА всей строки

Затем получить значение из этого

вместо того, чтобы использовать код для получения значения каждой из 5 ячеек, а затем добавить его.

edit: изменил «скрытую ячейку» на «скрытый столбец»: P

0 голосов
/ 30 марта 2020

Может кто-нибудь сказать мне, что я делаю не так?

на самом деле показанный вами код не соответствует вашей формулировке, поэтому невозможно сказать все, что неправильно

но наверняка Exit For является логической ошибкой, поскольку она действительно выводит вас из l oop, когда она впервые встречает пять нулей

, что касается этой логической ошибки, вы должны изменить этот кусок кода для следующего:

With wsCalculations
    For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row

        If WorksheetFunction.CountIf(.Cells(i, 2).Resize(, 5), 0) < 5 Then ' when a row is eligible for math

            ' do your math

        End If

    Next
End With

, где я использовал WorksheetFunction.CountIf() функцию, которая позволяет вам работать с различными условиями, так как ваша формулировка не была ясна и по этому пункту ( "больше чем 0 ", " все ячейки ... равны нулю "," больше 1 ")

0 голосов
/ 30 марта 2020

Попробуйте

Sub test()
    Dim rngDB As Range
    Dim rng As Range, rngSum As Range
    Dim wsCalculations As Worksheet
    Dim vR() As Variant
    Dim n As Long

    Set wsCalculations = ActiveSheet

    With wsCalculations
        Set rngDB = .Range("a2", .Range("a" & Rows.Count).End(xlUp))
    End With

    For Each rng In rngDB
        Set rngSum = rng.Offset(, 1).Resize(1, 5)
        If WorksheetFunction.Sum(rngSum) > 0 Then
            n = n + 1
            ReDim Preserve vR(1 To n)
            vR(n) = rng
        End If
    Next rng

    With wsCalculations
        If n Then
            .Range("h2").Resize(n) = WorksheetFunction.Transpose(vR)
        End If
    End With


End Sub
...