2016-04-26 8 views
0

Как подсчитать расстояние определенного значения в ячейке между строками и вычислить его среднее значение? Я имею в виду 3000 строк значений или больше. Сложно подсчитывать его один за другим, потому что не только он меняется, но и продолжает добавлять новые значения. Это дает мне головную боль. Я бы по-настоящему оценил это, если бы какой-нибудь Genius мог решить это для меня в Excel VBA. Если кто-то может достичь этого, используя формулу массива без вспомогательных ячеек, тем лучше.Код Excel-VBA для подсчета расстояний между строками и вычисления его среднего значения

Короткий пример здесь:

+0

не должны расстояние между рядами 5 и 3 - 2, а не 3? –

+0

@VincentG это должно быть 3 сэр, потому что я хочу рассчитывать, начиная со значения, которое оно само. если первое значение находится на B1, а следующее - на B2, тогда результирующее значение должно быть 2, так как мы начали отсчет с первого значения в строке. – vxpoisongas

ответ

2

Потому что я был «плохой парень» в последний раз, я обеспечу работоспособную UDF на этот раз:

Public Function AVROW(rng As Range, str As String) As Double 
    Set rng = Intersect(rng.Parent.UsedRange, rng) 
    If rng.Rows.Count < 2 Then Exit Function 
    Dim aCount As Long, aRow As Long, xCount As Long, xSum As Long 
    While Not IsNumeric(Application.Match(str, rng.Rows(aRow + 1), 0)) 
    aRow = aRow + 1 
    If aRow >= rng.Rows.Count Then Exit Function 
    Wend 
    Do 
    aRow = aRow + 1 
    aCount = aCount + 1 
    If IsNumeric(Application.Match(str, rng.Rows(aRow + 1), 0)) Then 
     xCount = xCount + 1 
     xSum = xSum + aCount + 1 
     aCount = 0 
    End If 
    Loop While aRow < rng.Rows.Count - 1 
    AVROW = xSum/xCount 
End Function 

При выполнении шага кода пути шаг, он должен быть самообучающимся.
Однако, если у вас возникли какие-либо вопросы, просто спросите :)

enter image description here

+1

Все в порядке ... Вы по-прежнему приветствуются;) –

1

Другой способ для достижения этой цели, как показано ниже

Public Function getaverage(r As Range, a As String) As Double 
    Dim avgg As Double 
    Dim matchount As Long 
    Dim newex As Long 
    For Each cell In r 
     If cell.Value = a Then 
      matchount = matchount + 1 
      If matchount = 1 Then 
       Start = cell.Row 
      Else 
       newex = cell.Row - (Start - 1) 
       avgg = avgg + newex 
       Start = cell.Row 
      End If 

     End If 
    Next 
    getaverage = avgg/(matchount - 1) 
End Function 

enter image description here