Range1.Copy
Range2.PasteSpecial Paste:=xlPasteFormulas, SkipBlanks:=True
如果Range1
和Range2
具有相同的尺寸,则此代码可以毫无问题地执行。期望您复制的范围中的公式将插入目标范围,但Range1
中的任何空白单元格都不会将其公式复制到Range2
,而是,任何当前单元格值都将是离开了。
我发现在合并的单元格上失败了。下图显示了使用内置的Paste Special UI的等效操作,该UI以相同的方式失败:
有人能想到一个优雅的解决方法,不涉及循环?
请注意,仅使用Range1.Formula = Range2.Formula
的变体是不够的,因为它会使用空白(空)值覆盖Range2
中不需要的单元格。
我已经删除了no loop限制,因为似乎没有完美的解决方案。
答案 0 :(得分:1)
以下测试并且似乎有效。
假设:
A1:E1
。A2:E2
。A4:E4
)。我已经将细胞A2:E2的内容一直复制到细胞Q2
。因此F2:G2
合并了空白,H2
为空白,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
。
我希望这会有所帮助。
答案 1 :(得分: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
中的多个行上,而列上只有一个循环,同时跳过空白。此方法永远不会覆盖任何应该保留的目标,因此它适用于我的所有用例。
在更复杂的情况下,源数据有多行和列,这个例程不起作用,我想至少需要2级嵌套循环。
答案 2 :(得分:0)
蛮力方法:
我有这个问题并使用了这个解决方案。
将整页的格式复制到新的临时页面。
取消合并您的页面。使用跳过空白进行复制。
将格式从临时页面复制到旧页面。
删除临时页面。