基于文本框值的列表框搜索功能出现类型不匹配运行时错误
基于文本框值的列表框搜索功能出现类型不匹配运行时错误
我完全懂你现在的困扰——搜索功能明明能正常返回结果,但那个跳出来的类型不匹配错误实在烦人。咱们来揪出这个问题的根源,把它解决掉。
首先,这个Run-time error '-2147352571 (80020005)'本质上是单元格内容类型和ListBox列表项的预期类型不兼容导致的。比如你的工作表里可能存在日期、数值,或者甚至是#N/A、#VALUE!这类错误值,直接把它们赋值给ListBox的List属性时,就会触发类型不匹配的报错。
给你几个具体的解决步骤:
1. 统一将单元格内容转为字符串
把出错的那行代码改成强制转换为字符串的形式,这样不管单元格里是数值、日期还是普通文本,都能被ListBox正常接收:
lstMaster.List(s, c) = CStr(Cells(sat, c + 1).Value)
2. 处理工作表中的错误值
如果你的数据里存在错误值(比如公式返回的#N/A),直接读取会触发报错,所以可以加个判断跳过或替换错误内容:
If Not IsError(Cells(sat, c + 1).Value) Then lstMaster.List(s, c) = CStr(Cells(sat, c + 1).Value) Else lstMaster.List(s, c) = "数据异常" ' 或者留空,根据需求调整 End If
3. 显式初始化计数器变量s
虽然你的代码逻辑上s会从0开始,但显式初始化能避免潜在的变量未定义问题,在循环前加上:
s = 0 ' 初始化搜索结果计数器
修改后的核心代码片段
把这些调整整合到你的代码里,关键部分会变成这样:
s = 0 ' 显式初始化计数器 With Sheets("Master") ' 用With语句避免重复引用工作表,更稳健 For sat = 4 To .Cells(.Rows.Count, RN).End(xlUp).Row '4 = first row of databody deg1 = UCase(.Cells(sat, RN).Value) ' 提前转大写,减少重复计算 If deg1 Like "*" & UCase(deg2) & "*" Then 'case insensitive AND searches the entire string lstMaster.AddItem For c = 0 To 119 'column indices, total columns If Not IsError(.Cells(sat, c + 1).Value) Then lstMaster.List(s, c) = CStr(.Cells(sat, c + 1).Value) Else lstMaster.List(s, c) = "数据异常" End If Next c s = s + 1 'This MUST follow "Next c", this increments s for each new record added End If Next End With
另外再给你个小优化建议:尽量避免用Sheets("Master").Activate,直接用With语句引用工作表更稳妥,不会因为当前激活的工作表变化而出错。
这样修改后,应该就能彻底解决那个类型不匹配的错误,同时保持搜索功能正常运行啦。
备注:内容来源于stack exchange,提问作者Yodelayheewho
相关产品推荐
相关产品推荐

