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属性存储或还原,则此操作似乎仍然失败。我无法对目标单元格的内容进行假设。似乎任何涉及覆盖的解决方案