2014-04-26 82 views
0

我的表包含可變數目行三列(A:C),我很感興趣,如何複製可變範圍VBA

A B C D 
1 xx xx xx xxx 
2 .... 
3 .... 
4 ... 

我需要從WorkSheet1複製到WorkSheet2

ws2.Range("A1").Value = ws1.Range("A1:C4").Value 

問題是我不想硬編碼C4,因爲它可以是C5C20。我如何計算可能的可變行數。


PS:我不能使用Range("A1").CurrentRegion,因爲這將選擇比需要的,即列D值也將獲得更多的選擇列。儘管它會選擇正確的行數

+1

所選最後一行下方的行是否包含數據? – jmstoker

+0

你的表是ListObject嗎?如果是這樣,這是非常容易的。如果不是,則需要一些VBA來確定表格「結束」的位置,根據工作表的佈局可能會更困難一些。 –

+0

你可能沒有偶然發現[THIS](http://www.siddharthrout.com/2012/10/02/find-last-row-in-an-excel-sheetvbavb-net/)所以試試看? – L42

回答

3

對於大多數問題,有多種解決方案,但由於CurrentRegion方法返回的行數正確(但列數錯誤),因此假設您總是需要三列。

Dim rng as Range 
Set rng = ws1.Range("A1").CurrentRegion.Resize(,3) 

ws2.Range(rng.Address).Value = rng.Value 
+0

+1尼斯,我不知道。。resize方法 – jmstoker

+2

一旦你開始使用'調整大小'和'偏移量',你的世界將永遠不會相同:) –

2

我假設D中的最後一行等於或小於A:C的最後一行。我還假設最後一行由包含數據的最後一行確定。

Sub CopyColumnAtoC() 
    Dim lastRow As Long 

    lastRow = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 

    ThisWorkbook.Worksheets(1).Range("A1:C" & lastRow).Copy 

    ThisWorkbook.Worksheets(2).Range("A1:C" & lastRow).PasteSpecial xlPasteValues 
End Sub 
+0

錯字(A2:C ...)應該是A1。另外,您可以避免積極使用'.Copy'方法來複制/粘貼值,這是每個OP分配範圍'.Value'的方法。乾杯! –

+1

@David感謝您指出錯字。我明確地使用了複製和粘貼作爲安全措施,以防我對D列的假設更長時間的錯誤。如果D列較長,則A:C的相應行可能包含'#N/A' – jmstoker

1

您只能指定範圍中的列。所以

Sheet2.Range(Sheet1.Range("A:C").Address).Value = Sheet1.Range("A:C").Value 

將複製列A到C不管行中的每一列,即如果列A有8行,B有6,和C具有11將仍然起作用。