VBA代码无法按顺序工作是有原因的吗?

时间:2018-12-30 20:21:55

标签: excel vba excel-vba

我不确定如何表达这个问题。但是,我将能够在这里更好地解释它。下面是我的代码。我的代码的目的是将数据从一张纸复制并粘贴到另一张纸。

似乎一切正常,直到到达代码的最后一行(“ End Sub”除外)为止。最后一行应该填充到最后一行。我遇到的问题是,如果我分解With语句和最后一行并分别运行它们,则代码可以正常工作。

我知道最后一行有效,但是当我运行整个宏时,会收到“运行时错误'1004”错误消息。为什么我的代码不起作用?

Sub Data_Table()

Dim Data As Worksheet
Dim Sum As Worksheet
Dim lr As Long
Dim lr2 As Long
Dim lr3 As Long
Dim lr4 As Long
Dim lr5 As Long


Set Data = Worksheets("Data-Tracker")
Set Sum = Worksheets("Summary")
lr = Data.Cells(Rows.Count, "E").End(xlUp).Row
lr2 = Data.Cells(Rows.Count, "A").End(xlUp).Row 'for customer type
lr3 = Data.Cells(Rows.Count, "B").End(xlUp).Row ' for Type
lr4 = Data.Cells(Rows.Count, "C").End(xlUp).Row ' for Rate/Budget
lr5 = Data.Cells(Rows.Count, "D").End(xlUp).Row ' for Date


    With Sum

        .Range("B6:B12").Copy Destination:=Data.Range("E" & lr).Offset(1, 0)
        .Range("C6:C12").Copy Destination:=Data.Range("F" & lr).Offset(1, 0)
        .Range("D6:D12").Copy Destination:=Data.Range("G" & lr).Offset(1, 0)
        .Range("C2").Copy Destination:=Data.Range("B" & lr3).Offset(1, 0)
        .Range("B4").Copy Destination:=Data.Range("C" & lr4).Offset(1, 0)
        .Range("B5").Copy Destination:=Data.Range("D" & lr5).Offset(1, 0)


    End With

    Data.Range("B" & lr3, "D" & lr5).AutoFill Destination:=Data.Range("B" & lr3, "D" & lr)


End Sub

任何帮助将不胜感激。

编辑

如果我先这样运行代码,以帮助进一步解释我的观点:

    With Sum

        .Range("B6:B12").Copy Destination:=Data.Range("E" & lr).Offset(1, 0)
        .Range("C6:C12").Copy Destination:=Data.Range("F" & lr).Offset(1, 0)
        .Range("D6:D12").Copy Destination:=Data.Range("G" & lr).Offset(1, 0)
        .Range("C2").Copy Destination:=Data.Range("B" & lr3).Offset(1, 0)
        .Range("B4").Copy Destination:=Data.Range("C" & lr4).Offset(1, 0)
        .Range("B5").Copy Destination:=Data.Range("D" & lr5).Offset(1, 0)


    End With

'    Data.Range("B" & lr3 & ":D" & lr5).AutoFill Destination:=Data.Range("B" & lr3, "D" & lr)

然后按如下所示运行它:

'    With Sum
'
'        .Range("B6:B12").Copy Destination:=Data.Range("E" & lr).Offset(1, 0)
'        .Range("C6:C12").Copy Destination:=Data.Range("F" & lr).Offset(1, 0)
'        .Range("D6:D12").Copy Destination:=Data.Range("G" & lr).Offset(1, 0)
'        .Range("C2").Copy Destination:=Data.Range("B" & lr3).Offset(1, 0)
'        .Range("B4").Copy Destination:=Data.Range("C" & lr4).Offset(1, 0)
'        .Range("B5").Copy Destination:=Data.Range("D" & lr5).Offset(1, 0)
'
'
'    End With

    Data.Range("B" & lr3 & ":D" & lr5).AutoFill Destination:=Data.Range("B" & lr3, "D" & lr)

我必须添加撇号以取消代码以使其起作用。否则,我会收到自动填充方法错误。

2 个答案:

答案 0 :(得分:1)

我建议将Range().Copy Destination:=语句替换为带有相对引用的绝对引用,并在一个语句中直接分配多个值。

我认为您的意图是将Summary中的值附加到Data工作表中。

假设n页面中E2下的Data个单元格要复制到k页面下第Summary页的第B2个单元格下Sum.Range("B2").Cells(k,1).Resize(n,1).Value = Data.Range("E2").Resize(n,1).Value 。您可以这样做

.Resize()

技巧是引用一个单元格,然后使用.Value语句将选择范围扩展到整个表(多行和多列)(如果需要)。使用= text_field_tag 'product[keywords][]', @product.keywords, class: 'tab-input product_keywords' 赋值将所有值移至一条语句中

答案 1 :(得分:0)

您需要做两件事。

第一个也是很明显的一个问题是在相关行中修复语法:需要在源和目标中都指定一个范围地址,而不是在角落处:... lr3 & ":D" ...而不是这个... lr3, "D" ...

第二个目的是确保目标始终比源高,以防万一:

If lr > lr5 Then
     Data.Range("B" & lr3 & ":D" & lr5).AutoFill ....
End If