在使用.find,.findnext,使用和不使用循环的情况下,excel用户窗体中的下一个button出现问题

这是我第一次使Excel用户表单和使用VBA编码。 我在Excel中创build一个用户表单,可以根据“作者姓名”,“关键词”,“物种”等search词search科学论文(论文信息input到Excel中)。 每个search词当前是一个不同的用户表单,这个例子是基于“作者search”用户表单。

我的用户表单有一个cmdSearchbutton,允许用户input作者姓名并find与该search匹配的第一条logging。 然后从Excel文件中的该行填充表示诸如作者名称,标题,摘要等字段的控制框。 我正在尝试向表单添加一个cmdNext和cmdPreviousbutton,以继续向前search具有相同作者姓名的每一行,或者返回到以前查看的logging。 我已经修改了此前和其他网站上发现的代码,并遇到两个问题之一。

使用下面的代码,当我点击下一个button时,在每个匹配的logging中填充控制框,并popup消息框(“点击下一个”)(这是find我所有的logging,太棒了!)。 问题是,如果您在消息框上单击确定,它将直接到下一个logging和下一个消息框。 您不能退出消息框,停止logging并检查。 (通过在这里检查,我的意思是查看logging,然后单击一个控制框来读取或复制文本)。这个过程一直持续到所有的logging(这可能是很多的消息框和点击很多,由于logging数)。

如果我删除MsgBox的“单击下一条logging”行,则循环会一直遍历所有logging,直到到达最后一条logging(控制框将填充上一条匹配logging的信息,并且消息框将显示“最后一条logging“),然后用户不能再查看其中的任何logging。

另一方面,如果我一起取出循环,那么当您单击cmdNextbutton时,它只会将您带到第一个匹配的logging,而当我再次单击“下一步”时,什么都不会发生,它不会转到下一条logging之后。 我用我的cmdPreviousbutton使用SearchDirection同样的问题:= xlPrevious。

显然有一些关于循环如何工作的地方,或者说我不明白的地方或者我正在做的事情,那么当我尝试不使用循环时,不允许cmdNext继续查找下一个logging。 任何build议将不胜感激。 以下是我正在使用的代码:

Private Sub cmdNext_Click() Dim data As Range Dim findrow As Range Dim nextrow 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 "Enter author or editor name" Else Set findrow = data.find(What:=Search, LookIn:=xlValues, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) If Not findrow Is Nothing Then Set nextrow = findrow Do Set findrow = data.FindNext(After:=findrow) If Not findrow Is Nothing Then If findrow.Address = nextrow.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)" MsgBox "Click for next record" Else End If Loop MsgBox "Last record" Else End If End If End Sub 

您不能退出消息框,停止logging并检查。 (通过在这里检查我的意思是查看logging,然后单击控制框来阅读或复制文本。)

而不是一个MsgBox提示符,您应该执行以下操作:

  1. 将一些控制button(如cmdContinue添加到UserForm。
  2. 您将需要添加一个公共或模块级别的variables,如bContinue as Boolean 。 这个variables默认是False的。
  3. cmdContinuebutton的_Click过程应该将bContinue值设置为True ,我们将在步骤4中使用它。
  4. 当过程“find”一个匹配元素时,填充UserForm中的字段并执行一个循环,直到满足一些条件(这基本上是一个带有转义条件的无限循环)。
  5. 可选地,包含MsgBox来指示用户应该按下“继续”button(或者,如果还有其他button将数据拷贝/等等,他们可以使用这些

例如,我认为这是基本的方法:

  Do Set findrow = data.FindNext(After:=findrow) If Not findrow Is Nothing Then If findrow.Address = nextrow.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)" 'This should loop indefinitely until the user presses the "cmdContinue" button, and that will allow it to process the next record Do While Not bContinue DoEvents Loop ' reset to False so that the above loop will work for the next match bContinue = False Else End If Loop 

我testing了一个非常简单的forms,两个button,一个触发无限循环与DoEvents ,另一个停止无限循环:

在这里输入图像说明

 Dim bContinue As Boolean Private Sub CommandButton2_Click() bContinue = True End Sub Private Sub UserForm_initialize() End Sub Private Sub CommandButton1_Click() bContinue = False Do While Not bContinue DoEvents Loop End Sub