范围复制

时间:2017-01-30 06:52:12

标签: excel vba copy range

您好我正在尝试创建一个有助于调整两个时间序列的宏。所以我必须让这两个时间序列具有相同的日期,假设如果没有该日期的数据,则采用前一天的价格。

除Range复制部分外,我的所有代码都有效。它没有粘贴到插入的空白单元格中。有谁知道为什么会这样?有问题的行是最后一个Range行。我也试过了.Copy(Destination)方法,但它也没有用。错误处理程序表示范围类的副本失败。

Sub Adjustdate()

Dim lastrow As Long
Dim n As Integer
Dim read As Double
Dim adju As Double
Dim entry As Long
Dim comp As Long

lastrow = Cells(Rows.Count, "A").End(xlUp).Value

n = 2
While comp <> lastrow
    entry = Cells(n, "A")
    comp = Cells(n, "T")
    read = Cells(n, "B")
    adju = Cells(n, "C")
    If (entry < comp) Then
        Cells(n, "A").Insert Shift:=xlDown
        Cells(n, "B").Insert Shift:=xlDown
        Cells(n, "C").Insert Shift:=xlDown
        Cells(n, "B") = read
        Cells(n, "C") = adju
        Cells(n, "A") = comp
    End If
    If (entry > comp) Then
        Cells(n, "T").Insert Shift:=xlDown
        Cells(n, "T") = entry
        Cells(n, "T").Interior.ColorIndex = 8
        Range(Cells(n, "U"), Cells(n, "AH")).Insert Shift:=xlDown
        Range(Cells((n + 1), "U"), Cells((n + 1), "AH")) = (Range(Cells(n, "U"), Cells(n, "AH")))

    End If
    n = n + 1
Wend

End Sub

Screenshot of data 这是400错误后代码的屏幕截图(它一直运行到插入新行的部分。)

1 个答案:

答案 0 :(得分:0)

根据您的屏幕截图显示您的数据处于降序日期序列,您的问题是由以下两行代码引起的:

Range(Cells(n, "U"), Cells(n, "AH")).Insert Shift:=xlDown
Range(Cells((n + 1), "U"), Cells((n + 1), "AH")) = (Range(Cells(n, "U"), Cells(n, "AH")))

第一行是在行n上插入空单元格。然后第二行设置行n + 1上的单元格值(以前在行n上的单元格,直到你将它们向下移动)为行{{}中现在为空的单元格的值1}}。

您需要的正确代码是:

n

您在评论中说过您之前尝试过以下命令:

Range(Cells(n, "U"), Cells(n, "AH")).Insert Shift:=xlDown
Range(Cells(n, "U"), Cells(n, "AH")) = Range(Cells(n + 1, "U"), Cells(n + 1, "AH"))

(我添加了一个行继续字符/换行符,以便在本文中更容易阅读。)

没有成功的原因是:

  1. 该上下文中的方括号(Range(Cells((n + 1), "U"), Cells((n + 1), "AH")).Copy _ [Destination:=(Range(Cells(n, "U"), Cells(n, "AH")))] )只是语法错误。
  2. 所以,让我们放下方括号并假装你刚说了

    [...]
    1. 修订后的命令是说副本的目的地是Range(Cells((n + 1), "U"), Cells((n + 1), "AH")).Copy _ Destination:=(Range(Cells(n, "U"), Cells(n, "AH"))) 。虽然(Range(Cells(n, "U"), Cells(n, "AH")))是有效范围,但它周围的圆括号(Range(Cells(n, "U"), Cells(n, "AH")))告诉VBA将它从对象指针转换为值。

      这意味着您的目的地将是(...)数组,该数组不是有效的&#34;目的地&#34;对于Variant方法。

    2. 删掉那些圆括号会让你输入命令

      Range.Copy

      这将是一个有效的命令,并完成你想要的。

      下面是一个监视窗口的screendump,显示了在Range(Cells((n + 1), "U"), Cells((n + 1), "AH")).Copy _ Destination:=Range(Cells(n, "U"), Cells(n, "AH")) 范围内放置圆括号导致的变量类型的差异:

      enter image description here

      总之......尽管使用括号来增强代码的可读性(例如在复杂的公式中)通常被认为是个好主意,但不要在不需要它们的地方使用VBA中的括号。 / p>