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

时间:2013-07-04 19:57:21

标签: excel excel-vba vba

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

如果Range1Range2具有相同的尺寸,则此代码可以毫无问题地执行。期望您复制的范围中的公式将插入目标范围,但Range1中的任何空白单元格都不会将其公式复制到Range2,而是,任何当前单元格值都将是离开了。

我发现在合并的单元格上失败了。下图显示了使用内置的Paste Special UI的等效操作,该UI以相同的方式失败:

skip blanks fails

有人能想到一个优雅的解决方法,不涉及循环

请注意,仅使用Range1.Formula = Range2.Formula的变体是不够的,因为它会使用空白(空)值覆盖Range2中不需要的单元格。


我已经删除了no loop限制,因为似乎没有完美的解决方案。

3 个答案:

答案 0 :(得分:1)

以下测试并且似乎有效。

假设:

  • 您帖子中的第一行单元格为A1:E1
  • 帖子中绿色突出显示的行细胞为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

我希望这会有所帮助。

答案 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)

蛮力方法:
我有这个问题并使用了这个解决方案。 将整页的格式复制到新的临时页面。 取消合并您的页面。使用跳过空白进行复制。 将格式从临时页面复制到旧页面。 删除临时页面。