【问题标题】:Worksheets(n).Range.... returns runtime error 1004 [duplicate]Worksheets(n).Range.... 返回运行时错误 1004 [重复]
【发布时间】:2017-10-19 21:44:13
【问题描述】:

VBA 运行时错误 1004“应用程序定义或对象定义错误”

在我运行此代码时返回。我搜索了 Google / Stack Overflow,他们都告诉我指定范围,但有趣的是错误发生在我指定范围之后。 (修改前确实有效但返回错误结果)

Worksheets(2).Range(Cells(finderA.Row, rng2.Column), Cells(finderA.Row, rng2.Columns.Count + rng2.Column - 1)).Copy finalWS.Cells(rowCounter, rng1.Columns.Count + 2)

--> 这是返回错误的行。

整个代码是我通过比较特定的共同值来检查两个数据之间的遗漏的长行的一部分。

我在这段代码中基本上试图做的是将一个范围循环到另一个范围并按顺序复制粘贴匹配的行(即,我正在从工作表 1,2 中制作工作表 3。)

Dim rowCounter As Integer
rowCounter = 1

Dim eachCellA As Range, eachCellB As Range
Dim eachCellAa As Range, eachCellBb As Range
Dim StrFirstAdd As String, StrAdd As String
Dim finderA As Range, finderB As Range

For Each eachCellA In addCellRngA
    With addCellRngB
        Set finderA = .Find(eachCellA.Value, LookIn:=xlValues, Lookat:=xlWhole)
    End With

        If Not finderA Is Nothing Then

            eachCellA.EntireRow.Copy finalWS.Cells(rowCounter, 1)

            StrFirstAdd = finderA.Address
            StrAdd = finderA.Address

            Do
                Worksheets(2).Range(Cells(finderA.Row, rng2.Column), Cells(finderA.Row, rng2.Columns.Count + rng2.Column - 1)).Copy finalWS.Cells(rowCounter, rng1.Columns.Count + 2)  **##--> Debugger stops here, returns error.** 
                Set finderA = addCellRngB.FindNext(finderA)
                StrAdd = finderA.Address
                rowCounter = rowCounter + 1
            Loop While Not finderA Is Nothing And StrAdd <> StrFirstAdd

        Else

            eachCellA.EntireRow.Copy finalWS.Cells(rowCounter, 1)
            rowCounter = rowCounter + 1

        End If

Next

这是代码,所有值(finderA.Row、rng2.Column、rng2.Columns.count 等)都不是空的并且具有正确的值。

我认为粘贴整行是不必要的,但如果您觉得原因不在代码中,请告诉我,我非常乐意提供整个代码。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    替换

    Worksheets(2).Range(Cells(finderA.Row, rng2.Column), Cells(finderA.Row, rng2.Columns.Count + rng2.Column - 1)).Copy finalWS.Cells(rowCounter, rng1.Columns.Count + 2)
    

    With Worksheets(2)
        .Range(.Cells(finderA.Row, rng2.Column), .Cells(finderA.Row, rng2.Columns.Count + rng2.Column - 1)).Copy finalWS.Cells(rowCounter, rng1.Columns.Count + 2) ' **##--> Debugger stops here, returns error.**
    End With
    

    您必须限定所有范围引用,包括单元格,否则后者可能引用不同的工作表(以您运行代码时处于活动状态的为准)。

    您也可以在任何情况下都从 If 中删除此行

    eachCellA.EntireRow.Copy finalWS.Cells(rowCounter, 1)
    

    并将您的循环条件更改为

    Loop While StrAdd <> StrFirstAdd
    

    【讨论】:

    • 所以我得出的结论是,为了安全起见,在任何地方都使用点,你不会出错。我以前在这里被接过,因为在 Rows.Count 前面没有一个点。大多数情况下你不需要它,但为了安全起见......
    • 你已经结束了我的痛苦。我已经花了 4 天的时间来解决这个问题,在我对您的代码进行最后修改之后,它现在已经结束了。我不知道该怎样更感谢你。也许我应该在这方面努力学习,希望有一天能解决这个社区中其他人的麻烦。谢谢你 SJR 和上帝保佑你。
    • @zebralamy Rubberduck 会立即告诉您“'Cells' 暗指活动工作表”与Implicit ActiveSheet reference 检查,结束您的痛苦 4 天前 ;-)跨度>
    • 我的荣幸。为了避免痛苦,下次直接前往 Rubberduck!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2020-08-03
    • 1970-01-01
    • 2018-07-07
    相关资源
    最近更新 更多