Excel – 为什么命名合并范围与合并范围然后命名它不同?

我知道,我知道,合并范围很难处理.但无论如何:

我发现了一些有趣的行为,我可以复制/粘贴一些Merged Ranges但不能复制/粘贴其他行为.所以我试验了.

建立:

《Excel – 为什么命名合并范围与合并范围然后命名它不同?》

《Excel – 为什么命名合并范围与合并范围然后命名它不同?》

显然这些范围已经不一样了.合并后命名的范围仅由topLeftCell引用组成,而命名后合并的范围保留对所有单元格的引用.

编辑:测试代码

Option Explicit

Public Sub PerformTests()

    Const NAME_THEN_MERGE As String = "Name_Then_Merge"
    Const MERGE_THEN_NAME As String = "Merge_Then_Name"
    Const PASTE_NAME_THEN_MERGE As String = "Paste_Name_Then_Merge"
    Const PASTE_MERGE_THEN_NAME As String = "Paste_Merge_Then_Name"

    TestNames MERGE_THEN_NAME, PASTE_NAME_THEN_MERGE
    '/ Result: Error 1004, cannot do that to a merged cell


End Sub

Public Sub TestNames(ByVal copyName As String, ByVal pasteName As String)

    wsPasteTest.Activate

    Dim copyRange As Range, pasteRange As Range
    Set copyRange = wsPasteTest.Range(copyName)
    Set pasteRange = wsPasteTest.Range(pasteName)

    CopyPasteCell copyRange, pasteRange

End Sub

Public Sub CopyPasteCell(ByRef copyCell As Range, ByRef pasteCell As Range, Optional ByVal pasteRowHeights As Boolean = False)

    copyCell.Copy
    pasteCell.PasteSpecial xlPasteAll

    If pasteRowHeights Then
        Dim sourceRowHeight As Long
        sourceRowHeight = copyCell.rowHeight
        pasteCell.rowHeight = sourceRowHeight
    End If

End Sub

经过广泛的测试,这似乎是结论:

如果您命名一系列单元格然后合并它们,则命名范围将保留对所有单元格的引用.如果先合并,则命名范围仅引用topLeftCell.

如果您尝试复制命名范围,则将其视为与其“引用”的大小相同.因此,可以将一组(命名然后合并的)5个单元格复制到另一组相同大小的合并单元格,或复制到单个单元格.

但是,(合并后命名)范围只能复制到单个单元格.尝试复制到一组5个合并的单元格将导致1004错误.

为什么?如何处理合并的单元格和命名范围会导致这种差异?

作为参考,这是Office 365,Excel版本15.0.4805.1003

最佳答案 我打算对此进行一次尝试,因为我认为我已经对你的代码进行了足够的测试,以了解正在发生的事情.

让我们从Excel在执行您指定的操作时如何处理各种命名范围开始.您可以看到,在将copyRange设置为MERGE_THEN_NAME常量,并在新定义的copyRange上使用.Copy(用于测试目的)之后,A2单元格周围有移动的虚线.

Option Explicit

Public Sub PerformTests()

    Const NAME_THEN_MERGE As String = "Name_Then_Merge"
    Const MERGE_THEN_NAME As String = "Merge_Then_Name"
    Const PASTE_NAME_THEN_MERGE As String = "Paste_Name_Then_Merge"
    Const PASTE_MERGE_THEN_NAME As String = "Paste_Merge_Then_Name"

    TestNames MERGE_THEN_NAME, PASTE_MERGE_THEN_NAME
    '/ Result: Error 1004, cannot do that to a merged cell


End Sub

Public Sub TestNames(ByVal copyName As String, ByVal pasteName As String)

    Sheets("wsPasteTest").Activate

    Dim copyRange As Range, pasteRange As Range
    Set copyRange = Sheets("wsPasteTest").Range(copyName)
    copyRange.Copy    'This is the last step executed before error
    Set pasteRange = Sheets("wsPasteTest").Range(pasteName)

    CopyPasteCell copyRange, pasteRange

End Sub

《Excel – 为什么命名合并范围与合并范围然后命名它不同?》

这是预期的,因为定义的范围在名称管理器中读作= wsPasteTest!$A $2.

《Excel – 为什么命名合并范围与合并范围然后命名它不同?》

