VBA中Index+Match函数出现类型不匹配错误求助
问题分析与修复方案
你的VBA代码出现类型不匹配错误,核心原因是拼写错误和对象引用不规范,以下是具体修复点和优化建议:
1. 修正拼写错误
Worksheet("sheet2")应为Worksheets("sheet2")(缺少复数后缀s)WorksheetFuncion拼写错误,正确写法是WorksheetFunction(少了字母t)Dim LastRow As long规范写法为Dim LastRow As Long(VBA数据类型首字母建议大写,避免混淆)
2. 修复对象引用问题
- 在
With Worksheets("sheet1")代码块中,Cells(i,28)必须加上前缀.,否则会默认引用当前活动工作表而非指定的sheet1,正确写法是.Cells(i,28) - 已定义
Destination和Origin工作表对象,后续直接调用这些对象即可,无需重复写Worksheets("sheet1"),提升代码可读性和执行效率
修复后的完整代码
Sub CalculateTracker() Dim LastRow As Long Dim Destination As Worksheet Set Destination = Worksheets("sheet1") Dim i As Integer Dim Origin As Worksheet Set Origin = Worksheets("sheet2") ' 通过已定义的Destination对象获取数据最后一行 With Destination LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row End With For i = 2 To LastRow With Destination ' 修正拼写错误,规范对象引用 .Cells(i, 28).Value = WorksheetFunction.IfError(WorksheetFunction.Index(Origin.Range("AZ:AZ"), Application.Match(Destination.Range("X" & i), Origin.Range("B:B"), 0)), 0) End With Next i End Sub
额外优化建议
- 避免整列引用
Origin.Range("AZ:AZ")和Origin.Range("B:B"),可以缩小为实际数据范围,比如Origin.Range("B1:B" & Origin.Cells(Origin.Rows.Count, "B").End(xlUp).Row),大幅提升匹配效率 - 也可以单独处理
Match的错误情况,替代WorksheetFunction.IfError,逻辑更清晰:
For i = 2 To LastRow Dim matchResult As Variant matchResult = Application.Match(Destination.Range("X" & i).Value, Origin.Range("B:B"), 0) With Destination If IsError(matchResult) Then .Cells(i, 28).Value = 0 Else .Cells(i, 28).Value = Origin.Range("AZ" & matchResult).Value End If End With Next i
内容的提问来源于stack exchange,提问作者vivianna
相关产品推荐
相关产品推荐

