ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 61893|回复: 69

[求助] 如何用vba实现模糊查找

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-7-30 22:23 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
模糊查找.rar (119.58 KB, 下载次数: 885)

b列为姓名
a列为姓名的首字母缩写
c1为要查找的目标
需要在a列中模糊查找c1,在d列返回查找结果,并按照匹配程度排序
我想用i遍历a列,用search(c1,a,1)的返回值来判断匹配度,用d[j]记录结果(d[j]=b)
用e[j]=search(c1,a,1)来记录匹配度
然后对d列e列进行排序
不知可行否?
用录制宏的方法以及实现,但d=b,需要对太多列进行排序。

我基本不会vba,写的代码到search公式总是出错
Dim i, j As Integer
j = 2
For i = 2 To 10202
On Error Resume Next
If Excel.WorksheetFunction.IsErr(Excel.WorksheetFunction.Search([d1], Cells(i, 1), 1)) = False Then
If Excel.WorksheetFunction.Search([d1], Cells(i, 1), 1) = 1 And Excel.WorksheetFunction.Len(Cells(i, 1)) = Excel.WorksheetFunction.Len([d1]) Then
Cells(j, 6) = 1
Cells(j, 5) = Cells(i, 2)
j = j + 1
Else
Cells(j, 6) = 2
Cells(j, 5) = Cells(i, 2)
j = j + 1
End If
End If
Next

请大家看看问题出在哪里?
有没有完成的代码?xiexie

TA的精华主题

TA的得分主题

发表于 2012-7-30 22:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
有好几种方法:数组发、Find法、ADO法等,下面是ADO法请参考:
Sub Macro1()
    Dim cnn As Object, SQL$
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open "Provider = Microsoft.Jet.Oledb.4.0;Extended Properties =Excel 8.0;Data Source =" & ThisWorkbook.FullName
    SQL = "Select 姓名 from [Sheet1$a1:b] where 首字母 like '%" & [C1] & "%'"
    Range("d2:d65536").ClearContents
    [d2].CopyFromRecordset cnn.Execute(SQL)
    cnn.Close
    Set cnn = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2012-7-30 22:45 | 显示全部楼层
本帖最后由 zhaogang1960 于 2012-7-30 22:49 编辑
  1. Sub Find法()
  2.     Dim c As Range, firstAddress$, arr(), m&
  3.     ReDim arr(1 To [a65536].End(xlUp).Row, 1 To 1)
  4.     With Range("a:a")
  5.         Set c = .Find([c1], , , 2)
  6.         If Not c Is Nothing Then
  7.             firstAddress = c.Address
  8.             Do
  9.                 m = m + 1
  10.                 arr(m, 1) = c.Offset(, 1)
  11.                 Set c = .FindNext(c)
  12.             Loop While Not c Is Nothing And c.Address <> firstAddress
  13.         End If
  14.     End With
  15.     Range("d2:d65536").ClearContents
  16.     If m > 0 Then [d2].Resize(m) = arr
  17. End Sub

复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-30 22:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhaogang1960 发表于 2012-7-30 22:45

谢谢
关于find的介绍,哪里能找到呢?
看了这个find和excel的find公式不同
在vb的帮助里也找不到

TA的精华主题

TA的得分主题

发表于 2012-7-30 22:56 | 显示全部楼层
本帖最后由 zhaogang1960 于 2012-7-30 22:56 编辑

数组法:
Sub 数组法()
    Dim arr, brr(), i&, m&, s$
    s = [c1]
    arr = Range("a2:b" & [a65536].End(xlUp).Row)
    ReDim brr(1 To UBound(arr), 1 To 1)
    For i = 1 To UBound(arr)
        If InStr(arr(i, 1), s) Then
            m = m + 1
            brr(m, 1) = arr(i, 2)
        End If
    Next
    Range("d2:d65536").ClearContents
    If m > 0 Then [d2].Resize(m) = brr
End Sub

TA的精华主题

TA的得分主题

发表于 2012-7-30 23:00 | 显示全部楼层
本帖最后由 zhaogang1960 于 2012-7-30 23:02 编辑
郁孤亭 发表于 2012-7-30 22:53
谢谢
关于find的介绍,哪里能找到呢?
看了这个find和excel的find公式不同


VBA帮助


Find 方法

应用于 Range 对象的 Find 方法。

TA的精华主题

TA的得分主题

发表于 2012-7-30 23:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请看附件
模糊查找.rar (127.85 KB, 下载次数: 4258)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-7-30 23:08 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-7-30 23:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
试试
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     If Target.Address <> "$C$1" Then Exit Sub
  3.     Dim arr, brr, i&, x&
  4.     i = Target.Offset(65535, -2).End(xlUp).Row
  5.     arr = Target.Offset(1, -2).Resize(i - 1, 2)
  6.     ReDim brr(1 To UBound(arr), 1 To 2)
  7.     For i = 1 To UBound(arr)
  8.         If InStr(1, arr(i, 1), Target.Value) > 0 Then
  9.             x = x + 1
  10.             brr(x, 1) = arr(i, 2)
  11.             brr(x, 2) = InStr(1, arr(i, 1), Target.Value)
  12.         End If
  13.     Next
  14.     Target.Offset(1, 1).Resize(UBound(arr), 2) = brr
  15.     Target.Offset(1, 1).Resize(UBound(arr), 2).Sort key1:=Target.Offset(1, 2), order1:=xlAscending
  16. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-31 09:58 | 显示全部楼层
zhaogang1960 发表于 2012-7-30 23:05
请看附件

多谢高手指点。
学习中
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-15 14:09 , Processed in 0.036173 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表