我有一个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"下一个。
这可能吗?
答案 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