咔片PPT · AI自动生成演示文稿,模板丰富、排版精美 讯飞智文 · 一键生成PPT和Word,高效应对学习与办公

NO.1

我们都知道,使用Excel中查询功能,按下键盘Ctrl+F键就可调出查询功能对话框。

其实,在执行此功能的时候就是一些代码在运行,那么使用vba代码如何实现查询呢?

Range对象中的Find方法给我们提供一个很好的解决办法,可以方便地执行表格内容查询功能。

Find相当于Excel中查找与替换对话框所执行的功能。

本节主要介绍如何应用Range对象的Find和FindNext对象。

NO.2

Find英语意思”查找“,FindNext是查询下一个。

比如,要找一个关键字"潘金莲",那么就用代码:Range.Find "潘金莲"。

Range代表一个范围,就是说要在Range这个范围里找"潘金莲",所以Range就是一个单元格区域对象。

例如:Range("A1:F10").Find "潘金莲"

当然Find参数并是这么简单,其中有若干条件可以设置,比如查询条件,查询方式,大小写区分,向下查询,向上查询,先行后列或行列后行查询等等。

主要参数:

What:必需的,就是要查找的内容,数据类型为可变形,Variant。

Lookin:指定要搜索的数据的类型。xlFormulas 公式; xlValues值。

LookAt:指定是匹配全部搜索文本还是匹配任一部分搜索文本。xlPart 匹配任一部分; xlWhole

匹配全部。

应用以上参数就可写作这样:

Range("A1:F10").Find What:="潘金莲",Lookin:=xlValues,LookAt:=xlPart

查询格式如上代码,并不是我们在vba里要使用的全部正确格式。

严格来说这段代码有一个返回值,如上代码执行之后并没有任何表现。

所以要对代码进行一下调整。

dim R as Range

Set R=Range("A1:F10").Find (What:="潘金莲",Lookin:=xlValues,LookAt:=xlPart)

Msgbox R.Value

这样就会弹出查询到的内容,如果没有找到则返回一个Nothing。

重复查询

结合循环语句Do...While或For Each ...Next等循环语句,可以使用FindNext和FindPrevious进行重复查询。

解释

FindNext:当搜索到达指定的搜索区域末尾时,它会绕到该区域开头位置继续搜索

FindPrevious:当查找到指定查找区域的起始位置时,本方法将环绕至区域的末尾继续搜索

但是还有一个问题,由于它的工作原理,你会得到一个无限循环,也就是说不停地给你弹出查询到的结果。

默认情况下,当把查询范围遍历一个循环之后,Find会再次返回到开始或末尾位置继续查询,没有结束,没完没了。直到你给出一个结束条件。

如此,就必须要对第一次查询的结果,进行位置保存,把第一次找到的单元格地址Address保存到一个变量里,每次执行FindNext或FindPrevious对这个变量进行判断,如果相同就退出循环。

Dim FirstAddress as string

dim R as Range

Set R=Range("A1:F10").Find (What:="潘金莲",Lookin:=xlValues,LookAt:=xlPart)

FirstAddress=R.Address'保存第一次查询到的地址

具体参数设置如下图介绍:

NO.3

本示例做了一个很完整的查询方法。

其工作原理是,对于所选单元格内容进行查询,查询内容为文本框输入的内容(TextBox)。

查询结果以弹框方式显示出来,并且将查询结果的姓名列添加到组合框内(ComboBox)。

增加功能

单击选择组合框,弹出信息全部内容。

这里做了一个动态创建Form对话框以及表单控件功能,并且显示和删除Form表单的功能。

涉及比较多的表单创建定义操作。

当然,我们主要介绍Find功能。

Find示例

选择下拉框ComboBox后弹出查询结果详细信息,如下图。

此过程中自动创建Form表单,关闭后删除表单。

这样的对查询结果有一个很完整的检测方式。

显示Form表单

NO.4

查询按钮代码

Private Sub CommandButton1_Click() Dim x As String, xArr, n As Integer ReDim xArr(0) x = ActiveSheet.OLEObjects("TextBox1").Object.Value x = VBA.Trim(x) Dim FirstAddr As String If getRanges Is Nothing Then MsgBox "没有选择查找范围!", vbInformation, "错误提示": Exit Sub Dim R As Range With getRanges'定义查询范围 Set R = .Find(what:=x, LookIn:=xlValues, lookat:=xlPart)'查询 If Not R Is Nothing Then FirstAddr = R.Address'保存第一个查询到的地址 Do n = n + 1 ReDim Preserve xArr(n) Set R = .FindNext(R)'向下查询 xArr(n) = R.Row '保存行号 If R Is Nothing Then MsgBox "No" Else 'MsgBox r End If DoEvents Loop While Not R Is Nothing And R.Address <> FirstAddr'设置循环条件 '如果不是空值并且不是第一个查询到的地址就继续往下查询 Else MsgBox "没有找到""" & x & """", vbInformation, "找不到" Exit Sub End If End With '''''''''''''''''''''''''''''' ComboBox赋值 Dim LArr() ReDim LArr(1 To UBound(xArr)) Dim l As Variant n = 1 For Each l In xArr If l <> Empty Then LArr(n) = Cells(l, 2).Value n = n + 1 End If Next l With Me.ComboBox1 .Clear .List = LArr End With '''''''''''''''''''''''''''''' ComboBox赋值 MsgBox "共找到: " & UBound(xArr) & "个。" MsgBox Join(xArr) End Sub

查询范围函数

这个函数返回当前活动工作表被选择的单元格区域。

实际应用中需要替换为自己的工作表范围,把这个函数修改一下就可以应用以上过程。

Private Function getRanges() As Range Dim w As Worksheet, wRange As Range Set w = ActiveSheet Set wRange = ActiveWindow.RangeSelection Set getRanges = wRange End Function

NO.5

Range对象的Find方法是一个十分有用的功能,学习并掌握它对于VBA编程是一个极大的帮助。

在对数据进行查询过程中有着特别重要的意义。

有时候查询不是目的,查询之后将结果进行处理排序、改变格式、计算等才是真正要执行任务。

那么就需要配合使用其它代码功能对数据进行修饰。

那么更加强大的数据处理就需要学习更多的代码方法来进行操作。

-- END --

欢迎关注、收藏