[英]excel vba copy down over blank cells
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
我肯定會建議不要使用字符串連接來構建單元格地址,就像你在這里做的那樣: 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.