Vba 查找方法上发生类型不匹配错误
我试图通过比较两张图纸来查找值,然后将该行复制到另一张图纸。有什么建议吗Vba 查找方法上发生类型不匹配错误,vba,excel,Vba,Excel,我试图通过比较两张图纸来查找值,然后将该行复制到另一张图纸。有什么建议吗 Sub SpecialCopy() Dim i As Long Dim cellval, rng As Range Dim ws1, ws2 As Worksheet Dim targetSh As Worksheet Set targetSh = ThisWorkbook.Worksheets("Sheet3") Set ws2 = Sheets("Sheet2")
Sub SpecialCopy()
Dim i As Long
Dim cellval, rng As Range
Dim ws1, ws2 As Worksheet
Dim targetSh As Worksheet
Set targetSh = ThisWorkbook.Worksheets("Sheet3")
Set ws2 = Sheets("Sheet2")
Set ws1 = Sheets("sheet1")
ws2.Select
With ActiveSheet
Set rng = .Range("A1:A" & .Cells(.Rows.Count, 1).End(xlUp).Row)
End With
For i = 2 To rng.Rows.Count
Set cellval = ws1.Columns(1).Find(What:=ws2.Range("U" & i).Value, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If cellval Is Nothing Then
Else
Range(Cells(1, i), Cells(33, i)).Copy Destination:=targetSh.Range("A" & targetSh.Cells(Rows.Count, "A").End(xlUp).Row + 1)
End If
Next i
End Sub
我觉得这是在利用别人的评论,但没有人提交答案,所以我的建议是这样的。在定义工作表变量时使用这些变量,而不是使用ActiveSheet,这样做是有意义的,并确保在任何地方都遵循这一点
Sub SpecialCopy()
Dim i As Long
Dim cellval As Range, rng As Range
Dim ws1 As Worksheet, ws2 As Worksheet
Dim targetSh As Worksheet
Set targetSh = ThisWorkbook.Worksheets("Sheet3")
Set ws2 = Sheets("Sheet2")
Set ws1 = Sheets("Sheet1")
With ws2
Set rng = .Range("A1:A" & .Cells(.Rows.Count, 1).End(xlUp).Row)
End With
For i = 2 To rng.Rows.Count
Set cellval = ws1.Columns(1).Find(What:=ws2.Range("U" & i).Value, LookIn:=xlFormulas, _
LookAt:=xlWhole, MatchCase:=False, SearchFormat:=False)
If Not cellval Is Nothing Then
ws2.Range(ws2.Cells(1, i), ws2.Cells(33, i)).Copy Destination:=targetSh.Range("A" & targetSh.Cells(targetSh.Rows.Count, "A").End(xlUp).Row + 1)
End If
Next i
End Sub
给出错误的是
Find
,还是Copy
?将Dim cellval,rng As Range
更改为Dim cellval As Range,rng As Range
(如果没有显式声明变量类型,则隐式假定它是Variant
类型)范围(单元格(1,i),单元格(33,i)).Copy
似乎很奇怪-i
在循环中被用来遍历U列,从第2行开始,到包含A列中使用的最后一个单元格的行结束,但是在Copy
中,您复制的是i
列中第1行到第33行的内容,所以B1:B33,然后C1:C33,然后D1:D33,等等?!?!啊-我看到问题了-您正在表单1的a列中执行Find
,从ActiveCell
开始-但是ActiveCell
在表单2上。您真的希望从哪个单元格开始查找
?是的-但是您已经说过之后:=ActiveCell
和ActiveCell
,此时它位于Sheet2上的某个位置,因此Excel在尝试查找Sheet1上的某个内容时会非常困惑,因为您告诉它开始在完全不同的工作表上的某个位置进行搜索。因此,您需要决定从何处开始搜索,或者删除参数,让Excel随意开始搜索。targetSh.Cells(Rows.Count,“A”)
应该是targetSh.Cells(targetSh.Rows.Count,“A”)
-您应该在任何地方使用工作表变量;-)(我仍然不知道Copy
会发生什么-使用I
作为行索引,然后又作为列索引,这似乎很奇怪。)@YowE3K-ha,touche。当然,你是对的,尽管我觉得这有点迂腐,因为行数不会因工作表而异(除非有图表工作表)。一旦你开始正确地限定所有其他引用,那么ActiveSheet可能在一个工作簿中,而引用的工作表可能在另一个工作簿中。如果ActiveSheet位于具有1048576个潜在行的工作簿中,并且正在使用的工作表位于仅支持65536个潜在行的工作簿中,则Excel将在尝试访问不存在的行时抛出错误。(这是我加入SO后学到的另一个教训!)@YowE3K——我想这可能会发生。无论如何,为了安全起见,我已经在上面对它进行了更改。这种情况并不经常发生——但通常每个月都会有一两个问题由这个问题引起。