列A包含这样的数据(即频繁的空白单元格):
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 :(得分:3)
我肯定会建议反对使用字符串连接来构建单元格地址,就像你在这里一样:Range(origincells(i) & ":" & Left(origincells(i), 1) & numrows)
。这是不必要的混乱,难以写,难以阅读。使用例如取而代之的是.Cells
,.Resize
和.Offset
方法。
另外,我会避免使用.Copy
,因为这会使您的数据通过系统的剪贴板传输。其他应用程序可能同时读取和写入剪贴板,这将导致疯狂和不可预测的行为。
最后,不是循环遍历单元格,更有效的是将整个范围一次加载到Variant
数组中,在那里进行所有循环和操作,最后立即将整个内容写入工作表。这是我在下面使用的方法。
这样可以解决问题:
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