2011-06-10 60 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 
相關問題