Добавить / рассчитать строки по нескольким критериям с помощью циклов на основе значений в других столбцах - PullRequest
3 голосов
/ 02 апреля 2020

У меня есть лист Excel, который выглядит следующим образом:

enter image description here

Мне нужно:

  1. Сложите сумму и стоимость для каждой позиции (все для 1, все для 2, все для 3, ...).

  2. Затем найдите «X» в фактическом а затем объедините все строки, в которых значение Position в этой строке равно, так что это должен быть ведущий и единственный оставшийся ряд для этой позиции в конце. НО он должен быть не на том же листе, а на новом. По сути, в этом примере будет второй лист с тремя строками (из-за 3 позиций в этом примере)

  3. Он должен быть динамическим c. Здесь может быть любое количество позиций

  4. Описание, дата и др. c. из позиции с X в фактическом должно быть принято для каждой позиции.

  5. Есть еще больше столбцов и больше вычислений, которые необходимо сделать, поэтому должно быть легко добавить критерии вычисления.

Я не Excel Pro, и я думаю, что это невозможно решить без кодирования Макро, поэтому не стесняйтесь доказать, что я неправ ...

Пока Я написал следующий код VBA, основанный на некоторых фрагментах, которые я нашел в Интернете, но, к сожалению, застрял с добавлением только определенных c строк (с тем же номером позиции) и вывел сумму в позицию с "x" в Actual:

Sub MergeRows()
    Dim r_src As Range, r_dst As Range

    ' Pick 1st row and column of table
    Set r_src = Sheets("Sheet1").Range("A2")
    Set r_dst = Sheets("Sheet2").Range("A2")

    Dim i As Integer, j As Integer
    Dim N_rows As Integer, N_cols As Integer

    'Find the size of the data
    N_rows = CountRows(r_src)
    N_cols = CountColumns(r_src)

    'Resize source range to entire table
    Set r_src = r_src.Resize(N_rows, N_cols)

    Dim src_vals() As Variant, dst_vals() As Variant
    'Get all the values from source
    src_vals = r_src.Value2

    ReDim dst_vals(1 To N_rows, 1 To N_cols)
    Dim k As Integer
    Dim x As Integer
    k = 0
    For i = 1 To N_rows
        For x = 1 To 10
            ' Check first column
            If Val(src_vals(i, 1)) = x Then
                ' Increment count
                k = k + 1
                ' Copy row values

                Dim qty As Integer
                qty = qty + src_vals(i, 27)
                src_vals(i, 27) = qty

                For j = 1 To N_cols
                    If src_vals(i, 2) = "X" Then
                    dst_vals(k, j) = src_vals(i, j)
                    End If
                Next j

            End If
        Next x
        qty = 0
    Next i
    ' Bring rows back into destination range
    If k > 0 Then
        r_dst.Resize(k, N_cols).Value2 = dst_vals
    End If
End Sub
Public Function CountRows(ByRef r As Range) As Integer
    CountRows = r.Worksheet.Range(r, r.End(xlDown)).Rows.Count
End Function
Public Function CountColumns(ByRef r As Range) As Integer
    CountColumns = r.Worksheet.Range("A:DS").Columns.Count
End Function

Ответы [ 2 ]

3 голосов
/ 02 апреля 2020

Пожалуйста, отметьте это

enter image description here Изображение 1. Извините за скриншот на немецком языке.
«Summe von Amount / Costs» означает «Сумма Сумма / затраты "и" Gesamtergebnis "означает" Общий результат ".

, который можно выполнить с помощью сводных таблиц (без использования VBA), он обновляется динамически.
См. Создание Сводная таблица для анализа данных листа .

Просто добавьте сводную таблицу Position к строкам, а Amount и Costs к значениям.

1 голос
/ 02 апреля 2020

На самом деле вам не нужно l oop через вещи, вы можете сделать базовые c дополнения с формулами sumif, а затем, возможно, просто использовать макрос для автоматизации применения формул на 2-м листе, и я думаю, один быстро l oop для удаления пустых строк:

Здесь вы можете увидеть формулы работ: Correct Totals

Formulae Shown

А в макросе вы просто хотите что-то вроде

Sub e()
Sheet4.Range("A2:A9").Formula = "=SUM('Sheet_1'!C2:C3)"
Sheet4.Range("B2:B9").Formula = "=IF('Sheet_1'!$B2=""X"",SUMIF('Sheet_1'!$A$2:$E$9,'Sheet_1'!A2,'Sheet_1'!$E$2:$E$9),"""")"
End Sub

Чтобы применить формулу, а затем, возможно,

Sheet4.Range("A2:B9").value2 = Sheet4.Range("A2:B9").value2

Чтобы разрешить их только до чисел.

Затем сделайте быстрый l oop, чтобы удалить пустые значения в столбце B.


NB Вы все еще можете сделать его полностью динамичным c, подставив мой жесткий диапазоны для переменной и используйте вашу функцию CountRows.

...