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

时间:2011-06-27 06:16:29

标签: arrays excel vba copy-paste

我正在尝试创建一个相对简单的复制和粘贴过程。我有一些存储在数组中的单元格地址(Results1()),我试图推断它所在的行,将整行数据复制到另一个Excel工作表中。到目前为止,我有以下内容,当我尝试定义我的'NextRow'时,我得到一个对象必需的错误。任何建议或反馈将不胜感激!

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

2 个答案:

答案 0 :(得分:1)

这里有一些潜在的原因:

您的for循环引用 Results1 ,但您的副本引用结果(错误的问题?或路由原因?)

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

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

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

Dim NextRow as Range到您的Sub

一般来说,最好使用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

EntireRow复制到单个单元格只有在单个单元格位于A列时才有效,因为EntireRow范围会悬在工作表的右侧。

使用此值偏移回A列

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

答案 1 :(得分:0)

你永远不会使用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。