2013-07-04 2 views
1
Range1.Copy 
Range2.PasteSpecial Paste:=xlPasteFormulas, SkipBlanks:=True 

Если Range1 и Range2 имеют одинаковые размеры, этот код выполняется без каких-либо проблем. Ожидается, что формулы в скопированном вами диапазоне будут вставлены в целевой диапазон, но любые пустые ячейки в Range1 не будут иметь формулы, скопированные в Range2, вместо этого любые текущие значения ячеек будут оставлены такими, какими они были.PasteSpecial SkipBlanks: = True не удается с слившихся клеток

Я обнаружил, что это не удается с объединенными ячейками. На рисунке ниже показано, эквивалентное действие с помощью встроенной в Paste Special UI, который терпит неудачу идентичным образом:

skip blanks fails

Можно ли думать о шикарном обходном , что не включает в себя цикл?

Обратите внимание, что просто использование варианта Range1.Formula = Range2.Formula не будет достаточным, поскольку оно перезапишет нежелательные ячейки в Range2 с пустыми (пустыми) значениями.


Я удалил ограничение на отсутствие циклов, потому что в противном случае не существует идеального решения.

ответ

0

Основываясь на заключении, что эта ошибка делает невозможным это без зацикливания, я придумал следующее решение, которое, по моему мнению, будет настолько элегантным, насколько возможно с циклом.

Dim col as Long 
Dim cel as Range 
For Each cel In src.Cells 
    If cel.Formula <> vbNullString Then 
     col = 1 + src.Column - cel.Column 
     cel.Copy 
     dst.Worksheet.Range(dst.Cells(1, col), dst.Cells(dst.rows, col)).PasteSpecial Paste:=xlPasteFormulas 
    End If 
Next cel 

Это позволяет копировать одну строку данных из диапазона src и вставки формул на нескольких строк в диапазоне dst только один цикл по столбцам, в то время как пропуск заготовки. Этот метод никогда не перезаписывает какое-либо место назначения, которое должно быть оставлено в покое, поэтому оно работает во всех моих случаях использования.

В более сложной ситуации, когда исходные данные имели несколько строк, а также столбцы, эта процедура не работала, и я предполагаю, что потребуется не менее двух уровней вложенных циклов.

1

Следующее было проверено и, похоже, работает.

Предположения:

  • Первые ячейки строки в вашем посте являются A1:E1.
  • Зеленые выделенные ячейки строки в вашем сообщении: A2:E2.
  • Диапазон, который должен быть частично перезаписан, находится в строке 4 (A4:E4).
  • Я воспроизвел содержимое ячеек A2: E2 полностью до ячейки Q2. Таким образом, F2:G2 объединены & blank, H2 is blank, I2 имеет «копию» и т. Д. До Q2 (у которого есть «копия»). Я просто хотел убедиться, что метод работает с несколькими объединенными областями.

    Sub skipBlanksWithMergedCells() 
        Dim rngOrigin As Range, rngDestination As Range, rngSkip As Range 
        Dim varTemp As Variant 
    
        Set rngOrigin = Range("A2:Q2") 
        Set rngDestination = Range("A4:Q4") 
        ' Set pointer to range that needs to be skipped 
        Set rngSkip = rngOrigin.SpecialCells(xlCellTypeBlanks).Offset(2, 0) 
        ' Store its values into a variant 
        varTemp = rngSkip.Value 
        rngOrigin.Copy 
        rngDestination.PasteSpecial xlPasteFormulas 
        ' Revert original values from the variant 
        rngSkip.Value = varTemp 
    End Sub 
    

Это будет работать, если rngSkip содержит жесткие цифры или текст, но он потерпит неудачу, если он содержит формулы .. В этом случае нам нужно установить указатель на поддиапазон формул и хранить их в другой вариант, используя varTempFormulas=range.formula, а затем обратно range.formula=varTempFormulas.

Надеюсь, это поможет.

+0

Можно ли это сделать для работы с произвольным источником и местом назначения? Пример, который я дал, был всего лишь примером, смещение между ними не будет фиксированным «(2, 0)». Помимо этого вы, кажется, обратились к основной точке боли. – Alain

+1

После тестирования кажется, что это все еще не удается, если исходное значение является формулой массива или имеет форматирование средней ячейки, которое невозможно сохранить или восстановить с использованием свойства range.formula. Я не могу делать предположения о содержимом ячеек назначения. Кажется, что любое решение, включающее перезапись исходного содержимого ячейки, которое должно было быть пропущено, даже временно, может не сработать. Слитые клетки - такая проклятая боль. – Alain

+0

@Alain Смещенная часть может быть 'abs (rngOrigin.row-rngDestination.row)' вместо '2'. Для другого комментария я абсолютно согласен: сочетание объединенных ячеек + несмежных диапазонов трудно решать без каких-либо предположений. Формат, который мы можем восстановить, если мы сохраним свойство 'text' в варианте, но не массив формулы. Также копирование 'rngSkip' во временный диапазон не работает:' rngSkip' является несмежным, поэтому мы не можем вставить временный диапазон обратно к нему. Не уверен, что еще может помочь. Может быть, сохранить все свойства в пользовательском объекте и обратно? – Ioannis

0

Метод грубой силы:
У меня была эта проблема и она использовала это решение. Скопируйте формат всей страницы на новую временную страницу. Un-merge your page. Сделайте свою копию с пробелами. Копирование формата с временной страницы на старую страницу. Удалить временную страницу.

Смежные вопросы