In this post I am going to show you how you can find the last row in excel vba, so you can enter your new data.
On the previous screen I have a list of random names I generated from https://www.generatedata.com/
When the button “View/Edit Records” is clicked, we’re launching a UserForm which allows us to move back and forth through the records, edit, and add new ones.
This is what happens when the UserForm is clicked:
Private Sub UserForm_Initialize()
Range("A2").Select
Me.txtName = Range("A2")
End Sub
Cell A2 is selected and the textbox shows the value of Cell A2.
These are the buttons which control record navigation:
...and here is the code:
'We will make a modular scope variable because we need this _
row reference as long as the form is open
Dim m_lngRow As Long
Private Sub btnForward_Click()
'increment the active row and sync the UserForm and the Activesheet
m_lngRow = ActiveCell.Row + 1
'select the next cell and render the new data on the UserForm
Range("A" & m_lngRow).Select
Me.txtName = Range("A" & m_lngRow)
End Sub
Private Sub btnBack_Click()
'increment the active row and sync the UserForm and the Activesheet
m_lngRow = ActiveCell.Row - 1
'select the next cell and render the new data on the UserForm
Range("A" & m_lngRow).Select
Me.txtName = Range("A" & m_lngRow)
End Sub
Again, we have a modular scope variable because we need to know the row being referenced as long as the form is open, and if we just form it in the procedure, the scope will only be when one of the buttons are clicked.
The “New” button is really the jist of this post.
The plan is:
**First find the last cell used, then find the row of the cell.
***We could move from the “top down”, or the “bottom up”.
With the “top down” approach, we’ll find the next available cell, but the blank cell may be between 2 already used cells.
In my opinion, we can move to the last row on the worksheet, and then upwards to find the last used cell.
This is the better option IMO.
Private Sub btnNew_Click()
Dim lngLastRow As Long
'Find the last row used
lngLastRow = FindLastRow("A")
lngLastRow = lngLastRow + 1
Range("A" & lngLastRow).Select
Me.txtName = Range("A" & lngLastRow)
End Sub
Function FindLastRow(WhichColumn As String) As Long
Dim lngLastRow As Long
'move to the last row on the worksheet and find the last used cell.
With ActiveSheet
lngLastRow = ActiveSheet.Cells(1048576, WhichColumn).End(xlUp).Row
End With
FindLastRow = lngLastRow
End Function
Now that we found the last row, we can enter new data:
Private Sub btnEnter_Click()
Range("A" & ActiveCell.Row) = Me.txtName
End Sub
This is pretty simple, we are just setting the cell value = to the form value.
Here is all the code:
'We will make a modular scope variable because we need this _
row reference as long as the form is open
Dim m_lngRow As Long
Private Sub btnForward_Click()
'increment the active row and sync the UserForm and the Activesheet
m_lngRow = ActiveCell.Row + 1
'select the next cell and render the new data on the UserForm
Range("A" & m_lngRow).Select
Me.txtName = Range("A" & m_lngRow)
End Sub
Private Sub btnBack_Click()
'increment the active row and sync the UserForm and the Activesheet
m_lngRow = ActiveCell.Row - 1
'select the next cell and render the new data on the UserForm
Range("A" & m_lngRow).Select
Me.txtName = Range("A" & m_lngRow)
End Sub
Private Sub btnEnter_Click()
Range("A" & ActiveCell.Row) = Me.txtName
End Sub
Private Sub btnNew_Click()
Dim lngLastRow As Long
'Find the last row used
lngLastRow = FindLastRow("A")
lngLastRow = lngLastRow + 1
Range("A" & lngLastRow).Select
Me.txtName = Range("A" & lngLastRow)
End Sub
Function FindLastRow(WhichColumn As String) As Long
Dim lngLastRow As Long
'move to the last row on the worksheet and find the last used cell.
With ActiveSheet
lngLastRow = ActiveSheet.Cells(1048576, WhichColumn).End(xlUp).Row
End With
FindLastRow = lngLastRow
End Function
Private Sub UserForm_Initialize()
Range("A2").Select
Me.txtName = Range("A2")
End Sub
So that’s how to find the last row in Excel VBA.
Let me know if you have any questions.
Use this form to send me a message:
[simple_contact_form]
****************************************************
|
|





