2014-04-26 53 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将仍然起作用。