ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关键词检索程序,如何实现清空文本框内容时,列表框不检索内容

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-5-18 09:58 | 显示全部楼层 |阅读模式
小白一个,借用论坛前辈的程序,制作了一个模糊检索,基本满足需求。但是有个问题:在文本框录入错误,删除全部关键词时,程序将所有数据源检索出来显示在列表框,由于数据源较多,造成检索过程很长,excel卡死。请教各位大神,如何完善代码,以实现:删除全部关键词时,程序不执行检索?
程序代码如下:
  1. Private Sub ListBox1_Click()
  2.     ActiveCell = ListBox1.Value
  3.     ActiveCell.Offset(0, 1).Select
  4. End Sub



  5. Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  6. Dim Arr1, myStr$, i&
  7.     With Me.TextBox1
  8.            For i = 1 To Len(.Value)
  9.                  If Asc(Mid$(.Value, i, 1)) > 255 Or Asc(Mid$(.Value, i, 1)) < 0 Then
  10.                     Language = True
  11.                     myStr = myStr & Mid$(.Value, i, 1)
  12.                  Else
  13.                     myStr = myStr & UCase(Mid$(.Value, i, 1))
  14.                  End If
  15.           Next
  16.     End With
  17.     With Sheet5
  18.            Me.ListBox1.Clear
  19.                  Arr1 = .Range("a1:a" & .Range("a65535").End(xlUp).Row)
  20.                  For i = 1 To UBound(Arr1)
  21.                       If InStr(Arr1(i, 1), myStr) Then
  22.                              Me.ListBox1.AddItem Arr1(i, 1)
  23.                       End If
  24.                  Next i
  25.     End With

  26. End Sub
  27. <hr class="l">Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  28.     If Target.Column <> 3 Or Target.Count > 2 Then
  29.         ListBox1.Visible = False
  30.         TextBox1.Visible = False
  31.         Exit Sub
  32.     End If

  33.     With TextBox1
  34.         .Activate
  35.         .Visible = True
  36.         .Value = ""
  37.         .Top = Target.Top
  38.         .Left = Target.Left
  39.         .Width = 500
  40.         .Height = Target.Height + 5
  41.     End With

  42.     With ListBox1
  43.         .Visible = True
  44.         .Top = Target.Offset(0, 1).Top
  45.         .Left = Target.Offset(0, 1).Left
  46.         .Width = 500
  47.         .Height = Target.Height * 10
  48.         .Clear
  49.     End With
  50. End Sub

复制代码


TA的精华主题

TA的得分主题

发表于 2023-5-18 11:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
在第9句代码下增加:
If keycode<>13 then Exit Sub
试试看

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-18 11:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
蓝桥玄霜 发表于 2023-5-18 11:17
在第9句代码下增加:
If keycode13 then Exit Sub
试试看

感谢指导,添加该行代码后,列表栏不执行检索了,可否再帮忙分析,感谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-18 16:18 | 显示全部楼层
已通过另一思路解决哈,如有其他方法,感谢不吝分享。目前解决代码如下:
  1. [code]'设置文本框和列表框的大小及位置
  2. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  3.     Dim b As Boolean, arr
  4.     If Target.Column <> 3 Or Target.Row < 2 Then b = True '如果用户选择的单元格不是第1列或者属于第1行
  5.     If Target.Columns.Count > 1 Or Target.Rows.Count > 1 Then b = True '如果用户选择的单元格数量大于1
  6.     If b Then
  7.         ListBox1.Visible = False '不可见
  8.         TextBox1.Visible = False '不可见
  9.         Exit Sub '退出程序
  10.     End If
  11.     With Worksheets("数据源表") '下拉列表来源内容的所在工作表
  12.         arr = .Range("a1:a" & .Cells(Rows.Count, "a").End(3).Row) '数据源
  13.     End With
  14.     With TextBox1
  15.         .Value = ""
  16.         .Visible = True '可见
  17.         .Top = Target.Top '文本框顶部位置
  18.         .Left = Target.Left '文本框左侧位置
  19.         .Height = Target.Height + 5 '文本框高度
  20.         .Width = Target.Width '文本框宽度
  21.         .Activate '激活文本框
  22.     End With
  23.     With ListBox1
  24.         .Visible = True '可
  25.         .Top = Target.Offset(-2, 1).Top
  26.         .Left = Target.Offset(0, 1).Left
  27.         .Height = Target.Height * 15
  28.         .Width = Target.Width
  29.         .List = arr '写入数据源数据
  30.     End With
  31. End Sub


  32. '根据文本框的输入值动态匹配数据
  33. Private Sub TextBox1_Change()
  34.     Dim arr, brr, i&, k&
  35.     With Worksheets("数据源表") '下拉列表来源内容的所在工作表
  36.         arr = .Range("a1:a" & .Cells(Rows.Count, "a").End(3).Row) '数据源
  37.     End With
  38.     If TextBox1.Text = "" Then ListBox1.List = arr: Exit Sub
  39.     ReDim brr(1 To UBound(arr))
  40.     For i = 1 To UBound(arr)
  41.         If InStr(1, arr(i, 1), TextBox1.Text, vbTextCompare) Then  '忽略字母大小写
  42.             k = k + 1
  43.             brr(k) = arr(i, 1)
  44.         End If
  45.     Next
  46.     ListBox1.List = brr '写入匹配后的数据
  47. End Sub


  48. '如果双击列表框的内容则写入活动单元格
  49. Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  50.     ActiveCell = ListBox1.Text
  51.     With ListBox1
  52.         .Clear '清空列表框
  53.         .Visible = False
  54.     End With
  55.     With TextBox1
  56.         .Value = ""
  57.         .Visible = False
  58.     End With
  59. End Sub
复制代码
[/code]

TA的精华主题

TA的得分主题

发表于 2023-5-18 17:04 | 显示全部楼层
第九行插入
Application.ScreenUpdating = False
Application.EnableEvents = False
第29行插入
Application.ScreenUpdating = True
Application.EnableEvents = True
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 09:24 , Processed in 0.039377 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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