你的主要問題是設置你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
有幾件事要注意。
首先,請注意我是如何使用工作表變量來存儲工作表的。這樣可以防止您或VB的部分對您正在使用的工作表造成任何混淆。請注意我如何使用With
和.
來設置範圍。
其次,我刪除了使用.Select
,這是最好的做法(see this thread獲取更多信息。)
另外,我更新了一線得到複製範圍,因爲你總是會複製列「N」,因此您的lMaxColumns
未被使用。
最後,我修復了lMaxCoulmns
問題。您原本有 Cells(Columns.Count, "N").End(xlUp).Column
使用Cells
是Cells([row],[column])
。所以,你要設置行開始,因爲列的數量(是否有意義?如果你只有三列,你會從第3行開始),然後上行......這可能會讓你在第1行。
我保持這個接近你的原始VB,所以你可以看到我做了什麼。但是,您可以通過設置範圍的值相等來進一步調整以取消複製/粘貼的使用。讓我知道你是否感興趣,我會告訴你如何。
是的,使用保存最後一列的變量。谷歌會告訴你如何在5分鐘內做到這一點... – findwindow
我會養成對自己的變量進行調整的習慣。否則,像lMaxCoulmns這樣的小拼寫錯誤會導致難以識別的問題。 Option Explicit是一件好事。 – Marc
看看你如何聲明'lMaxCoulmns',它總是*要返回N列。請參閱我的回答。 – BruceWayne