该范围的定义意味着当Excel重新访问命名范围以提取值时,它通过字面解释地址来实现,即它仅考虑自自己的the merged cells’ value is defined in the “top left”单元地址以来的A2的单元值.这个逻辑可以通过需要使用Range(“A2:E2”)之类的东西通过VBA过程(在上面的超链接中解决)返回合并单元格的值的正确方法来确认.Cellins(1).Value而不仅仅是Range(“A2:E2”).价值.后一个选项返回一个数组,因为它正在考虑范围内的每个单元格的值.

这里的下一部分是使用它的危险.选择或.激活整个代码,但也展示了如何获得你想要的行为.我们可以看到我们何时.选择copyCell它选择整个合并单元格而不是.Copy方法中的A2(模仿用户如何与电子表格本身的范围交互).所以现在,如果我们选择copyCell然后使用Selection.Copy,整个合并的单元格将被复制而不仅仅是A2,因为Excel已被指示抓取整个阵列区域. Excel也刚刚显示了选择项目然后使用选择的重要性可以大大改变其对范围的解释,而不是明确地使用范围.

PerformTests()和TestNames()中的代码与您的代码相同,修改了以下子代码:

Public Sub CopyPasteCell(ByRef copyCell As Range, ByRef pasteCell As Range, Optional ByVal pasteRowHeights As Boolean = False)

    copyCell.Select
    Selection.Copy 'this step is shown in the first screenshot below
    pasteCell.Select
    Selection.PasteSpecial xlPasteAll 'this step is shown in the second screentshot below

    If pasteRowHeights Then
        Dim sourceRowHeight As Long
        sourceRowHeight = copyCell.RowHeight
        pasteCell.RowHeight = sourceRowHeight
    End If

End Sub

这是copyCell被选中,然后被复制的结果.

《Excel – 为什么命名合并范围与合并范围然后命名它不同?》

这是选择pasteCell的结果,然后粘贴到.这显示了使用Merge_Then_Name范围时所需的结果.

《Excel – 为什么命名合并范围与合并范围然后命名它不同?》

最后,您可以看到,当您明确指定合并后定义的命名范围时,它会逐字地解释命名范围的地址(给出具有单个单元格格式的单个单元格值),这显然无法粘贴到所需的区域大小建议的粘贴方法.如果将粘贴方法更改为xlPasteValues,则可以避免使用.Select.这样做的原因是它允许Paste_Merge_Then_Name的定义保持为= wsPasteTest!$A $8,同时还允许将值传输到单个单元格区域.此方法仅在替换值时保持目标单元格的格式相同.它不是你想要的粘贴,但非常接近.

Public Sub CopyPasteCell(ByRef copyCell As Range, ByRef pasteCell As Range, Optional ByVal pasteRowHeights As Boolean = False)

    copyCell.Copy
    pasteCell.PasteSpecial xlPasteValues

    If pasteRowHeights Then
        Dim sourceRowHeight As Long
        sourceRowHeight = copyCell.RowHeight
        pasteCell.RowHeight = sourceRowHeight
    End If

End Sub

《Excel – 为什么命名合并范围与合并范围然后命名它不同?》

Name_Then_Merge范围适用于单个单元格和命名范围的粘贴,主要原因之一;它包含多少占位符的值.当您执行Name_Then_Merge的.Copy方法时,它会选择整个合并的单元格,因为它的定义是指定= wsPasteTest!$A $5:$E $5.这很好,因为将它粘贴到相同大小的命名范围会起作用,因为它们匹配,并且粘贴到单个单元格中会起作用,因为只有一个非空白值.

摘要:命名范围由其初始单元格值定义,即使在合并单元格后仍保留该“位置”数.因此,如果您命名范围,它将引用范围中每个单元格的值(在这种情况下为5个值),并且合并单元格不会更改命名范围的定义(但会在第一个更改后更改数组的所有值)单元格为“”作为占位符.如果合并单元格然后命名范围,则该值将保留在合并区域的左上角单元格中,因此将用作命名范围的合并单元格的定义.在这种情况下,如果你试图将.Paste或xlPasteAll这个放入合并的单元格中,Excel就会变得混乱,因为它会将源的值复制为单个单元格区域,并尝试将其粘贴到五个单元格区域的目标中.

通过确保通过选择或使用不同的粘贴方法复制命名范围的整个区域来解决此问题,但要警惕这些粘贴方法产生的内容.例如. xlPasteAllUsingSourceTheme将取消合并目标单元格,但仍满足命名范围定义.

点赞