Как считать в диапазоне с помощью функции .Find () в VBA

У меня есть следующий лист Excel

введите описание изображения здесь

С помощью следующей функции .Find() я нашел нужное мне значение и ячейку.

Dim finalResult as Range
Dim finalValue as String
Dim headValue as string

finalValue = "Banana"
headValue = "Food"

Set finalResult = Worksheets("mySheet").Range("A1:A20").Find(finalValue, LookIn:=xlValues, After:=headValue)

Мой вопрос: зная Начало = Еда и Конец = Банан диапазона, как я могу подсчитать, сколько ячеек между ними?

Спасибо


person ChangeWorld    schedule 17.02.2020    source источник
comment
'finalResult.Row (для банана) - finalResult.Row (для еды) ... It is good to declare two specific variables: finalFood` и finalBanana, например. Или используйте CountA для диапазона из двух диапазонов получения ячеек.   -  person FaneDuru    schedule 17.02.2020
comment
Какое заявление мне следует сделать? Dim finalCount as Integer `finalCount = finalResult.Row - finalValue`?   -  person ChangeWorld    schedule 17.02.2020
comment
Можно также использовать Application.Match   -  person JvdV    schedule 17.02.2020


Ответы (2)


Используйте этот код, пожалуйста. Есть и другие способы найти ваши клетки, но я буду использовать тот, который вам больше нравится:

Sub testFindRange()
 Dim finalResFood As Range, finalResBanana As Range
 Dim finalValue As String, headValue As String, sh As Worksheet
 Set sh = Worksheets("mySheet")' Having more workbooks open, it would be good to define it using the workbook where it belongs, too.

 finalValue = "Banana"
 headValue = "Food"

 Set finalResBanana = sh.Range("A1:A20").Find(finalValue, LookIn:=xlValues)
 Set finalResFood = sh.Range("A1:A20").Find(headValue, LookIn:=xlValues)
 Debug.Print finalResBanana.row - finalResFood.row
End Sub
person FaneDuru    schedule 17.02.2020
comment
Я согласен, что Range.Find будет более распространенным и предпочтительным методом +. Однако два замечания: параметр xlWhole кажется обязательным и проверка на Is Not Nothing - person JvdV; 17.02.2020

На самом деле несколько вариантов:

Sub Test()

Dim rng As Range: Set rng = Worksheets("mySheet").Range("A:A")
Dim rng1 As Range, rng2 As Range

'-------------------------------------
'Option 1: Range.Object
Set rng1 = rng.Find("Food", Lookat:=xlWhole)
Set rng2 = rng.Find("Banana", Lookat:=xlWhole)

If Not rng1 Is Nothing And Not rng2 Is Nothing Then
    Debug.Print rng2.Row - rng1.Row
End If

'-------------------------------------
'Option 2: Application.Match
With Application
    rw1 = .Match("Food", rng, 0)
    rw2 = .Match("Banana", rng, 0)
    If IsError(rw1) = False And IsError(rw2) = False Then
        Debug.Print rw2 - rw1
    End If
End With

'-------------------------------------
'Option 3: xlDown
Set rng1 = rng.Find("Food", Lookat:=xlWhole)
If Not rng1 Is Nothing Then
    Debug.Print rng1(rng1.Rows.Count, 1).End(xlDown).Row - rng1.Row
End If

End Sub
person JvdV    schedule 17.02.2020
comment
Если вы уверены в белой линии под заголовком "Банан", преимущество варианта 3 будет заключаться в том, что вам не нужно последнее значение в категории "Еда" @ChangeWorld. - person JvdV; 17.02.2020
comment
Да, я уверен насчет белой линии под бананом, я пробую вариант 3, который тоже кажется очень светлым - - person ChangeWorld; 17.02.2020
comment
Всем полезно узнать, что есть другие дороги, ведущие в Рим .. +) - person T.M.; 18.02.2020