在用户窗体中查看满足条件的记录
在《链接用户窗体与工作表》及《链接用户窗体与工作表(续)》中曾介绍了在用户窗体中显示工作表中的数据的方法。这里,介绍另一种情况,即在用户窗体中查看满足特定条件的记录。如下图所示,表中姓名为张三的共三条记录,在姓名右侧文本框输入后,自动显示第1条记录,可以单击前一条和后一条按钮来回显示记录。

首先使用Find方法建立想要显示的记录区域,然后使用Property Set语句创建的自定义属性将记录区域传递给用户窗体。要确保记录区域的引用与工作表中出现的顺序相同,在Find方法中使用了After参数并将其值设置为搜索区域的最后一个单元格,这样Find方法将从单元格区域的第一个单元格开始搜索。
将用户窗体命名为UPos,其中的一些控件及其名称为:姓名文本框(txtName)、工作内容文本框(txtWork)、共有记录的文本框(txtY)、第几条记录的文本框(txtX)、前一条按钮(cmdPrev)、后一条按钮(cmdNext)。
在标准模块中输入下列代码:
Sub ShowPos()
Dim ufPos As UPos ‘用户窗体变量
Dim rFound As Range ‘存储当前找到的单元格
Dim rNameRange As Range ‘要搜索的单元格区域
Dim sFirstAdd As String ‘第一个被找到的单元格的地址
Dim rAllFound As Range ‘所有找到的单元格
‘从用户处获取数据,这里为了介绍方便采用了硬编码
Const strName As String = “张三”
Set rNameRange = Sheet1.Range(”A2:A8″)
‘查找
Set rFound = rNameRange.Find(strName, rNameRange(rNameRange.Cells.Count), xlValues, xlWhole)
‘如果找到
If Not rFound Is Nothing Then
‘存储第一个找到的单元格的地址
sFirstAdd = rFound.Address
‘添加找到的单元格到所有找到的单元格区域中
Set rAllFound = rFound
‘继续查找直到循环到开始处为止
Do
Set rFound = rNameRange.FindNext(rFound)
If rFound.Address <> sFirstAdd Then
Set rAllFound = Union(rAllFound, rFound)
End If
Loop Until rFound.Address = sFirstAdd
‘创建用户窗体
Set ufPos = New UPos
‘传递单元格区域到用户窗体
Set ufPos.AllFound = rAllFound
ufPos.Initialize
ufPos.Show
Else
MsgBox “没有找到匹配的数据!”
End If
Set ufPos = Nothing
End Sub
在用户窗体模块中,声明一些模块级的变量来包含传递的区域以及当前显示的区域。
Private mrAllFound As Range
Private mrCurrent As Range
Property Set AllFound(RHS As Range)
Set mrAllFound = RHS
End Property
在显示用户窗体之前,要初始化该窗体,将查找到的第一条记录填充窗体中的相应控件。
Public Sub Initialize()
‘设置当前记录为第一条记录
If Not mrAllFound Is Nothing Then
Set mrCurrent = mrAllFound(1)
Me.txtName.Text = mrCurrent.Value
Me.txtWork.Text = mrCurrent.Next.Value
Me.txtY.Text = mrAllFound.Cells.Count
Me.txtX.Text = 1
End If
End Sub
前一条按钮和后一条按钮使用FindPrevious方法和FindNext方法将记录移动到合适的位置。
Private Sub cmdNext_Click()
‘设置当前单元格
Set mrCurrent = mrAllFound.FindNext(mrCurrent)
Me.txtName.Text = mrCurrent.Value
Me.txtWork.Text = mrCurrent.Next.Value
‘增加计数器值
Me.txtX.Text = Me.txtX.Text + 1
End Sub
Private Sub cmdPrev_Click()
Set mrCurrent = mrAllFound.FindPrevious(mrCurrent)
Me.txtName.Text = mrCurrent.Value
Me.txtWork.Text = mrCurrent.Next.Value
Me.txtX.Text = Me.txtX.Text - 1
End Sub
最后,当第几条文本框中的值变化时,启用或禁用按钮以便使得用户不能试图到达不存在的记录。
Private Sub txtX_Change()
‘启用/禁用按钮
If Me.txtX.Text = 1 Then
Me.cmdPrev.Enabled = False
Else
Me.cmdPrev.Enabled = True
End If
If Me.txtX.Text = Me.txtY.Text Then
Me.cmdNext.Enabled = False
Else
Me.cmdNext.Enabled = True
End If
End Sub
注:本文整理自Dick的博客,稍作修改,供参考。
