在 VBA 中使用数组复制和粘贴

Posted

技术标签:

【中文标题】在 VBA 中使用数组复制和粘贴【英文标题】:Copy and Paste using array in VBA 【发布时间】:2011-06-27 06:16:28 【问题描述】:

我正在尝试创建一个相对简单的复制和粘贴程序。我将某些单元格地址存储在一个数组 (Results1()) 中,我试图推断它所在的行以将整行数据复制到另一个 Excel 表中。到目前为止,我有以下内容,目前当我尝试定义我的“NextRow”是什么时,我收到了一个 object required 错误。任何建议或反馈将不胜感激!

For i1 = LBound(Results1) To UBound(Results1)
    Set NextRow = Worksheets("searchresult").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
                Range(Results(i1)).EntireRow.Copy NextRow
Next i1

修改后的代码

    For i1 = LBound(Results1) To UBound(Results1)
        Worksheets("properties").Select
        Set p1results = Range(Results1(i1))
        p1results.EntireRow.Copy
            With Worksheets("SearchResult").Select
                NextRow = Range("D65536").End(xlUp).Row + 1
                Cells(NextRow, 1).Select
                ActiveSheet.Paste
            End With
    Next i1

更新:实际上,我的数据范围仅从 D:P 列开始,因此当我计算行时,我从 D 列 (4) 开始计数,因为 A-C 列是空范围。这会影响它粘贴我的数据的方式吗?

       On Error Resume Next
   For i1 = LBound(Results1) To UBound(Results1)
        Set NextRow = shSearchResult.Cells(shSearchResult.Rows.Count, 4).End(xlUp).Offset(1, 0)
        shProperties.Range(Results1(i1)).EntireRow.Copy NextRow
        If Err.Number <> 0 Then
            Err.Clear
            MsgBox "Bad address" & Results1(i1)
        End If
    Next i1

【问题讨论】:

【参考方案1】:

这里有几个潜在的原因:

您的 for 循环引用 Results1,但您的副本引用 Results(有问题的错字?或路由原因?)

在您的Set NextRow = 行引用.Cells(Rows.Count, 不合格,行指的是活动工作表而不是"searchresult" 工作表。可能不是您想要的,但在这种情况下也不会有所不同。

同样Range(Results(i1)) 指的是活动表,可能没问题 - 取决于您的应用程序的更广泛的上下文

我怀疑你的直接问题是NextRow 还没有被DIM'd。尝试添加

Dim NextRow as Range 给你的子

一般来说,最好使用Option Explicit(模块中的第一行)。这会强制显式声明所有变量。

编辑

根据您的编辑,"Method 'Range' of object '_Global' failed" 错误可能是由无效的地址字符串引起的

您的第一个代码实际上比您的第二个更好。这是一个重构版本

Sub zxx()
    Dim Results1(0 To 1) As Variant
    Dim i1 As Long
    Dim NextRow As Range
    Dim shProperties As Worksheet
    Dim shSearchResults As Worksheet


    '  other code ...

    Set shSearchResults = ActiveWorkbook.Worksheets("searchresult")
    Set shProperties = ActiveWorkbook.Worksheets("properties")

    On Error Resume Next
    For i1 = LBound(Results1) To UBound(Results1)
        Set NextRow = shSearchResults.Cells(shSearchResults.Rows.Count, 1).End(xlUp).Offset(1, 0)
        shProperties.Range(Results1(i1)).EntireRow.Copy NextRow
    Next i1


End Sub

要检测错误地址,请尝试在 For 和之前添加 On Error Resume Next

        If Err.Number <> 0 Then
            Err.Clear
            MsgBox "Bad Address " & Results1(i1)
        End If

复制之后(在for循环内)

EDIT2

仅当单个单元格在 A 列中时,将 EntireRow 复制到单个单元格中才有效,因为 EntireRow 范围悬垂在工作表的右侧。

使用它来偏移回 A 列

Set NextRow = _
    shSearchResults.Cells(shSearchResults.Rows.Count, 4).End(xlUp).Offset(1, -3)

【讨论】:

@ren 很高兴为您提供帮助,欢迎来到 SO。顺便说一句,如果答案解决了您的问题,您应该接受它 9click 勾号)SO 的工作原理 克里斯,感谢您的建议,但是当我尝试运行代码时,我在“设置 NextRow=...”行中收到“需要对象”错误。关于为什么会这样的任何解释? @ren 你有 Dim NextRow 作为 Range 吗? “需要对象”错误意味着 NextRow 不是对象。没有 Dim(也没有 Option Explicit)的变量默认为 Variant @Chris Neilson 是的,我刚刚意识到我必须更改 NextRow 的变量定义。尝试调试大量代码相当耗时。该宏不再崩溃,但当前未显示任何搜索结果。至少是一种进步! @ren progress then...随时就代码的其他方面发布另一个问题(在回答时我做了一个模型,它确实复制了Results1中提到的行。如果它没有给出预期结果我猜Results1中包含的地址是可疑的)【参考方案2】:

您从不使用 With 语句,所以只需这样做:

For i1 = LBound(Results1) To UBound(Results1)
    Worksheets("properties").Select
    Set p1results = Range(Results1(i1))
    p1results.EntireRow.Copy
    Worksheets("SearchResult").Select
    NextRow = Range("D65536").End(xlUp).Row + 1
    Cells(NextRow, 1).Select
    ActiveSheet.Paste           
Next i1

或更好:

For i1 = LBound(Results1) To UBound(Results1)
    Worksheets("properties").Range(Results1(i1)).EntireRow.Copy
    Worksheets("SearchResult").Cells(Range("D65536").End(xlUp).Row + 1, 1).Paste
Next i1

根据您的操作,您可能希望使用 PasteSpecial。

【讨论】:

以上是关于在 VBA 中使用数组复制和粘贴的主要内容,如果未能解决你的问题,请参考以下文章

在 VBA 中使用循环复制和粘贴时如何跳过非数字值?

无需选择 vba 即可复制和粘贴

用VBA编写复制功能,能不能只粘贴值,不粘贴格式

VBA - 使用 Sendkeys 复制粘贴代码

访问自动修改复制粘贴的 VBA 事件代码

VBA - 复制粘贴单词表而不合并