PasteSpecial SkipBlanks:= True与合并的单元格失败
Range1.Copy Range2.PasteSpecial Paste:=xlPasteFormulas, SkipBlanks:=True
如果Range1
和Range2
具有相同的尺寸,则此代码执行没有任何问题。 期望是复制范围中的公式将被插入到目标范围中,但是Range1
任何空白单元格都不会将其公式复制到Range2
,而是将任何当前单元格值保留原样。
我发现这在合并单元格上失败。 下图展示了使用内置的“粘贴特殊用户界面”的等效操作,该操作以相同的方式失败:
任何人都可以想到一个优雅的解决scheme,不涉及循环 ?
请注意,简单地使用Range1.Formula = Range2.Formula
的变体是不够的,因为它会用空白(空)值覆盖Range2
不需要的单元格。
我已经删除了没有循环的限制,因为似乎没有一个完美的解决scheme,否则。
以下是testing,似乎工作。
假设:
- 您的文章中的第一行单元格是
A1:E1
。 - 您post中绿色突出显示的单元格是
A2:E2
。 - 需要部分覆盖的范围在第4行(
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
。
我希望这有帮助。
基于这个错误使得不循环的情况下无法做到这一点的结论,我想出了以下解决scheme,我相信在循环方面尽可能优雅。
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
多行上,并且在列上只有一个循环,而跳过空白。 这个方法永远不会覆盖任何应该被单独留下的目的地,所以它在我所有的用例中都能正常工作。
在一个更复杂的情况下,源数据有多行和多列,这个例程将不起作用,我想至less需要2级嵌套循环。
蛮力法:
我有这个问题,并使用这个解决scheme。 将整个页面的格式复制到新的临时页面。 取消合并您的网页。 做你的副本跳过空白。 从临时页面复制格式到旧页面。 删除临时页面。