Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 查找方法上发生类型不匹配错误_Vba_Excel - Fatal编程技术网

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——我想这可能会发生。无论如何,为了安全起见,我已经在上面对它进行了更改。这种情况并不经常发生——但通常每个月都会有一两个问题由这个问题引起。