【问题标题】:Loop through merged cells in a Column to get their addresses in VBA循环遍历列中的合并单元格以在 VBA 中获取它们的地址
【发布时间】:2019-11-28 01:53:41
【问题描述】:

我有一个专栏。比如说 A 列,它有多个不同范围的合并单元格。

例如,第一个单元格从 A2 合并到 A15,而第二个合并单元格的范围从 A16 到 A115。

我想遍历整个列以获取每个合并单元格的地址。

以下代码仅适用于第一个单元格,但我想遍历 A 列中的所有单元格。

Sub Macro()

    Dim rng As Range, rngStart As Range, rngEnd As Range

    Set rng = Range("A2")

    If rng.MergeCells Then

        Set rng = rng.MergeArea
        Set rngStart = rng.Cells(1, 1)
        Set rngEnd = rng.Cells(rng.Rows.Count, rng.Columns.Count)

        MsgBox "First Cell " & rngStart.Address & vbNewLine & "Last Cell " & rngEnd.Address

    Else

        MsgBox "Not merged area"

    End If
End Sub

【问题讨论】:

  • 欢迎来到 SO。最好粘贴您已经编写的代码。
  • 请在问题中包含您正在使用的代码以获得帮助。

标签: excel vba


【解决方案1】:

它仅适用于单个单元格的原因是因为您将rng 设置为单个单元格。因此,我使用for each cell in rng 循环遍历 A 列直到最后一行。

Sub macro()

    Dim rng As Range, rngStart As Range, rngEnd As Range, cell As Range
    Dim ws As Worksheet
    Dim lRow As Long
    Dim arr() As String

    Set ws = ActiveSheet
    With ws
        lRow = .Cells(.Rows.Count, 1).End(xlUp).row 'Get the last row in the activesheet
        Set rng = .Range("A1:A" & lRow)
    End With

    For Each cell In rng
        If cell.MergeArea.Cells(1, 1).Address = cell.Address Then

            If cell.MergeArea.Cells.Count > 1 Then

                arr() = Split(cell.MergeArea.Address, ":")
                Set rngStart = Range(arr(0))
                Set rngEnd = Range(arr(1))
                MsgBox "First Cell " & rngStart.Address & vbNewLine & "Last Cell " & rngEnd.Address

            Else

                MsgBox "Not merged area"
            End If
        End If
    Next
End Sub

【讨论】:

  • 代码通过循环遍历整个 A 列,但问题是它不会进入下一个合并单元格,而是直接进入下一个单元格例如我的第一个单元格,即 A1,是单个(非合并)单元格。我的下一个单元格是从 A2:A10 合并的,然后是从 A11:A29 合并的单元格,因此当代码运行时,它会跳过 A1,因为它是单个单元格。对于即将到来的单元格,A2-它正确显示了地址现在理想情况下它应该直接移动到 A11 但它没有它转到 A3 并显示与 A2 相同的地址并重复相同的地址直到它到达 A10 你能修复吗这个问题的代码
  • 我已经编辑了答案,尝试一下,如果有任何其他错误,请告诉我。
【解决方案2】:

子宏()

调暗为范围 调暗开始为范围 将 rngEnd 调暗为范围

Set rng = Range("A2")

If rng.MergeCells Then

    Set rng = rng.MergeArea
    Set rngStart = rng.Cells(1, 1)
    Set rngEnd = rng.Cells(rng.Rows.Count, rng.Columns.Count)

    MsgBox "First Cell " & rngStart.Address & vbNewLine & "Last Cell " & rngEnd.Address

Else

    MsgBox "Not merged area"

End If

结束子

这是适用于单个单元格的代码

【讨论】:

  • 欢迎来到 SO,您应该使用此代码编辑您的问题,而不是作为答案发布
猜你喜欢
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 2012-03-13
相关资源
最近更新 更多