ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关于多个关键词的模糊查询(已解决)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-11-16 20:15 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 zsonline 于 2017-11-17 00:49 编辑

我在隔壁论坛看到一段代码,可以实现一个单元格内输入多个关键词,用空格隔开,查找到包含所有关键词的单元格。我想把这个功能套到另一个单关键词查找的代码里,实现多关键词查找。但是苦于看不懂代码,原附件又无法下载,只能求助高手了。多关键词查找代码
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$$B$$2" Then Exit Sub
    Dim n&, Arr, i&, j&, y&
    Dim Flag As Boolean
    [b4:h16].ClearContents
    aa = Split(Target.Value): n = 3
    Arr = [b18].CurrentRegion
    For i = 2 To UBound(Arr)
        Flag = True
        x = Join(Application.Index(Arr, i), "")
        For y = 0 To UBound(aa)
            If InStr(UCase(x), UCase(Trim(aa(y)))) = 0 Then Flag = False: Exit For
        Next
        If Flag = True Then
            n = n + 1
            Cells(i + 17, 2).Resize(1, UBound(Arr, 2)).Copy Cells(n, 2)
        End If
    Next
End Sub

现有单关键词查找代码
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$C$3" Then Exit Sub
If Target = "" Then Exit Sub
Dim Sht As Worksheet, Arr, i&, sb$, Brr(1 To 5000, 1 To 4), n&, j&
[b6].Resize(5000, 4).ClearContents
[b6].Resize(5000, 4).Borders.LineStyle = xlNone
sb = Target.Value
For Each Sht In Sheets
    Arr = Sht.[a1].CurrentRegion
    For i = 2 To UBound(Arr)
        If InStr(Arr(i, 1), sb) Then
            n = n + 1
            For j = 1 To 4
                Brr(n, j) = Arr(i, j)
            Next
        End If
    Next
Next
If n >= 1 Then
[b6].Resize(n, 4) = Brr
[b6].Resize(n, 4).Borders.LineStyle = 1
Rows(6).Resize(n).RowHeight = 30
Else
    MsgBox "没有此设备信息。"
End If
End Sub

单关键词查找表格(感谢蓝桥版主的帮助)

热电3#站电气设备查询.zip

43.41 KB, 下载次数: 164

TA的精华主题

TA的得分主题

发表于 2017-11-16 20:55 | 显示全部楼层
'满意来朵小花哈
'稍作修改,试一下
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address <> "$C$3" Then Exit Sub
  If Len(Trim(Target)) = 0 Then Exit Sub
  Dim sht, arr, i, sb, brr(1 To 65536, 1 To 4), n, j, k, t, flag As Boolean
  If InStr(Target.Text, Space(1)) = 0 Then
    sb = Trim(Target.Text)
  Else
    t = Target.Text
    t = Split(t, Space(1))
  End If
  For Each sht In Sheets
    arr = sht.[a1].CurrentRegion
    If InStr(Target.Text, Space(1)) = 0 Then
      If Len(sb) > 0 Then
        For i = 2 To UBound(arr)
          If InStr(arr(i, 1), sb) Then
            n = n + 1
            For j = 1 To 4
              brr(n, j) = arr(i, j)
            Next
          End If
        Next
      End If
    Else
      For i = 2 To UBound(arr)
        For j = 0 To UBound(t)
          sb = Trim(t(j))
          If Len(sb) > 0 Then
            If InStr(arr(i, 1), sb) = 0 Then Exit For
          End If
        Next
        If j = UBound(t) + 1 Then
          n = n + 1
          For k = 1 To 4
            brr(n, k) = arr(i, k)
          Next
        End If
      Next
    End If
  Next
  With [b6:e65536]
    .ClearContents
    .Borders.LineStyle = xlNone
    If n >= 1 Then
      .Resize(n, 4) = brr
      .Resize(n, 4).Borders.LineStyle = 1
      Rows(6).Resize(n).RowHeight = 30
    Else
      MsgBox "没有此设备信息。"
    End If
  End With
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-17 00:48 来自手机 | 显示全部楼层
一把小刀闯天下 发表于 2017-11-16 20:55
'满意来朵小花哈
'稍作修改,试一下
Option Explicit

