2015-11-13 87 views
2

我有一個Excel工作簿,它有一個鏈接到外部源的工作表,因此此工作表不斷添加新列。我想要一個VBA,它會自動將下一個列複製到右側。所以現在這就是我所擁有的。複製下一列的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」。

這可能嗎?

+1

是的,使用保存最後一列的變量。谷歌會告訴你如何在5分鐘內做到這一點... – findwindow

+3

我會養成對自己的變量進行調整的習慣。否則,像lMaxCoulmns這樣的小拼寫錯誤會導致難以識別的問題。 Option Explicit是一件好事。 – Marc

+0

看看你如何聲明'lMaxCoulmns',它總是*要返回N列。請參閱我的回答。 – BruceWayne

回答

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 

有幾件事要注意。
首先,請注意我是如何使用工作表變量來存儲工作表的。這樣可以防止您或VB的部分對您正在使用的工作表造成任何混淆。請注意我如何使用With.來設置範圍。

其次,我刪除了使用.Select,這是最好的做法(see this thread獲取更多信息。)

另外,我更新了一線得到複製範圍,因爲你總是會複製列「N」,因此您的lMaxColumns未被使用。

最後,我修復了lMaxCoulmns問題。您原本有 Cells(Columns.Count, "N").End(xlUp).Column

使用CellsCells([row],[column])。所以,你要設置行開始,因爲列的數量(是否有意義?如果你只有三列,你會從第3行開始),然後上行......這可能會讓你在第1行。

我保持這個接近你的原始VB,所以你可以看到我做了什麼。但是,您可以通過設置範圍的值相等來進一步調整以取消複製/粘貼的使用。讓我知道你是否感興趣,我會告訴你如何。

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 
+0

如果此答案適用於您,請不要忘記以綠色複選標記接受此答案。 – Chrismas007

相關問題