Excel VBA скопировать пустые ячейки - PullRequest
1 голос
/ 10 июня 2011

столбец 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

1 Ответ

3 голосов
/ 10 июня 2011

Я бы определенно советовал против , используя конкатенацию строк для построения адресов ячеек, как вы делаете здесь: 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
...