复制下一列的VBA

时间:2015-11-13 17:33:58

标签: excel vba excel-vba

我有一个excel工作簿,其中包含一个链接到外部源的工作表,因此该工作表不断添加新列。我想要一个VBA,它会自动将下一列复制到右边。所以现在这就是我所拥有的。

Sub copycolumns1() 
Sheets("Productivity").Select     
lMaxCoulmns = Cells(Columns.Count, "N").End(xlUp).Column
Range(Range("N3"), Range("N3").End(xlDown)).Select     
Selection.Copy     
Sheets("Data").Select     
lMaxRows = Cells(Rows.Count, "D").End(xlUp).Row 
Range("D" & lMaxRows + 1).Select     
ActiveSheet.Paste 
End Sub 

现在设置的方式是,当宏被激活时,它只会复制列" N"。我希望脚本不断移动,所以当我运行脚本时,它会自动复制列" O"下一个。

这可能吗?

2 个答案:

答案 0 :(得分:2)

您的主要问题是设置IMaxColumns。截至目前,它的将返回N列,因为您向后使用Cells()。试试以下内容:

Sub copycolumns1()
Dim prodWS As Worksheet, dataWS As Worksheet
Dim lMaxColumns&, lMaxRows&, lastRow&
Set prodWS = Sheets("Productivity")
Set dataWS = Sheets("Data")

With prodWS
    lMaxColumns = .Cells(1, .Columns.Count).End(xlToLeft).Column
    lastRow = .Cells(3, lMaxColumns).End(xlDown).Row
    .Range(.Cells(3, lMaxColumns), .Cells(lastRow, lMaxColumns)).Copy
End With

With dataWS
    lMaxRows = .Cells(.Rows.Count, "D").End(xlUp).Row
    .Range("D" & lMaxRows + 1).PasteSpecial
End With

Application.CutCopyMode = False
End Sub

要注意的几件事 首先,请注意我是如何使用工作表变量来存储工作表的。这样可以防止您或您的部分对您正在使用哪张表格造成混淆。请注意我如何使用With.来设置范围。

其次,我删除了.Select的使用,这是最佳做法(see this thread以获取更多信息。)

另外,我更新了您的行以获取副本范围,因为您的行总是会复制列" N",因此您的lMaxColumns未被使用。

最后,我解决了lMaxCoulmns问题。你最初的 Cells(Columns.Count, "N").End(xlUp).Column

Cells的使用是Cells([row],[column])。所以,你要将行设置为开头,作为列数(这是否有意义?如果你只有三列,你将从第3行开始),那么就去吧......可能会让你离开第1行。

我把它保持在原来的VB附近,所以你可以看到我做了什么。但是,你可以进一步调整这一点,通过设置范围'来删除复制/粘贴的使用。价值相等。如果您有兴趣,请告诉我,我会告诉您如何。

答案 1 :(得分:1)

这就是我要做的......未经考验......

Sub CopyLastColumns1() 
    Dim wsP as Worksheet, wsD as Worksheet, lastCol as Long, lastRow as Long, destLastCol as Long
    Set wsP = Sheets("Productivity")     
    lastCol = wsP.Cells(1, wsP.Columns.Count).End(xlToLeft).Column
    lastRow = wsP.Cells(Rows.Count, lastCol).End(xlUp).Row
    wsP.Range(Cells(1, lastCol), Cells(lastRow, lastCol).Copy     
    Set wsD = Sheets("Data")
    destLastCol = wsD.Cells(1, wsD.Columns.Count).End(xlToLeft).Column + 1 
    wsD.Cells(1, destLastCol).PasteSpecial xlPasteValues
End Sub