范围复制粘贴vba

时间:2018-02-21 12:34:44

标签: excel vba excel-vba

以下代码是将值从A列传输到D列。从A列复制时,值始终粘贴在D列中的下一行空。

是否可以使此代码仅在插入新值时复制A列中的值?因为它现在所做的,它从A列获取所有值,然后在D列中再次粘贴它们。

即。 A栏:a1 = 2; a2 = 3,a3 = 4 ---> D列变为:d1 = 2; d2 = 3; d3 = 4.

现在,如果我在A列中插入另外两个值:a4 = 1; a5 = 2,我只想在D列中传输这两个值,而不是再次传递所有数字。所以D列变为d1 = 2; d2 = 3; d3 = 4,d4 = 1; d5 = 2。

提前致谢!

Private Sub CommandButton3_Click()

Application.ScreenUpdating = False

With Sheets("Sheet1")
     .Range("a5", .Range("a5").End(xlDown)).Copy
End With

With Sheets("Sheet1")
     .Range("d" & .Rows.Count).End(xlUp)(2).PasteSpecial Paste:=xlPasteValues
End With

End Sub

2 个答案:

答案 0 :(得分:2)

根据要求:

  • 仅复制新数据
  • 用户点击按钮时必须复制

这是你能做的:

在按钮/数据所在的工作表中:

Option Explicit

Private Sub Worksheet_Change(ByVal target As Range)
    Dim sh As Worksheet
    Set sh = ActiveSheet

    Dim newdata As Range
    Set newdata = Application.Intersect(target, sh.Range("A5", "A" & sh.Rows.Count))

    If (Not newdata Is Nothing) Then
        If (CopyDataRange Is Nothing) Then
            Set CopyDataRange = newdata
        Else
            Set CopyDataRange = Application.Union(CopyDataRange, newdata)
        End If
    End If
End Sub

在模块中:

Option Explicit

Public CopyDataRange As Range

Public Sub CommandButton1_Click()
    If (Not CopyDataRange Is Nothing) Then
        CopyDataRange.Copy CopyDataRange.Offset(0, 3)
        Set CopyDataRange = Nothing
    End If
End Sub

这样做只是跟踪新值(这是Worksheet_Change事件的作用),然后当您单击按钮时,它只会将新值复制到D列。它还会重置静态范围CopyDataRange返回Nothing,因此您不必重复从之前的按钮点击中复制相同的数据。基本上,按钮单击将刷新CopyDataRange范围。

编辑:

我决定写一篇关于这个here的帖子来进一步解释。

答案 1 :(得分:0)

正如你们所说的那样有点复杂,我修改了代码,它现在做的是从头开始复制所有内容。不确定这是否是使用的智能解决方案......

Private Sub CommandButton3_Click()

Application.ScreenUpdating = False
     With Sheets("Creation")
        .Range("a1", .Range("a1").End(xlDown)).Copy End With

With Sheets("Creation")
        .Range("d1").PasteSpecial Paste:=xlPasteValues

End With End Sub