我在Excel中创建用户表单,以便能够根据搜索条件搜索科学论文,例如"作者姓名"。我的用户表单有一个cmdSearch
按钮("作者搜索"),允许用户输入作者姓名并找到与该搜索匹配的第一条记录。然后,从Excel文件中的该行填充表示诸如作者姓名,标题,摘要等字段的控制框。我曾尝试在表单中添加cmdNext
和cmdPrevious
按钮,以继续搜索具有相同作者姓名的每一行或返回之前查看过的记录。为此,我使用.find
和.findnext
实现了一个循环函数,然后.find
和.findprevious
向后移动。为了阻止无限循环,我放入了Do While Not... Loop
"继续下一步"和"继续上一个"您必须单击以便能够查看后续记录的按钮。 (这可能会有一种更优雅的方式,但目前这不是我的问题。)
我遇到的问题是当你点击cmdPrevious
按钮("上一个"),而不是去查看最后一个记录(真正的前一个记录)时,它会转到数据集中的倒数第二个记录。我认为正在发生的是.find
正在定位数据集中的最后一条记录,然后.findprevious
将转到之前的记录。下面是我cmdPrevious
循环的当前代码。任何人都可以建议如何修改我的代码,以便搜索最近查看过的记录吗?
注意:我尝试使用Worksheets("literature_format").Activate
然后使用After:= ActiveCell.Row
,以便我可以在当前行之后启动.find
命令,但这不是工作(代码不起作用 - 单击按钮时没有任何反应)。此外,如果我使用MsgBox ActiveCell.Row
来查看它认为活动行的内容,它总是返回带有该作者姓氏的第一条记录的行。也就是说,即使在我开始向前或向后搜索以便我的表单不显示第一条记录中的信息之后,ActiveCell.Row
也始终返回相同的行号。是否有一些技巧可以使其工作并让它更新"活动行"当我浏览数据集时?
以下是“后退”按钮的代码:
Private Sub cmdPrevious_Click()
Dim data As Range
Dim findrow As Range
Dim prevrow As Range
Dim ws As Worksheet
Dim Search As String
On Error Resume Next
Set ws = Worksheets("literature_format")
Set data = Sheet1.Range("H:H")
Search = Me.txtSearch.Value
If Search = "" Then
MsgBox "Search for previous record"
Else
Set findrow = data.find(What:=Search, LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, _
MatchCase:=False, SearchFormat:=False)
If Not findrow Is Nothing Then
Set prevrow = findrow
Do
Set findrow = data.FindPrevious(After:=findrow)
If Not findrow Is Nothing Then
If findrow.Address = prevrow.Address Then Exit Do
Me.Control1.Value = findrow.Offset(0, 0)
Me.Control2.Value = findrow.Offset(0, 3)
Me.Control3.Value = findrow.Offset(0, 4)
Me.Control4.Value = findrow.Offset(0, 15)
Me.Control5.Value = findrow.Offset(0, 2)
Me.Control6.Value = findrow.Offset(0, -7)
Me.Control7.Value = "Name of author(s)"
Do While Not bprevious
DoEvents
Loop
bprevious = False
End If
Loop
MsgBox "First record"
Exit Sub
End If
End If
End Sub
这里,如果我的代码为Continue Previous按钮(停止无限循环),并使用公共变量As Boolean:
Public bprevious As Boolean
Private Sub cmdBackward_Click()
'used for continue previous loop
bprevious = True
End Sub
有关如何修改我的代码以使其搜索最近查看过的记录的任何建议都将非常感谢。