今天介绍在用户窗体中查找工作表中满足特定条件的所有记录,如下图所示,在工作表Sheet1中,姓名为“张三”的共有三条记录,在姓名右侧的文本框中输入“张三”后,将自动显示第1条记录的相关内容,然后可以单击“前一条”和“后一条”按钮来回显示相关的记录。
首先,使用Find方法根据查找条件查找到满足条件的所有记录,并将其赋值给Range变量。接着,使用Property Set语句创建的自定义属性将Range变量存储的记录区域传递给用户窗体。为了确保引用的记录区域与工作表中出现的顺序相同,在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