2011-06-10 64 views
1

A列有这样的数据(即频繁的空白单元格):Excel VBA中复制下来了空白单元格

HEADING <-- this is A1 
kfdsl 
fdjgnm 
fdkj 


gdfkj 
4353 

fdjk 



blah  <-- this is A14 

我试图将它复制到一个新的范围在d列,但它看起来像做这样的:

HEADING <-- this is D1 
kfdsl 
fdjgnm 
fdkj 
fdkj 
fdkj 
gdfkj 
4353 
4353 
fdjk 
fdjk 
fdjk 
fdjk 
blah  <-- this is D14 

这里是我到目前为止的代码:

For i = 0 To UBound(origincells) 
numrows = originsheet.Range(Left(origincells(i), 1) & "65536").End(xlUp).Row - 1 
originsheet.Range(origincells(i) & ":" & Left(origincells(i), 1) & numrows).Copy 
destsheet.Range(destcells(i) & ":" & Left(destcells(i), 1) & (Val(Right(origincells(i), 1)) + numrows)).PasteSpecial 
Next 
+0

有一个在以前的堆栈溢出后发现了一个简单的非VBA的解决方案:http://stackoverflow.com/questions/3762340/excel-data-entry-help 为了使这项工作适合您,您只需将A列中的数据复制到D列,然后按照D列中的步骤操作。 – Excellll 2011-06-13 13:55:02

回答

3

我肯定会建议使用字符串连接来构建单元格地址,就像您在此处所做的那样:Range(origincells(i) & ":" & Left(origincells(i), 1) & numrows)。这是不必要的混乱,很难写,很难阅读。使用例如改为.Cells,.Resize.Offset方法。

此外,我会避免使用.Copy,因为这会使您的数据通过系统的剪贴板传输。其他应用程序可能会同时读取和写入剪贴板,这会导致无法预测的行为。最后,不是循环遍历单元格,而是将整个范围一次加载到数组中,更有效地完成所有循环和操作,最后将所有内容一次写入到表单中。这是我在下面使用的方法。

这将这样的伎俩:

Dim varData As Variant 
Dim i As Long 

varData = Sheet1.Range("A1:A14") '// Read in the data. 

For i = LBound(varData, 1) + 2 To UBound(varData, 1) 
    If IsEmpty(varData(i, 1)) Then 
     '// Cell is empty. Copy value from above. 
     varData(i, 1) = varData(i - 1, 1) 
    End If 
Next i 

'// Write result to sheet. 
Sheet1.Range("D1").Resize(UBound(varData, 1) - LBound(varData, 1) + 1, 1) _ 
    = varData 
相关问题