【发布时间】:2011-02-26 10:07:45
【问题描述】:
我需要找出垂直合并单元格的第一个单元格和最后一个单元格..
假设我将单元格 B2 合并到 B50。
如何在 VBA 中获取起始单元格(=B2)和结束单元格(=B50)?
【问题讨论】:
-
找到这些值后你想做什么?您希望如何输出答案?作为字符串?作为范围对象?
我需要找出垂直合并单元格的第一个单元格和最后一个单元格..
假设我将单元格 B2 合并到 B50。
如何在 VBA 中获取起始单元格(=B2)和结束单元格(=B50)?
【问题讨论】:
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
下面的宏遍历工作簿中的所有工作表并找到合并的单元格,取消合并并将原始值放入所有合并的单元格。
数据库应用经常需要这个,所以想和大家分享一下。
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
【讨论】:
好吧,假设您知道合并范围内某个单元格的地址,您可以选择该范围内的偏移量并获取行/列:
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 轴。
【讨论】:
如果您希望将单元格引用作为字符串,您可以使用类似这样的方法,其中 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)
【讨论】:
假设您将 B2 合并到 B50。
那么,起始单元格地址将是:
MsgBox Range("B2").MergeArea.Cells(1, 1).Address
结束单元格地址为:
With Range("B2").MergeArea
MsgBox .Cells(.Rows.Count, .Columns.Count).Address
End With
您可以将合并区域的任何单元格的地址代替上面代码中的B2。
【讨论】:
如果你打算遍历合并的单元格,试试这个。
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
【讨论】: