Я бы сделал это по-другому.
Редактировать: отредактировать код и снимок экрана, чтобы согласовать первый элемент
Собрать соответствующие номера строк в a Collection, а затем выведите массив с разницей между соответствующими номерами строк:
Option Explicit
Function countBetween(Draws As Range, LookFor As Long) As Long()
Dim colRowNums As Collection
Dim C As Range
Dim rowDiffs() As Long
Dim firstRow As Long
Dim firstAddress As String
Dim lTemp() As Long, I As Long
'find first row with data in Draws Range
' we do this just in case user picked the non-numeric header row
' could do more extensive checking
If IsNumeric(Draws(1, 1)) Then
firstRow = Draws(1, 1).Row
Else
firstRow = Draws(2, 1).Row
End If
'collect each row number of interest
'could also loop, but `.Find` should be faster on long arrays
Set colRowNums = New Collection
With Draws
Set C = .Find(what:=LookFor, after:=Draws(1, 1), LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext)
If Not C Is Nothing Then
firstAddress = C.Address
colRowNums.Add C.Row
Do
Set C = .Find(what:=LookFor, after:=C)
If Not C.Address = firstAddress Then
colRowNums.Add C.Row
Else
Exit Do
End If
Loop
End If
End With
'If first entry in Draws was LookFor, then it will be last in the list
' So check for that and exchange if necessary
If colRowNums(1) > colRowNums(colRowNums.Count) Then
colRowNums.Add Item:=colRowNums(colRowNums.Count), before:=1
colRowNums.Remove (colRowNums.Count)
End If
'create output array
ReDim lTemp(1 To colRowNums.Count, 1 To 1) 'for vertical outputl
lTemp(1, 1) = colRowNums(1) - firstRow + 1
For I = 2 To colRowNums.Count
lTemp(I, 1) = colRowNums(I) - colRowNums(I - 1)
Next I
countBetween = lTemp
End Function
Функция вернет вертикальный массив значений. Если у вас есть O365 с динамическими c массивами, вы можете просто ввести:
=countBetween(Draws,LookFor)
в одну ячейку, и результаты будут отображаться.
Если вы этого не сделаете, то вы тоже не сможете введите формулу в виде формулы массива для диапазона ячеек или используйте функцию INDEX
как:
=IFERROR(INDEX(countBetween(Draws,LookFor),ROWS($1:1)),"")
и заполните, пока не увидите пробелы.
РЕДАКТИРОВАТЬ для горизонтального вывода массива:
Если вы хотите горизонтальный вывод результатов, как я писал в комментарии, так как теперь у вас есть O365, все, что вам нужно сделать, это использовать функцию TRANSPOSE
. Например:
=TRANSPOSE(countBetween(A2:A23,B2))
Или вы можете изменить метод, который вы используете для создания выходного массива:
'for horizontal output
ReDim lTemp(1 To colRowNums.Count)
lTemp(1) = colRowNums(1) - firstRow + 1
For I = 2 To colRowNums.Count
lTemp(I) = colRowNums(I) - colRowNums(I - 1)
Next I