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

Excel PasteSpecial SkipBlanks:=True合并单元格失败,excel,vba,Excel,Vba,如果Range1和Range2具有相同的维度,则此代码执行时不会出现任何问题。您希望复制的范围内的公式将被插入目标范围,但是Range1中的任何空白单元格都不会将其公式复制到Range2,相反,任何当前单元格值都将保持原样 我发现这在合并的单元格上失败。下图演示了使用内置的“粘贴特殊”UI执行的等效操作,该UI以相同的方式失败: 有人能想出一个不涉及循环的优雅解决方案吗 请注意,简单地使用Range1.Formula=Range2.Formula的变量是不够的,因为它将用空白(空)值覆盖Ran

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

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

有人能想出一个不涉及循环的优雅解决方案吗

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



我删除了无循环限制,因为除此之外似乎没有完美的解决方案。

以下内容经过测试,似乎有效

假设:

  • 帖子中的第一行单元格是
    A1:E1
  • 文章中绿色高亮显示的行单元格是
    A2:E2
  • 需要部分覆盖的范围位于第4行(
    A4:E4
  • 我一直复制单元格A2:E2的内容,直到单元格
    Q2
    。因此,
    F2:G2
    合并为空,
    H2
    为空,
    I2
    具有“复制”,依此类推,直到
    Q2
    (具有“复制”)。我只是想确保该方法适用于多个合并区域

    Range1.Copy
    Range2.PasteSpecial Paste:=xlPasteFormulas, SkipBlanks:=True
    
如果
rngSkip
包含硬数字或文本,这将起作用,但如果包含公式,则将失败。。在这种情况下,我们需要设置一个指向公式子范围的指针,并使用
vartempformals=range.formula
将它们存储在另一个变量中,然后再次返回
range.formula=vartempformals


我希望这能有所帮助。

以下内容经过测试,似乎有效

假设:

  • 帖子中的第一行单元格是
    A1:E1
  • 文章中绿色高亮显示的行单元格是
    A2:E2
  • 需要部分覆盖的范围位于第4行(
    A4:E4
  • 我一直复制单元格A2:E2的内容,直到单元格
    Q2
    。因此,
    F2:G2
    合并为空,
    H2
    为空,
    I2
    具有“复制”,依此类推,直到
    Q2
    (具有“复制”)。我只是想确保该方法适用于多个合并区域

    Range1.Copy
    Range2.PasteSpecial Paste:=xlPasteFormulas, SkipBlanks:=True
    
如果
rngSkip
包含硬数字或文本,这将起作用,但如果包含公式,则将失败。。在这种情况下,我们需要设置一个指向公式子范围的指针,并使用
vartempformals=range.formula
将它们存储在另一个变量中,然后再次返回
range.formula=vartempformals


我希望这能有所帮助。

基于这个错误使得不使用循环就不可能做到这一点的结论,我提出了以下解决方案,我认为使用循环尽可能优雅

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
Dim col尽可能长
暗淡的cel as范围
对于src.单元格中的每个单元格
如果cel.Formula vbNullString,则
柱=1+src.柱-cel.柱
凯尔,收到
dst.Worksheet.Range(dst.Cells(1,列),dst.Cells(dst.rows,列)).Paste特殊粘贴:=xlPaste公式
如果结束
下一个细胞
这使您可以从范围
src
中复制一行数据,并在范围
dst
中的多行上粘贴公式,在列上只有一个循环,同时跳过空白。这个方法永远不会覆盖任何应该单独保留的目的地,所以它在我的所有用例中都有效


在源数据既有多行又有多列的更复杂的情况下,此例程将无法工作,我认为至少需要两级嵌套循环。

基于此错误导致不循环就无法执行此操作的结论,我已经想出了下面的解决方案,我认为这是尽可能优雅的循环

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
Dim col尽可能长
暗淡的cel as范围
对于src.单元格中的每个单元格
如果cel.Formula vbNullString,则
柱=1+src.柱-cel.柱
凯尔,收到
dst.Worksheet.Range(dst.Cells(1,列),dst.Cells(dst.rows,列)).Paste特殊粘贴:=xlPaste公式
如果结束
下一个细胞
这使您可以从范围
src
中复制一行数据,并在范围
dst
中的多行上粘贴公式,在列上只有一个循环,同时跳过空白。这个方法永远不会覆盖任何应该单独保留的目的地,所以它在我的所有用例中都有效

在源数据既有多行又有多列的更复杂的情况下,此例程将无法工作,我认为至少需要两级嵌套循环。

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

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

是否可以将其用于任意起点和终点?我给出的例子只是一个例子,两者之间的偏移量不会给我一个固定的
(2,0)
。除此之外,您似乎已经解决了主要的难点。在测试时,如果原始值是数组公式,或者具有中间单元格格式,而无法使用range.formula属性存储或还原,则此操作似乎仍然失败。我无法对目标单元格的内容进行假设。似乎任何涉及覆盖的解决方案