【问题标题】:Taking value of a range of merged cells取一系列合并单元格的值
【发布时间】:2015-06-17 16:01:49
【问题描述】:

我有一系列包含值的合并单元格。我只想读取每个合并单元格中包含的值。合并区域中的单元格数量会有所不同。现在我有这个:

Sub testnoms()
    Dim cell As Range
    For Each cell In ActiveSheet.Range("B20:K23") 'this would be the range to look at
        Debug.Print cell.MergeArea.Cells(1, 1).Value
    Next
End Sub

现在它会转到范围内的每个单元格并返回其合并区域中的值。所以我得到了正确的值,但是合并区域中的每个单元格都有一个副本。例如,如果 5 个单元格合并在一起,则打印合并单元格值的 5 倍。有没有人想办法解决这个问题?

【问题讨论】:

    标签: vba excel


    【解决方案1】:
    Sub testnoms()
        Dim cell As Range
        For Each cell In ActiveSheet.Range("B20:K23") 
            If cell.Address() = cell.MergeArea.Cells(1).Address() Then
                Debug.Print cell.Address(), cell.MergeArea.Cells(1, 1).Value
            End If
        Next
    End Sub
    

    如果您需要捕获可能未完全包含在您定义的范围内的合并区域值:

    Sub testnoms()
        Dim c As Range, d, addr
        Set d = CreateObject("scripting.dictionary")
        For Each c In ActiveSheet.Range("B20:K23")
            addr = c.MergeArea.Address()
            If Not d.exists(addr) Then
                d.Add addr, True
                Debug.Print c.Address(), c.MergeArea.Cells(1).Value
            End If
        Next
    End Sub
    

    【讨论】:

    • 我假设每个合并区域都完全包含在您循环的范围内:如果不是这种情况,则可能需要不同的方法。
    • 是这样的。虽然根据我对合并单元格的了解,如果合并区域从单元格的顶部或左侧突出,则您的方法确实不起作用,否则如果通过第一个单元格从底部或右侧突出,它仍然可以工作(仍将在指定范围内)。
    • 如果您想处理部分在您所在区域之外的合并区域,那么最可靠的方法是跟踪合并区域地址,如果您还没有看到,则仅报告单元格值地址。
    【解决方案2】:

    不要使用范围 B20:K23,而是使用 B20:B23。使用 B:K 范围,它将(如您所见)遍历该合并单元格中的每个“基础”单元格,并一遍又一遍地返回相同的值。如果您改用 B:B,它将按照您的意愿行事 - 遍历每个合并的单元格一次并返回该值。

    这有意义吗?

    编辑:请告诉我为什么不赞成,我也在努力学习,所以如果这个方法不是一个好方法,请告诉我为什么,这样我也可以学习。

    【讨论】:

    • 合并的单元格不是一个在另一个之上。有时它们彼此相邻。你的方法会忽略这一点。
    • 您投了反对票,因为您假设每个合并的单元格范围是从 B 列到 K 列的完整区域,这很可能是错误的,因为 OP 的问题没有表明这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2019-08-02
    • 2016-01-08
    • 2011-07-02
    • 2013-02-01
    相关资源
    最近更新 更多