.FindPrevious在excel userform

时间:2016-09-23 17:58:11

标签: excel vba excel-vba

我在Excel中创建用户表单,以便能够根据搜索条件搜索科学论文,例如"作者姓名"。我的用户表单有一个cmdSearch按钮("作者搜索"),允许用户输入作者姓名并找到与该搜索匹配的第一条记录。然后,从Excel文件中的该行填充表示诸如作者姓名,标题,摘要等字段的控制框。我曾尝试在表单中添加cmdNextcmdPrevious按钮,以继续搜索具有相同作者姓名的每一行或返回之前查看过的记录。为此,我使用.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

有关如何修改我的代码以使其搜索最近查看过的记录的任何建议都将非常感谢。

0 个答案:

没有答案