PasteSpecial SkipBlanks:= True与合并的单元格失败

Range1.Copy Range2.PasteSpecial Paste:=xlPasteFormulas, SkipBlanks:=True 

如果Range1Range2具有相同的尺寸,则此代码执行没有任何问题。 期望是复制范围中的公式将被插入到目标范围中,但是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。 将整个页面的格式复制到新的临时页面。 取消合并您的网页。 做你的副本跳过空白。 从临时页面复制格式到旧页面。 删除临时页面。