excel - Error in finding last used cell in VBA -
when want find last used cell value, use:
dim last_row integer dim lastrow long lastrow = range("e4:e48").end(xldown).row debug.print lastrow
i getting wrong output when put single element cell. when put more 1 value cell, output correct. what's reason behind this?
note: intend make "one stop post" can use correct
way find last row. cover best practices follow when finding last row. , hence keep on updating whenever come across new scenario/information.
unreliable ways of finding last row
some of common ways of finding last row highly unreliable , hence should never used.
- usedrange
- xldown
- counta
usedrange
should never used find last cell has data. highly unreliable. try experiment.
type in cell a5
. when calculate last row of methods given below, give 5. color cell a10
red. if use of below code, still 5. if use usedrange.rows.count
get? won't 5.
here scenario show how usedrange
works.
xldown
equally unreliable.
consider code
lastrow = range("a1").end(xldown).row
what happen if there 1 cell (a1
) had data? end reaching last row in worksheet! it's selecting cell a1
, pressing end key , pressing down arrow key. give unreliable results if there blank cells in range.
counta
unreliable because give incorrect result if there blank cells in between.
and hence 1 should avoid use of usedrange
, xldown
, counta
find last cell.
find last row in column
to find last row in col e use this
with sheets("sheet1") lastrow = .range("e" & .rows.count).end(xlup).row end
if notice have .
before rows.count
. chose ignore that. see this question on possible error may get. advise using .
before rows.count
, columns.count
. question classic scenario code fail because rows.count
returns 65536
excel 2003 , earlier , 1048576
excel 2007 , later. columns.count
returns 256
, 16384
, respectively.
the above fact excel 2007+ has 1048576
rows emphasizes on fact should declare variable hold row value long
instead of integer
else overflow
error.
find last row in sheet
to find effective
last row in sheet, use this. notice use of application.worksheetfunction.counta(.cells)
. required because if there no cells data in worksheet .find
give run time error 91: object variable or block variable not set
with sheets("sheet1") if application.worksheetfunction.counta(.cells) <> 0 lastrow = .cells.find(what:="*", _ after:=.range("a1"), _ lookat:=xlpart, _ lookin:=xlformulas, _ searchorder:=xlbyrows, _ searchdirection:=xlprevious, _ matchcase:=false).row else lastrow = 1 end if end
find last row in table (listobject)
the same principles apply, example last row in third column of table:
sub findlastrowinexceltablecolaandb() dim lastrow long dim ws worksheet, tbl listobject set ws = sheets("sheet1") 'modify needed 'assuming name of table "table1", modify needed set tbl = ws.listobjects("table1") tbl.listcolumns(3).range lastrow = .find(what:="*", _ after:=.cells(1), _ lookat:=xlpart, _ lookin:=xlformulas, _ searchorder:=xlbyrows, _ searchdirection:=xlprevious, _ matchcase:=false).row end end sub
Comments
Post a Comment