Sorry but I do not agree with Michael's answer.
End(xlDown) is the VBA equivalent of clicking Ctrl
+Down
.
Try Ctrl
+Down
with
- an empty column
- a column with a value in row 1 but no other
- values in rows 1 and 2
- values in rows 1, 2, 3, 7, 8, 9, 13, 14 and 15
This will give you an idea of all the different rows, Ctrl
+Down
might take you to.
Set newRange = ws.Range("A1").End(xlDown).End(xlDown).End(xlUp).Offset(1, 0)
does not necessarily take you to the last used row plus 1.
I am surprised Set newRange = ws.Range("A1").End(xlDown).Offset(1, 0)
worked with an empty column. Range("A1").End(xlDown)
would take you to the bottom row of the sheet then .Offset(1, 0)
would try to take you off the sheet.
Consider:
Dim RowLast As Long
RowLast = ws.Cells(Rows.Count, "A").End(xlUp).Row
- If column A is empty, RowLast will be set to 1.
- If A1 has a value but no other cells have values, RowLast will be set to 1.
- If a number of cells in column A have values, RowLast will be set to the bottom row with a value.
- If you have a value in the final row, it will be ignored.
- If you have a value in the final two rows, RowLast will be set to Rows.Count - 1.
I assume you do not have values in the borrom rows. If you do not care if row 1 is left blank with an empty column, then:
RowLast = ws.Cells(Rows.Count, "A").End(xlUp).Row
Set NewRange = ws.Cells(RowLast + 1, "A")
should give the desired result regardless of the current contents of sheet ws.
If you do care about row 1 being left blank, experimenting with Ctrl
+Down
and Ctrl
+Up
will give you an understanding of the effect of different combinations of values.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…