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