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

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

我发现这在合并的单元格上失败了。下图演示了使用内置选择性粘贴 UI 的等效操作,该操作以相同的方式失败:

跳过空格失败

谁能想到一个不涉及循环的优雅解决方法?

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


我已经删除了无循环限制,因为否则似乎没有完美的解决方案。

4

3 回答 3

1

以下经过测试,似乎有效。

假设:

  • 您帖子中的第一行单元格是A1:E1.
  • 您帖子中绿色突出显示的行单元格是A2:E2.
  • 需要部分覆盖的范围在第 4 行 ( A4:E4)。
  • 我一直复制单元格 A2:E2 的内容直到 cell 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

我希望这有帮助。

于 2013-07-05T00:09:52.360 回答
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 级嵌套循环。

于 2013-07-05T18:42:40.267 回答
0

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

于 2017-01-27T08:35:57.113 回答