选择定义的级别
"... 所以 level 0 是 ABCDE,level 1 包含合并列 BCDE 的单元格,level 2 仅合并 CDE,3 级 DE,4 级 仅合并 E。"
此方法使用MergeCells 和MergeArea 属性选择给定Level(如上定义)的所有项目,以通过帮助函数检查定义的Level 处的合并单元格bIsLevel().
应用方法
基本上是这样
- 检查定义范围内的每个单元格
c *) 是否属于合并的单元格范围 (If c.MergeCells Then ...),
- 得到结果
c.MergeArea.Address,
- 通过帮助函数
bIsLevel()检查找到的地址与想要的x级别地址
最近在第一个循环条件下编辑的注释
*) 由于MergeArea.Addresses 仅显示第一个包含的范围(合并范围中的顶部/左侧单元格),因此可以缩小搜索范围,例如.UsedRange 对应于Level + 1 的列;因此我将For Each c In Intersect(.UsedRange, .Columns(Level + 1)) 编辑为新的循环条件。
调用主程序SelectLevel
Procedure SelectLevel 有两个可选参数:(1) OP 定义的所需级别,(2) 合格的工作表名称。它可以通过以下示例语句调用(注意: 如果您不分配 第一个参数,则 level 0 假定为默认情况下,第二个参数默认为您选择的工作表名称,应更改为您当前的工作表名称)。
SelectLevel 1 ' e.g. level 1 selects all merged cells of columns B:E
主程序SelectLevel
Sub SelectLevel(Optional Level& = 0, Optional ByVal SheetName$ = "MySheet")
Dim c As Range, rng As Range, i&
With ThisWorkbook.Worksheets(SheetName)
For Each c In Intersect(.UsedRange, .Columns(Level + 1))
If c.MergeCells Then
If c.Address = Left(c.MergeArea.Address, Len(c.Address)) Then
If bIsLevel(c, Level) Then
If rng Is Nothing Then
Set rng = c
Else
Set rng = Application.Union(rng, c)
End If
End If
End If
End If
Next
End With
' Execute selection of wanted level
If Not rng Is Nothing Then
rng.Select
Else
MsgBox "Found no LEVEL" & Level & " items.", vbExclamation, "No Selection"
End If
End Sub
辅助函数bIsLevel()
Function bIsLevel(currCell As Range, ByVal lvl&) As Boolean
Dim LevelAddress$, CellAddress$
Dim arr(): arr = Array("A", "B", "C", "D", "E")
LevelAddress = arr(lvl) & ":" & arr(UBound(arr)) ' define Level columns due to OP
CellAddress = Split(currCell.MergeArea.Address, "$")(1) & ":" & _
Split(currCell.MergeArea.Address, "$")(3)
bIsLevel = (LevelAddress = CellAddress)
'If bIsLevel Then Debug.Print "cell " & currCell.Address & " in currcell.MergeArea " & currCell.MergeArea.Address & _
" (" & CellAddress & " equ./LEVEL" & lvl & " " & LevelAddress & ")"
End Function