Excel VBA表单中的“下一步”和“上一步”按钮

Excel VBA表单中的“下一步”和“上一步”按钮,excel,vba,forms,button,next,Excel,Vba,Forms,Button,Next,我有一个表格,我正在工作,将收集一组数据。我有文本框、组合框和几个选项按钮。我尝试了多种方法来创建正确的代码,以转到上一条记录和下一条记录,但我似乎无法让代码正常工作。我是新手,但希望有人能帮我。如果有帮助的话,我也可以通过电子邮件发送表格。我尝试添加TraverseData来清理并使数据输入更容易。我似乎有下一个按钮的工作,但我不断得到与前一个按钮,循环回到TraverseData 1004错误。下面是我的代码,非常感谢您的帮助 Private Sub cmdprevious_Click()

我有一个表格,我正在工作,将收集一组数据。我有文本框、组合框和几个选项按钮。我尝试了多种方法来创建正确的代码,以转到上一条记录和下一条记录,但我似乎无法让代码正常工作。我是新手,但希望有人能帮我。如果有帮助的话,我也可以通过电子邮件发送表格。我尝试添加TraverseData来清理并使数据输入更容易。我似乎有下一个按钮的工作,但我不断得到与前一个按钮,循环回到TraverseData 1004错误。下面是我的代码,非常感谢您的帮助

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
欢迎来到SO

执行
Dim nCurrentRow的长度为
,但不为其赋值,因此默认值为0

然后用
nCurrentRow=nCurrentRow-1执行循环,因此
nCurrentRow=-1

结束循环的条件是:

循环直到nCurrentRow=1或Sheets(1).Cells(nCurrentRow,1).Value=Me.txtname.Value
并且该条件永远不会为真

第一次执行
Do…循环
时,
nCurrentRow
的值是
-1
,因此要结束的条件是:

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

注意
后面的部分。它正在调用一个不可能的单元格(第1行,第1列)。这是不可能的,所以VBA会引发错误1004

欢迎来到SO。执行
Dim nCurrentRow的长度为
,但不为其赋值,因此默认值为0。然后用
nCurrentRow=nCurrentRow-1执行循环,因此
nCurrentRow=-1
。结束循环的条件是
循环直到nCurrentRow=1或表(1).Cells(nCurrentRow,1).Value=Me.txtname.Value
,并且该条件永远不会为真。谢谢您,因此基本上我需要为nCurrentRow创建一个值,以便公式不会搜索行-1。我可以将nCurrentRow=nCurrentRow+1放进去吗?是的,
nCurrentRow=nCurrentRow+1
将返回1第一个循环,2第二个循环,依此类推。我不知道这是否正是让它工作所需要的,但确实可以避免错误1004我会试试看。我试着让它浏览以前的记录,以便以后可以重新编辑,而不必直接进入excel