成功了,高手棒棒哒。再哪给小红花?

TA的精华主题

TA的得分主题

发表于 2018-2-12 10:17 | 显示全部楼层
这个问题对我有帮助,留个脚印,谢谢

TA的精华主题

TA的得分主题

发表于 2019-8-24 08:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 瓶砸 于 2019-8-24 08:22 编辑
一把小刀闯天下 发表于 2017-11-16 20:55
'满意来朵小花哈
'稍作修改,试一下
Option Explicit

小刀老师,If j = UBound(t) + 1 Then咋代码中是何用意?移植您的代码后并没有达到预期效果,能帮我看看问题出在哪里么?万分感谢。
http://club.excelhome.net/thread-1495571-1-1.html

TA的精华主题

TA的得分主题

发表于 2019-9-10 18:40 | 显示全部楼层
一把小刀闯天下 发表于 2017-11-16 20:55
'满意来朵小花哈
'稍作修改,试一下
Option Explicit

小刀师傅:

请教,怎么更改为查询多列...比如BDEF列?  谢谢你

TA的精华主题

TA的得分主题

发表于 2019-9-10 19:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
7993708 发表于 2019-9-10 18:40
小刀师傅:

请教,怎么更改为查询多列...比如BDEF列?  谢谢你

刚来这里敲的代码,我都忘了是解决什么问题的

可以把你的附件传上来,同时附上你的要求或条件,最好有图示,,,

TA的精华主题

TA的得分主题

发表于 2019-9-10 19:56 | 显示全部楼层
瓶砸 发表于 2019-8-24 08:19
小刀老师,If j = UBound(t) + 1 Then咋代码中是何用意?移植您的代码后并没有达到预期效果,能帮我看看 ...

不好意思刚看到

就是循环正常结束,如果有这条件一般循环中会有符合条件退出的语句:exit for

TA的精华主题

TA的得分主题

发表于 2019-9-10 20:54 | 显示全部楼层
一把小刀闯天下 发表于 2019-9-10 19:52
刚来这里敲的代码,我都忘了是解决什么问题的

可以把你的附件传上来,同时附上你的要求或条件,最好有 ...

附件有说明
谢谢

热电3#站电气设备查询.rar

102.2 KB, 下载次数: 74

TA的精华主题

TA的得分主题

发表于 2019-9-10 22:04 | 显示全部楼层
7993708 发表于 2019-9-10 20:54
附件有说明
谢谢

'条件不是很明确,自己修改,,,

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address <> "$C$3" Then Exit Sub
  If Len(Target.Value) = 0 Then Exit Sub
  Dim arr, i, j, k, kk, t, m, sht
  ReDim brr(1 To 10 ^ 4, 1 To 4)
  t = Split(Target.Value) '多条件,单空格分隔
  For Each sht In Sheets
    If sht.Name <> "查询页" Then
      arr = sht.[a1].CurrentRegion.Offset(, 1).Resize(, 4)
      For i = 2 To UBound(arr, 1)
        For j = 1 To UBound(arr, 2)
          For k = 0 To UBound(t)
            If InStr(arr(i, j), t(k)) Then '包含判断,只要符合多条件中的一个,,,
              m = m + 1
              For kk = 1 To UBound(arr, 2)
                brr(m, kk) = arr(i, kk)
              Next
              j = UBound(arr, 2): Exit For
            End If
          Next
        Next
      Next
    End If
  Next
  With [b6]
    .Resize(Rows.Count - 5, UBound(brr, 2)).ClearContents
    If m > 0 Then .Resize(m, UBound(brr, 2)) = brr
  End With
End Sub

评分

2

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-3-29 21:21 , Processed in 0.059045 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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