搜索不同工作簿时出现对象必需的运行时错误VBA

搜索不同工作簿时出现对象必需的运行时错误VBA,vba,excel,Vba,Excel,我是VBA新手,所以我的很多代码都是我在互联网上研究并整理的。关于我正在努力实现的目标的一点背景:- 我有两本布局相同的著作。一本是我的原始工作手册,其中包含VBA代码,另一本是一种覆盖文档。我有一个列,覆盖图中有一个代码,需要在原始工作手册的同一列中搜索此代码(如果找到),然后将整个行从覆盖图复制到原始中,并删除在原始中找到的行,如果在原始中找不到,只需跨行复制即可 我得到运行时错误的代码行是:- Set rngFound = Workbooks("OverLay").Worksheets("

我是VBA新手,所以我的很多代码都是我在互联网上研究并整理的。关于我正在努力实现的目标的一点背景:-

我有两本布局相同的著作。一本是我的原始工作手册,其中包含VBA代码,另一本是一种覆盖文档。我有一个列,覆盖图中有一个代码,需要在原始工作手册的同一列中搜索此代码(如果找到),然后将整个行从覆盖图复制到原始中,并删除在原始中找到的行,如果在原始中找不到,只需跨行复制即可

我得到运行时错误的代码行是:-

Set rngFound = Workbooks("OverLay").Worksheets("Overlay").Range("G:G").Find(What:=r.Value, LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
下面是我正在使用的代码的摘录

Dim sht1 As Worksheet   'Current active worksheet (original version)
Dim sht2 As Worksheet   'Worksheet in OverLay
Dim rngFound As Range

Set sht2 = Workbooks("Overlay").Worksheets("Overlay")

With Workbooks("Original").Worksheets("Formatted")
    lastRow = .Range("G" & .Rows.Count).End(xlUp).Row
End With

With sht2
    For Each Row In .Range("G:G")
        Set rngFound = Workbooks("OverLay").Worksheets("Overlay").Range("G:G").Find(What:=r.Value, LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
        If Not rngFound Is Nothing Then
            rngFound.Copy
            Workbooks("Original").Worksheets("Formatted").Range(rngFound).PasteSpecial
        End If
    Next
End With

我将首先向您说明问题所在:

Dim sht1 As Worksheet '// <~~ This never gets used?
Dim sht2 As Worksheet   'Worksheet in OverLay
Dim rngFound As Range

Set sht2 = Workbooks("Overlay").Worksheets("Overlay")

With Workbooks("Original").Worksheets("Formatted")
    lastRow = .Range("G" & .Rows.Count).End(xlUp).Row
End With

With sht2
    For Each Row In .Range("G:G")
'// 'Row' in the above line will be treated as a variant as it hasn't been declared.
'// As such, it will most likely default to a Range object, which means you are
'// actually looping through each cell in that column. The lesson here is "be explicit"
'// and make sure the code is looking at exactly what you want it to look at.
        Set rngFound = Workbooks("OverLay").Worksheets("Overlay").Range("G:G").Find(What:=r.Value, LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
'// You've already set this sheet to 'sht2' so just use that instead. Also, as
'// we know - 'r' has not been set and so causes an error.
        If Not rngFound Is Nothing Then
            rngFound.Copy
            Workbooks("Original").Worksheets("Formatted").Range(rngFound).PasteSpecial
'// 'rngFound' is already a range object, no need to wrap it in a Range() method.
        End If
    Next
End With

虽然这看起来像是在搜索一列,但要搜索由同一列中的单元格定义的值,所以不确定这里的“最终目标”是什么。希望它能澄清您一直遇到的问题,尽管在引用工作簿时使用扩展名。e、 g.
Set rngFound=工作簿(“OverLay.xlsx”)…
。您可以通过激活工作簿并在即时窗口中使用
?activeworkbook.name
来获得正确的名称。@Jeeped我已经按照您的建议进行了修改,但我仍然收到了错误您试图查找其“值”的
r
是什么?看起来您应该键入
Row
它希望
r
是一个范围对象,如果未设置
r
,则您缺少一个对象-因此出现了“需要对象”错误。@MacroMan感谢您指出这一点,它没有设置。我不确定我应该把它设置为什么。如果它是一个范围,我想搜索一个单元格范围,即一列,我可以问这段代码做什么吗:-如果不是rngFound,那么originalWS.range(rngFound.Address)。Value=rngFound.Value我不确定我是否理解originalWS.range(rngFound)。。。。正在做我想做的事情如果找到了线,那么将其从原始中删除,然后将该行从覆盖复制到原始中,如果找不到,则直接复制该行。
Dim originalWS     As Worksheet '// give your variables meaningful names!
Dim overlayWS      As Worksheet
Dim rngSearchParam As Range
Dim rngFound       As Range

Set originalWS = Workbooks("Original").Sheets("Formatted")
Set overlayWS = Workbooks("Overlay").Sheets("Overlay")

With overlayWS
    For Each rngSearchParam In Intersect(.Range("G:G"), .UsedRange)

        Set rngFound = .Range("G:G").Find(rngSearchParam.Value, LookIn:=xlValues, _
            SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)

        If Not rngFound Is Nothing Then
            originalWS.Range(rngFound.Address).Value = rngFound.Value
        End If
    Next
End With