วิธีนับในช่วงด้วยฟังก์ชัน .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)

คำถามของฉันคือ เมื่อทราบ Start = Food และ End = Banana ของช่วง ฉันจะนับจำนวนเซลล์ที่อยู่ระหว่างนั้นได้อย่างไร

ขอบคุณ


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 - ค่าสุดท้าย` ?   -  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
หากคุณแน่ใจเกี่ยวกับเส้นสีขาวใต้ Banana ข้อดีของตัวเลือกที่ 3 ก็คือคุณไม่จำเป็นต้องใช้ค่าสุดท้ายภายใต้หมวดอาหาร @ChangeWorld - person JvdV; 17.02.2020
comment
ใช่ ฉันแน่ใจเกี่ยวกับเส้นสีขาวใต้ Banana ฉันกำลังลองใช้ตัวเลือก 3 ที่ดูสว่างมากเช่นกัน- - person ChangeWorld; 17.02.2020
comment
เป็นประโยชน์สำหรับทุกคนที่จะค้นพบว่ายังมี ถนนที่มุ่งสู่กรุงโรมอีกมาก ..+) - person T.M.; 18.02.2020