หมายเหตุ : ฉันตั้งใจจะทำให้เป็น "การโพสต์แบบครบวงจร" ที่คุณสามารถใช้Correctวิธีการค้นหาแถวสุดท้าย สิ่งนี้จะครอบคลุมแนวทางปฏิบัติที่ดีที่สุดที่จะต้องปฏิบัติเมื่อค้นหาแถวสุดท้าย และด้วยเหตุนี้ฉันจะอัปเดตมันต่อไปทุกครั้งที่ฉันเจอสถานการณ์ / ข้อมูลใหม่
วิธีที่ไม่น่าเชื่อถือในการค้นหาแถวสุดท้าย
วิธีที่พบได้บ่อยที่สุดในการค้นหาแถวสุดท้ายซึ่งไม่น่าเชื่อถือสูงและดังนั้นจึงไม่ควรใช้
- UsedRange
- xlDown
- COUNTA
UsedRangeไม่ควรใช้เพื่อค้นหาเซลล์สุดท้ายที่มีข้อมูล มันไม่น่าเชื่อถือสูง ลองการทดลองนี้
A5พิมพ์สิ่งที่อยู่ในมือถือ ตอนนี้เมื่อคุณคำนวณแถวสุดท้ายด้วยวิธีการใด ๆ ที่ระบุด้านล่างก็จะให้ 5 ตอนนี้สีเซลล์A10สีแดง หากคุณใช้รหัสด้านล่างใด ๆ คุณจะยังคงได้รับ 5 หากคุณใช้Usedrange.Rows.Countสิ่งที่คุณได้รับ มันจะไม่เป็น 5
นี่คือสถานการณ์ที่แสดงให้เห็นว่าUsedRangeทำงานอย่างไร

xlDown ไม่น่าเชื่อถือเท่ากัน
พิจารณารหัสนี้
lastrow = Range("A1").End(xlDown).Row
จะเกิดอะไรขึ้นหากมีเพียงเซลล์เดียว ( A1) ซึ่งมีข้อมูล คุณจะไปถึงแถวสุดท้ายในแผ่นงาน! มันก็เหมือนกับการเลือกมือถือA1แล้วกดEndคีย์แล้วกดDown Arrowคีย์ สิ่งนี้จะให้ผลลัพธ์ที่ไม่น่าเชื่อถือหากมีเซลล์ว่างในช่วง
CountA ไม่น่าเชื่อถือเพราะจะให้ผลลัพธ์ที่ไม่ถูกต้องหากมีเซลล์ว่างในระหว่างนั้น
และด้วยเหตุนี้ควรหลีกเลี่ยงการใช้UsedRange, xlDownและCountAเพื่อหาเซลล์สุดท้าย
ค้นหาแถวสุดท้ายในคอลัมน์
ในการค้นหาแถวสุดท้ายใน Col E ให้ใช้สิ่งนี้
With Sheets("Sheet1")
LastRow = .Range("E" & .Rows.Count).End(xlUp).Row
End With
ถ้าคุณสังเกตเห็นว่าเรามีก่อน. Rows.Countเรามักเลือกที่จะเพิกเฉย ดูคำถามนี้เกี่ยวกับข้อผิดพลาดที่คุณอาจได้รับ ฉันมักจะแนะนำให้ใช้.ก่อนและRows.Count Columns.Countคำถามนั้นเป็นสถานการณ์แบบคลาสสิกที่รหัสจะล้มเหลวเนื่องจากการRows.Countส่งคืน65536สำหรับ Excel 2003 และรุ่นก่อนหน้าและ1048576สำหรับ Excel 2007 และใหม่กว่า Columns.Countผลตอบแทนในทำนองเดียวกัน256และ16384ตามลำดับ
ความจริงข้างต้นที่ Excel 2007+ มี1048576แถวยังเน้นถึงความจริงที่ว่าเราควรประกาศตัวแปรซึ่งจะเก็บค่าแถวไว้เสมอLongแทนที่จะเป็นIntegerอย่างอื่นคุณจะได้รับOverflowข้อผิดพลาด
โปรดทราบว่าวิธีการนี้จะข้ามแถวที่ซ่อนอยู่ มองย้อนกลับไปที่หน้าจอของฉันข้างต้นสำหรับคอลัมน์ Aถ้าแถว 8 ถูกซ่อนไว้วิธีนี้จะกลับมาแทน58
ค้นหาแถวสุดท้ายในชีต
หากต้องการค้นหาEffectiveแถวสุดท้ายในแผ่นงานให้ใช้สิ่งนี้ Application.WorksheetFunction.CountA(.Cells)ขอให้สังเกตการใช้งานของ สิ่งนี้จำเป็นเพราะถ้าไม่มีเซลล์ที่มีข้อมูลในแผ่นงานก็.Findจะให้คุณRun Time Error 91: Object Variable or With block variable not set
With Sheets("Sheet1")
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
lastrow = .Cells.Find(What:="*", _
After:=.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
Else
lastrow = 1
End If
End With
ค้นหาแถวสุดท้ายในตาราง (ListObject)
ใช้หลักการเดียวกันเช่นเพื่อรับแถวสุดท้ายในคอลัมน์ที่สามของตาราง:
Sub FindLastRowInExcelTableColAandB()
Dim lastRow As Long
Dim ws As Worksheet, tbl as ListObject
Set ws = Sheets("Sheet1") 'Modify as needed
'Assuming the name of the table is "Table1", modify as needed
Set tbl = ws.ListObjects("Table1")
With tbl.ListColumns(3).Range
lastrow = .Find(What:="*", _
After:=.Cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
End With
End Sub