【问题标题】:Get start range and end range of a vertically merged cell with Excel using VBA使用 VBA 使用 Excel 获取垂直合并单元格的开始范围和结束范围
【发布时间】:2011-02-26 10:07:45
【问题描述】:

我需要找出垂直合并单元格的第一个单元格和最后一个单元格..

假设我将单元格 B2 合并到 B50。
如何在 VBA 中获取起始单元格(=B2)和结束单元格(=B50)?

【问题讨论】:

  • 找到这些值后你想做什么?您希望如何输出答案?作为字符串?作为范围对象?

标签: excel vba


【解决方案1】:
Sub MergedAreaStartAndEnd()

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

    Set rng = Range("B2")

    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

【讨论】:

  • 你也可以rng.MergeArea.Address
【解决方案2】:

下面的宏遍历工作簿中的所有工作表并找到合并的单元格,取消合并并将原始值放入所有合并的单元格。

数据库应用经常需要这个,所以想和大家分享一下。

Sub BirlesenHucreleriAyirDegerleriGeriYaz()
    Dim Hucre As Range
    Dim Aralik
    Dim icerik
    Dim mySheet As Worksheet

    For Each mySheet In Worksheets

    mySheet.Activate
    MsgBox mySheet.Name & “ yapılacak…”

    For Each Hucre In mySheet.UsedRange
        If Hucre.MergeCells Then
           Hucre.Orientation = xlHorizontal
           Aralik = Hucre.MergeArea.Address
           icerik = Hucre
           Hucre.MergeCells = False
           Range(Aralik) = icerik
        End If
    Next

 MsgBox mySheet.Name & " Bitti!!"

 Next mySheet
End Sub

【讨论】:

    【解决方案3】:

    好吧,假设您知道合并范围内某个单元格的地址,您可以选择该范围内的偏移量并获取行/列:

    Sub GetMergedRows()
        Range("A7").Select 'this assumes you know at least one cell in a merged range.
        ActiveCell.Offset(-1, 0).Select
        iStartRow = ActiveCell.Row + 1
        Range("A7").Select
        ActiveCell.Offset(1, 0).Select
        iEndRow = ActiveCell.Row - 1
        MsgBox iStartRow & ":" & iEndRow
    End Sub
    

    如果无法选择偏移行(即,如果合并的行是 A1 到其他),上面的代码将抛出错误,因此您需要添加错误处理,告诉代码如果它不能向上偏移,则顶部行必须是1,如果不能下去,底行必须是65,536。此代码也只是一维的,因此您可能还想添加 x 轴。

    【讨论】:

      【解决方案4】:

      如果您希望将单元格引用作为字符串,您可以使用类似这样的方法,其中 Location、StartCell 和 EndCell 是字符串变量。

      Location = Selection.Address(False, False)
      Colon = InStr(Location, ":")
      If Colon <> 0 Then
          StartCell = Left(Location, Colon - 1)
          EndCell = Mid(Location, Colon + 1)
      End If
      

      如果你想将它们设置为范围,你可以添加这个,其中 StartRange 和 EndRange 是 Range 对象。

      set StartRange = Range(StartCell)
      set EndRange = Range (EndCell)
      

      【讨论】:

        【解决方案5】:

        假设您将 B2 合并到 B50。

        那么,起始单元格地址将是:

        MsgBox Range("B2").MergeArea.Cells(1, 1).Address
        

        结束单元格地址为:

        With Range("B2").MergeArea
            MsgBox .Cells(.Rows.Count, .Columns.Count).Address
        End With
        

        您可以将合并区域的任何单元格的地址代替上面代码中的B2。

        【讨论】:

          【解决方案6】:

          如果你打算遍历合并的单元格,试试这个。

          Sub LoopThroughMergedArea()
              Dim rng As Range, c As Range
          
              Set rng = [F5]
          
              For Each c In rng.MergeArea
                  'Your code goes here
                  Debug.Print c.Address'<-Sample code
              Next c
          End Sub
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-17
            • 2015-11-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多