VBA代码报错排查:类型不匹配(Error13)与对象缺失(Error424)
让我们逐个解决你在编写Import过程时遇到的这两个棘手问题:
问题1:类型不匹配错误(Error 13)
这个错误的核心原因是你把变量名取成了rows,而Rows是Excel对象模型里的内置属性(用来表示行集合),变量名和内置属性重名直接导致了识别混淆。另外,你的变量声明i, rows, r As Long写法有坑——在VBA里只有最后一个变量会被声明为Long,前面的i和rows会默认是Variant类型,这也加剧了类型不匹配的风险。
修正方案:
- 把变量
rows改个不冲突的名字,比如totalRows; - 修正变量声明,确保每个变量都明确指定类型;
- 遍历行时直接用
Rows(i)即可(变量名不冲突后不会再混淆)。
修正后的删除空行代码片段:
' 修正变量声明,避免重名和类型模糊 Dim xSht As Worksheet, xWb As Workbook Dim xFileDialog As FileDialog, f As Variant, i As Long, totalRows As Long, r As Long Dim xStrPath As String, xFile As String Dim y As Range ' ... 你的其他代码 ... Set y = Range("A1:D2000") ' 从下往上遍历删除空行,避免跳过行 For i = y.Row + y.Rows.Count - 1 To y.Row Step -1 If Application.WorksheetFunction.CountA(Rows(i)) = 0 Then Rows(i).EntireRow.Delete End If Next i
问题2:对象缺失错误(Error 424)
这个错误是因为你用了不存在的ActiveWorksheet对象——正确的对象名是ActiveSheet。不过更稳妥的做法是直接引用目标工作表,而不是依赖Activate,因为激活操作很容易被用户操作或其他代码干扰而出错。
修正方案:
直接使用Worksheets("BY SHIFT")来操作排序,不需要先激活它:
修正后的排序代码片段:
' 不需要激活工作表,直接操作目标工作表的排序 With Worksheets("BY SHIFT") .Sort.SortFields.Clear .Sort.SortFields.Add2 Key:=.Range("C1"), SortOn:=xlSortOnValues, Order:=xlAscending .Sort.SortFields.Add2 Key:=.Range("B1"), SortOn:=xlSortOnValues, Order:=xlDescending With .Sort .SetRange .UsedRange .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End With ' 如果你偏好原来的写法,只需把ActiveWorksheet改成ActiveSheet: ' Worksheets("BY SHIFT").Activate ' ActiveSheet.UsedRange.Sort Key1:=Range("C1"), Key2:=Range("B1"), Header:=xlYes, _ ' Order1:=xlAscending, Order2:=xlDescending
完整修正后的核心代码片段
Sub Import() Dim xSht As Worksheet, xWb As Workbook Dim xFileDialog As FileDialog, f As Variant, i As Long, totalRows As Long, r As Long Dim xStrPath As String, xFile As String Dim y As Range Dim iCntr Dim rng As Range Set rng = Range("A10:D20") Application.ScreenUpdating = False ' ... 你的其他代码 ... Set y = Range("A1:D2000") ' 修正后的删除空行逻辑 For i = y.Row + y.Rows.Count - 1 To y.Row Step -1 If Application.WorksheetFunction.CountA(Rows(i)) = 0 Then Rows(i).EntireRow.Delete End If Next i ' 修正后的排序逻辑 With Worksheets("BY SHIFT") .Sort.SortFields.Clear .Sort.SortFields.Add2 Key:=.Range("C1"), SortOn:=xlSortOnValues, Order:=xlAscending .Sort.SortFields.Add2 Key:=.Range("B1"), SortOn:=xlSortOnValues, Order:=xlDescending With .Sort .SetRange .UsedRange .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End With Worksheets("2718").Activate Application.ScreenUpdating = True End Sub
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

