VBA运行时错误'13':类型不匹配问题排查问询(含原因定位)
解决VBA运行时错误'13':类型不匹配(列表框填充矩阵场景)
我看到你已经精准定位到问题根源了——当第6、7列的单元格内容是字符串而非数字时,执行Start.Offset(i - 1, j - 1).Value * 100就会触发类型不匹配错误,毕竟字符串没法直接和数字做乘法运算。下面给你几个可行的修复方案,还有一些代码优化的小建议:
方案1:先判断单元格内容是否为数字再处理
在执行乘法运算前,先检查单元格的值是否可以转换为数字,从源头避免报错。修改后的核心代码块如下:
If (j = 6) Or (j = 7) Then Dim cellValue As Variant cellValue = Start.Offset(i - 1, j - 1).Value ' 检查内容是否为数字或可转换为数字的格式 If IsNumeric(cellValue) Then CompaniesListBox.List(i - 1, j - 1) = CDbl(cellValue) * 100 & " %" Else ' 非数字内容直接保留原格式,也可以自定义提示文本 CompaniesListBox.List(i - 1, j - 1) = cellValue & " %" End If Else CompaniesListBox.List(i - 1, j - 1) = Start.Offset(i - 1, j - 1).Value End If
方案2:用错误捕获机制兜底
如果不确定哪些单元格会出现非数字内容,可以临时开启错误忽略,捕获到错误后再做兼容处理:
If (j = 6) Or (j = 7) Then On Error Resume Next ' 临时开启错误忽略 Dim calcValue As Double calcValue = Start.Offset(i - 1, j - 1).Value * 100 If Err.Number = 0 Then CompaniesListBox.List(i - 1, j - 1) = calcValue & " %" Else CompaniesListBox.List(i - 1, j - 1) = Start.Offset(i - 1, j - 1).Value & " %" End If On Error GoTo 0 ' 恢复默认错误处理逻辑 Else CompaniesListBox.List(i - 1, j - 1) = Start.Offset(i - 1, j - 1).Value End If
额外优化建议
- 变量
Rows和Columns建议改用Long类型代替Integer:Excel的行数可能超过Integer的最大值(32767),用Long能避免溢出风险。 - 显式定义循环变量
i和j:VBA允许隐式定义变量,但显式定义会让代码更规范,减少潜在问题,比如在代码开头添加Dim i As Long, j As Long。 - 避免用内置对象名做变量名:你用的
Rows是VBA内置的对象名,虽然合法,但容易造成混淆,建议改成rowCount这类更清晰的命名。
完整修正后的代码:
Private Sub UpdateCompaniesListBox() Dim rowCount As Long Dim colCount As Long Dim Start As Range Dim CountWindowA As Range Dim i As Long, j As Long Dim cellValue As Variant Set CountWindowA = Sheets("Basic Data").Range("AM4:AM33") Set Start = Sheets("Basic Data").Range("AM4") rowCount = WorksheetFunction.CountA(CountWindowA) colCount = 8 ' 先清空列表框,避免重复添加内容 CompaniesListBox.Clear For i = 1 To rowCount CompaniesListBox.AddItem For j = 1 To colCount If (j = 6) Or (j = 7) Then cellValue = Start.Offset(i - 1, j - 1).Value If IsNumeric(cellValue) Then CompaniesListBox.List(i - 1, j - 1) = CDbl(cellValue) * 100 & " %" Else CompaniesListBox.List(i - 1, j - 1) = cellValue & " %" End If Else CompaniesListBox.List(i - 1, j - 1) = Start.Offset(i - 1, j - 1).Value End If Next j Next i CompaniesListBox.ColumnWidths = "118, 72, 49, 60, 71, 99, 38, 73" End Sub
另外补充说明下:你之前怀疑的CountA函数和Rows变量名问题,其实CountA在这里是正常工作的(只要CountWindowA区域的内容格式无异常);Rows作为变量名虽然合法,但正如上面的建议,换成更独特的命名会更稳妥。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

