В MSumProd Function
я ищущей lastrow с данными в столбце b
(передается от вашего Sub Button1
). Затем, вместо использования и Exit Do
, я использую цикл For
от первой ячейки (Cells(a, b)
) до последней строки с данными.
Предупреждение: В своем коде вы отправляете Cells(2, 1).Value = MSumProd(1, 1, 1, 5)
, что означает вторую строку в колонке А будут переписаны в результате значения MSumProd
функции. Поскольку вы отправляете ячейки (1, 1) в качестве стартовой ячейки функции MSumProd
, и в случае, если у вас есть несколько строк данных (начиная с Cell A1, до Cell A4, например), исходное значение Cell A2 будет перезаписано значение MSumProd
.
Sub Button1 Код
Sub Button1()
Cells(2, 1).Value = MSumProd(1, 1, 1, 5)
End Sub
Функция MSumProd Код
Function MSumProd(a As Integer, b As Integer, c As Integer, d As Integer)
Dim n As Long
Dim Lastrow As Long, lRow As Long
' find last row with data in Column with passed integer 'b'
Lastrow = Range(Cells(a, b), Cells(a, b)).CurrentRegion.Rows.Count
' reset SUMPRODUCT value
n = 0
' loop through all rows with data in column 'b'
For lRow = a To Lastrow
n = n + Cells(lRow, b).Value * Cells(c, d).Value
' I think you are trying to advance the row (and not column)
' Therefore, you need to advance a and not b
' In this code I advance the row with lROw in the "For" loop
c = c + 1 ' can be removed, since is advanced as with lRow
Next lRow
MSumProd = n
End Function
Попробуйте сначала сосредоточиться на соответствующем листе (например, 'Sheets ('Лист1'). Select'). – FDavidov
И, кстати, вам нужно проверить, есть ли 'Cell (x, y) .Value =" "', а не "Null". – FDavidov
Значение 'a' не изменяется, предоставляя вам бесконечный цикл, и ячейки могут быть пустыми, но не' Null' –