#excel #vba
Вопрос:
Я пытаюсь рассчитать среднее значение нескольких диапазонов, как показано на прилагаемом рисунке. Условия — Он должен соответствовать значению ячейки столбца «L» и «M» с диапазоном столбца «A» и составлять диапазон (например, от 322810 до 324900) для вычисления среднего значения столбца B, которое соответствует определенному диапазону (например, от 322810 до 324900). Я смог написать следующий код, но он явно не работает.
Dim lastrow As Long
Dim i As Long, j As Long
With Worksheets("Source")
lastrow = .Range("A" amp; .Rows.Count).End(xlUp).Row
For i = 2 To lastrow 1 'loop whole range (column C)
If .Cells(i, "L") = .Range("A").Value Then 'If column L cell value match with any cell of Range "A"
For j = i To lastrow 'Loop "group" range.
If .Cells(j, "M") = .Range("A").Value Then ' (end of small group range) then apply formula
.Cells(i, "N").Formula = "=AVERAGE(B" amp; i amp; ":B" amp; j amp; ")" 'AVG
Exit For
End If
Next j
End If
Next I
End With
Мы будем признательны за любую помощь (формула или код VBA).
Комментарии:
1. Используйте AVERAGEIFS и пропустите VBA.
Ответ №1:
Да, БигБен прав. Это и есть путь. Формула в моем примере такова
=AVERAGEIFS($B$3:$B$16,$A$3:$A$16,">="amp;L4,$A$3:$A$16,"<="amp;M4)
Комментарии:
1. Между критериями будет запятая (,) вместо полустолбца (;)…. Большое вам спасибо @Wolfgang
2. Ах да @surendrachoudhary, это было связано с моими местными настройками (немецкий)
3. Исправил исходный пост сейчас @surendrachoudhary, спасибо за голосование!
Ответ №2:
Попробуй,
Sub test()
Dim Lastrow As Long
Dim i As Long, j As Long
Dim r As Long
Dim mPoint As Long
Dim Ws As Worksheet
Dim vDB, vR()
Dim rngStart As Range, rngEnd As Range
Dim rngDB As Range
Set Ws = Worksheets("Source")
With Ws
Lastrow = .Range("A" amp; .Rows.Count).End(xlUp).Row
vDB = .Range("L3", .Range("m" amp; .Rows.Count).End(xlUp))
r = UBound(vDB, 1)
ReDim vR(1 To r, 1 To 1)
For i = 1 To r
For k = 1 To Lastrow
If .Range("a1").Cells(k) = vDB(i, 1) Then
Set rngStart = .Range("a1").Cells(k)
mPoint = rngStart.Row
Exit For
End If
Next k
If rngStart Is Nothing Then
Else
For k = mPoint To Lastrow
If .Range("a1").Cells(k) = vDB(i, 2) Then
Set rngEnd = .Range("a1").Cells(k)
Exit For
End If
Next k
End If
If rngStart Is Nothing Or rngEnd Is Nothing Then
Else
Set rngDB = .Range(rngStart, rngEnd).Offset(, 1)
Debug.Print rngDB.Address
vR(i, 1) = WorksheetFunction.Average(rngDB)
End If
Set rngStart = Nothing
Set rngEnd = Nothing
Next i
.Range("n3").Resize(r) = vR
End With
End Sub