在for循环中复制和粘贴信息

时间:2015-08-14 11:27:04

标签: vba excel-vba excel

我想创建一个在工作表中复制某些excel范围并将这些范围粘贴到“motherfile”中的函数。

现在,我正在尝试使用此代码:

Sub ranges()

    Dim month As Variant
    Dim months As Variant

    months = Array("V01 DEN HAAG", "V02 AMSTERDAM")

    Dim destinationRange As Excel.range 
    Set destinationRange = Sheets("DATASET").range("B3").End(xlDown).Offset(1, 0)

    For Each month In months

        Dim sourceRange As Excel.range
        Set sourceRange = Sheets(month).range("H7", range("H7").End(xlToRight))

        Call sourceRange.Copy
        Call destinationRange.PasteSpecial

    Next month

End Sub

但是,我得到应用程序定义或对象定义的错误。什么出错?谢谢!

2 个答案:

答案 0 :(得分:1)

添加到mielk的问题是问题在于代码行:

Set sourceRange = Sheets(month).range("H7", range("H7").End(xlToRight))

这是因为如果您从多个工作表数据中收集并使用range("H7").End(xlToRight,则会在活动工作表上搜索此数据。因此,如果它在正确的表格上,它只能找到正确的范围。

使用以下代码:

Set sourceRange = Sheets(month).Range("H7", Sheets(month).Range("H7").End(xlToRight))

无论当时哪张表处于活动状态,它都能正常工作。 另外一个是你可以复制并粘贴1个代码行:

sourceRange.Copy Destination:=destinationRange

见下面的整个代码:

Sub ranges()
Dim month As Variant
Dim months As Variant
months = Array("V01 DEN HAAG", "V02 AMSTERDAM")

For Each month In months
   Dim sourceRange As Excel.Range
   Dim destinationRange As Excel.Range
   With Sheets("DATASET")
      Set destinationRange = .Cells(.Rows.Count, 2).End(xlUp).Offset(1, 0)
   End With
   Set sourceRange = Sheets(month).Range("H7", Sheets(month).Range("H7").End(xlToRight))
   sourceRange.Copy Destination:=destinationRange

Next month
End Sub

答案 1 :(得分:0)

出现此错误的可能原因是您在工作表" DATASET",B列,3行以下没有任何值。

看看这行代码:

Set destinationRange = Sheets("DATASET").range("B3").End(xlDown).Offset(1, 0)

首先,它从单元格B3到此列中的最后一个单元格(Excel 2007+中的B1048576)的范围。

之后它会尝试将此范围向下偏移一行(因此它会尝试创建一个具有相同行数和列数但在下面开始一个单元格的范围)。

然而,这是不可能的,因为这样的范围必须从单元格B4开始并以单元格B1048577结束,Excel只有1048576行。

如果要将第一个空行分配给变量destinationRange,则应替换此代码:

Set destinationRange = Sheets("DATASET").range("B3").End(xlDown).Offset(1, 0)

以下内容:

With Sheets("DATASET")
    Set destinationRange = .Cells(.Rows.Count, 2).End(xlUp).Offset(1, 0)
End With

这两种说法都很相似。不同的是第二个 从列B中的最后一个单元格开始,查找第一个非空的单元格 上面的细胞。