我在我正在处理的项目中使用以下代码:
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':类型不匹配
我有什么问题?我认为我在声明变量或其他东西方面犯了一些错误,但我对VBA不够熟悉,无法确定问题所在。
任何帮助都将不胜感激。
编辑:
抱歉不清楚。
我在工作表'技术人员报告摘要'中有一组值占据C2:E8561的范围。我想要过滤和复制一些错误的值,这些是“未使用”和“#N / A”错误。上面的代码复制了这些值,然后将它们粘贴到原始未过滤的值集旁边,并在G,H和I列中删除了“未使用”和“#N / A”的实例。
当我运行它时,没有突出显示的行是问题,错误对话框刚刚弹出,当我点击“确定”时,没有任何内容突出显示。
编辑2:
我做了@KFitchter建议的改变,现在似乎锁定了。我点击了转义键,突出显示了以下行:
If Source.Cells(i, 1).Text <> "Not Used" And Not Application.WorksheetFunction.IsNA(Source.Cells(i, 3).Value) Then
编辑3:
想到其他可能搞乱它的东西。列C,D和E中的值实际上是从工作簿中的其他位置拉取值的函数。以下是其中一个功能的示例。
= INDEX('RAW DATA'!$ A:$ A,$ B2)
答案 0 :(得分:1)
所以我不确定问题是什么。
我将代码修改了一小部分(使用我的原始猜测):
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
唯一真正的区别是&#34;价值&#34;到&#34;文字&#34;。我没有收到任何错误。唯一的问题是它花了很长时间才能做它应该做的事情,因为线路太多了。
现在...... 我建议你做一些与众不同的事情。
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
这基本上是你想要做的,但是使用自动过滤器。它比循环遍历每个单元格要快得多,并且最终做同样的事情。我希望有帮助...
答案 1 :(得分:0)
首先指定所有范围和单元格引用的父级。
不要将错误检查与其他字符串比较或布尔检查结合使用。首先检查错误,然后在新代码行上处理其他布尔检查。
第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
这应该足以让你工作。