运行时错误“13”:VBA代码types不匹配

我正在使用我正在处理的项目中的以下代码:

Sub test() Application.ScreenUpdating = False Worksheets("Technician Report Summary").Range("G2:I8561").ClearContents Dim Source As Range, Target As Range Dim n As Long, i As Long n = Range("C:C").Cells.Count i = Cells(n, "C").End(xlUp).Row Set Source = Range(Cells(1, "C"), Cells(n, "E")) Set Target = Range("G2:I2") For i = 2 To n If Source.Cells(i, 1).Value <> "Not Used" And Not Application.WorksheetFunction.IsNA(Source.Cells(i, 3).Value) Then Source.Rows(i).Copy Target.PasteSpecial xlPasteValues Set Target = Target.Offset(1) End If Next i Application.CutCopyMode = False Application.ScreenUpdating = True End Sub 

当我运行代码时,它似乎正常运行,它会将代码中设置的标准的过滤值列表复制到同一工作表中的另一个点。 问题是,我也得到以下错误:

运行时错误“13”:types不匹配

我错了什么? 我认为我在声明variables或类似的东西时曾经犯过一些错误,但是我对VBA不够熟悉,无法确定问题所在。

任何帮助,将不胜感激。

编辑:

抱歉不清楚。

我在工作表“技术人员报告摘要”中有一组占据C2:E8561的值。 有一些我想要过滤和复制的错误值,这些值是“未使用”和“#N / A”错误。 上面的代码复制这些值,然后将它们粘贴到未经过滤的原始值集旁边,并在G,H和I列中删除了“未使用”和“#N / A”的实例。

当我运行它时没有线突出显示为问题,错误对话框刚刚popup,当我点击“确定”时,没有任何突出显示。

编辑2:

我做了@ KFitchterbuild议的改变,现在看起来locking了。 我打了退出键,下面一行被高亮显示:

 If Source.Cells(i, 1).Text <> "Not Used" And Not Application.WorksheetFunction.IsNA(Source.Cells(i, 3).Value) Then 

编辑3:

只是想到了一些可能会搞砸的东西。 列C,D和E中的值实际上是从工作簿中的其他位置拉取值的函数。 以下是其中一个function的示例。

= INDEX('RAW DATA'!$ A:$ A,$ B2)

所以我不确定问题是什么。

我修改你的代码只是一点点(用我原来的猜测)来:

 Sub test() Application.ScreenUpdating = False Worksheets("Technician Report Summary").Range("G2:I8561").ClearContents Dim Source As Range, Target As Range Dim n As Long, i As Long n = Range("C:C").Cells.Count i = Cells(n, "C").End(xlUp).Row Set Source = Range(Cells(1, "C"), Cells(n, "E")) Set Target = Range("G2:I2") For i = 2 To n If Source.Cells(i, 1).Text <> "Not Used" And Not Application.WorksheetFunction.IsNA(Source.Cells(i, 3).Value) Then Source.Rows(i).Copy Target.PasteSpecial xlPasteValues Set Target = Target.Offset(1) End If Next i Application.CutCopyMode = False Application.ScreenUpdating = True End Sub 

其中唯一真正的区别是“价值”到“文字”。 我没有得到任何错误。 唯一的问题是要花很长时间去做它应该做的事情,因为线条太多了。

现在…我会build议也许你做的有点不同。

 Sub test() Application.ScreenUpdating = False Worksheets("Technician Report Summary").Range("G2:I8561").ClearContents Dim Source As Range, Target As Range Dim n As Long ActiveSheet.Range("C:E").AutoFilter Field:=1, Criteria1:= _ Array("<>#N/A", "<>Not Used"), Operator:=xlAnd ActiveSheet.Range("C:E").AutoFilter Field:=3, Criteria1:= _ "<>#N/A", Operator:=xlAnd n = ActiveSheet.Cells(Rows.Count, "C").End(xlUp).Row Set Source = Range("C2:E" & n).SpecialCells(xlCellTypeVisible) Set Target = Range("G2") Source.Copy Target.PasteSpecial (xlPasteValues) Application.CutCopyMode = False Application.ScreenUpdating = True Range("C:E").AutoFilter End Sub 

这基本上做你想做的,但与自动filter。 它比循环遍历每一个单元格要快得多,并且最终做同样的事情。 我希望这有助于…

首先指定所有范围和单元格引用的父级。

不要将错误检查与其他string比较或布尔检查相结合。 首先检查错误,然后在新代码行上处理其他布尔检查。

n = .Range("C:C").Cells.Count将1,048,576放入n中 。 你真的想要Set src = .Range("C1:E1048576)For i = 2 To 1048576

直接文本比较通常区分大小写。

尽可能使用直接值转移复制,粘贴特殊值。

把所有这些点放在一起:

 Sub test() Dim src As Range, trgt As Range, nas As Range Dim n As Long, i As Long, bERR As Boolean Application.ScreenUpdating = False With Worksheets("Technician Report Summary") .Range("G2:I8561").ClearContents n = .Cells(Rows.Count, "C").End(xlUp).Row Set src = .Range(.Cells(1, "C"), .Cells(n, "E")) Set trgt = .Range("G2:I2") End With For i = 2 To n If Not IsError(src.Cells(i, 3)) Then Debug.Print src.Cells(i, 3).Text If LCase(src.Cells(i, 1).Value2) <> "not used" Then trgt = src.Rows(i).Value Set trgt = trgt.Offset(1) End If End If Next i Application.ScreenUpdating = True End Sub 

这应该足以让你工作。