Как сделать L oop в VBA, который выполняет операцию Sumproduct при выполнении условия - PullRequest
1 голос
/ 07 апреля 2020

Я хочу сделать все oop, которое выполняет операцию SumProduct каждой группой, идентифицированной с помощью Id. Я имею в виду, что мне нужна операция SumProduct между столбцами 2 и 3, и результат появляется в пустой ячейке этого столбца. Я попытался с помощью следующего кода, но он не работает, как я ожидаю. Я пытался изменить Starpoint в диапазоне, но мои решения не сработали. Спасибо за отзыв и помощь, которую вы можете дать мне.

Startrow = 2
Lastpoint = Cells(Rows.Count, 3).End(xlUp).Row
For i = Startrow To Lastpoint + 1
If Cells(i, 3).Value = "" Then Cells(i, 3).Value = Application.WorksheetFunction.SumProduct(a, b)
a = Range("C2: C" & Cells(i, 3).End(xlDown).Row)
b = Range("B2: B" & Cells(i, 3).End(xlDown).Row)
Next i

Ответы [ 2 ]

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

Я бы предложил этот код:

Option Explicit

Sub testAgain2GroupID()

  Dim i As Long, im1 As Long, startRow As Long, lastPoint As Long

  Dim a As Range, b As Range

  startRow = 2
  lastPoint = Cells(Rows.Count, 3).End(xlUp).Row

  Do While (startRow < lastPoint)

    '
    ' check id cell for group of identical id:
    '
    For i = startRow To lastPoint
      If (Cells(i, 1).Value = "") Then
        Exit For
      End If
    Next

    '
    ' now we found the group:
    '
    im1 = i - 1
    Set a = Range("C" & startRow & ":C" & im1)
    Set b = Range("B" & startRow & ":B" & im1)

    '
    ' so sumprod():
    '
    Cells(i, 3).Value = Application.WorksheetFunction.SumProduct(a, b)

    '
    ' prepare for next loop:
    '

    startRow = i + 1

  Loop

End Sub

Я проверил его, и он работал для меня.

Вы можете запускать этот код снова и снова без изменения результата в виде пустой ячейки в id столбец никогда не будет заполнен.

this is a screen capture

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

Вам необходимо определить диапазоны a,b в коде. Попробуйте это.

Option Explicit 'pay attention and read up on this. crucial to developing bug free code.

Sub test()

Dim startRow as Long, lastPoint as Long 'always, always declare variables and the type

startRow = 2
lastpoint = Cells(Rows.Count, 3).End(xlUp).Row

For i = Startrow To Lastpoint + 1

    Dim a as Range, b as Range
    Set a = Range("C2: C" & Cells(i, 3).End(xlDown).Row)
    Set b = Range("B2: B" & Cells(i, 3).End(xlDown).Row)

   If Cells(i, 3).Value = "" Then 
      Cells(i, 3).Value = Application.WorksheetFunction.SumProduct(a, b)
   End If

Next i

End Sub
...