简体   繁体   中英

Next and Previous Buttons in Excel VBA Form

I have a form I am working on that will collect a set of data. I have text boxes, combo boxes, and a couple of option buttons. I have tried multiple ways to create the proper code to go to a previous record and to a next record but I cannot seem to get the code to work. I am new at this but hoping someone can assist. I can also e-mail the form over if that helps. I tried adding TraverseData to clean up and make it easier to input the data. I seem to have the next button working but I keep getting the 1004 error with the previous button that cycles back to the TraverseData. My code is below and any assistance is greatly appreciated.

Private Sub cmdprevious_Click()
Dim nCurrentRow As Long
Do
nCurrentRow = nCurrentRow - 1
TraverseData (nCurrentRow)
Loop Until nCurrentRow = 1 Or Sheets(1).Cells(nCurrentRow, 1).Value = Me.txtname.Value

If nCurrentRow = 1 Then
MsgBox "This is the last entry.", , "Alert!"

cmdprevious.Enabled = False
  End If
End Sub

Private Sub Cmdnext_Click()
Dim nCurrentRow As Long
Do
    nCurrentRow = nCurrentRow + 1
    TraverseData (nCurrentRow)
Loop Until Sheet1.Cells(nCurrentRow, 1).Value = "" Or Sheet1.Cells(nCurrentRow, 1).Value = 
Me.txtname.Value


End Sub
Private Sub TraverseData(nCurrentRow As Long)

Me.txtname.Value = Sheet1.Cells(nCurrentRow, 1)
Me.txtposition.Value = Sheet1.Cells("nCurrentRow, 2")
Me.txtassigned.Value = Sheet1.Cells(nCurrentRow, 3)
Me.cmbsection.Value = Sheet1.Cells(nCurrentRow, 4)
 Me.txtdate.Value = Sheet1.Cells(nCurrentRow, 5)
 Me.txtjoint.Value = Sheet1.Cells(nCurrentRow, 7)
 Me.txtDAS.Value = Sheet1.Cells(nCurrentRow, 8)
Me.txtDEROS.Value = Sheet1.Cells(nCurrentRow, 9)
Me.txtDOR.Value = Sheet1.Cells(nCurrentRow, 10)
Me.txtTAFMSD.Value = Sheet1.Cells(nCurrentRow, 11)
Me.txtDOS.Value = Sheet1.Cells(nCurrentRow, 12)
Me.txtPAC.Value = Sheet1.Cells(nCurrentRow, 13)
Me.ComboTSC.Value = Sheet1.Cells(nCurrentRow, 14)
Me.txtTSC.Value = Sheet1.Cells(nCurrentRow, 15)
Me.txtAEF.Value = Sheet1.Cells(nCurrentRow, 16)
Me.txtPCC.Value = Sheet1.Cells(nCurrentRow, 17)
Me.txtcourses.Value = Sheet1.Cells(nCurrentRow, 18)
Me.txtseven.Value = Sheet1.Cells(nCurrentRow, 19)
Me.txtcle.Value = Sheet1.Cells(nCurrentRow, 20)

End Sub

Private Sub UserForm_Initialize()
Dim nCurrentRow As Long
Dim currentrow As Long
Dim lastrow As Long

txtname = Cells(nCurrentRow, 1)
txtposition = Cells(nCurrentRow, 2)
txtassigned = Cells(nCurrentRow, 3)
cmbsection = Cells(nCurrentRow, 4)
txtdate = Cells(nCurrentRow, 5)
txtjoint = Cells(nCurrentRow, 7)
txtDAS = Cells(nCurrentRow, 8)
txtDEROS = Cells(nCurrentRow, 9)
txtDOR = Cells(nCurrentRow, 10)
txtTAFMSD = Cells(nCurrentRow, 11)
txtDOS = Cells(nCurrentRow, 12)
txtPAC = Cells(nCurrentRow, 13)
ComboTSC = Cells(nCurrentRow, 14)
txtTSC = Cells(nCurrentRow, 15)
txtAEF = Cells(nCurrentRow, 16)
txtPCC = Cells(nCurrentRow, 17)
txtcourses = Cells(nCurrentRow, 18)
txtseven = Cells(nCurrentRow, 19)
txtcle = Cells(nCurrentRow, 20)

With UserForm1.cmbsection

    .AddItem "Law Office Superintendent"
    .AddItem "NCOIC, Legal Office"
    .AddItem "NCOIC, Training & Readiness"
    .AddItem "NCOIC, Military Justice"
    .AddItem "NCOIC, Adverse Actions"
    .AddItem "NCOIC, General Law"
    .AddItem "NCOIC, International Law"
    .AddItem "NCOIC, Civil Law"
    .AddItem "NCOIC, Other"
    .AddItem "Military Justice Paralegal"
    .AddItem "General Law Paralegal"
    .AddItem "International Law Paralegal"
    .AddItem "Civil Law Paralegal"
    .AddItem "Adverse Actions Paralegal"
    .AddItem "Other see notes"
  End With

  With UserForm1.ComboTSC

    .AddItem "B – initial upgrade to journeyman (5 level)"
    .AddItem "C – initial upgrade to craftsman (7 level; SSgt-select or above)"
    .AddItem "F – held prior 5 level; in upgrade to 5 level (retrainee)"
    .AddItem "G – held prior 7 level; in upgrade to 7 level (retrainee SSgt-select or above)"
    .AddItem "R – fully qualified"
    .AddItem "Other see notes"
 End With

 With UserForm1.txtdate
 txtdate.Value = Format(txtdate.Value, "dd/mm/yyyy")
 End With
 nCurrentRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
 TraverseData (nCurrentRow)

 End Sub

Welcome to SO.

You execute Dim nCurrentRow As Long but you don't assign any value to it, so default value is 0.

And then you do a loop with nCurrentRow = nCurrentRow - 1 so nCurrentRow = -1 .

Your condition to end loop is:

Loop Until nCurrentRow = 1 Or Sheets(1).Cells(nCurrentRow, 1).Value = Me.txtname.Value and that condition can never be true.

The first time your Do...Loop executes, the value of nCurrentRow is -1 so you condition to end is:

...Loop Until -1= 1 Or Sheets(1).Cells(-1, 1).Value = Me.txtname.Value...

Notice the part after the Or . It's calling an impossible cell (row -1, column 1). That's not possible, so VBA raises error 1004.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM