Выберите определенные уровни
"... То есть уровень 0 равен ABCDE
, уровень 1 содержит ячейку, которая объединяет столбцы BCDE
, уровень 2 объединяет только CDE
, уровень 3 DE
и уровень 4 только E
."
Этот подход выбирает все элементы данного Level
(, как определено выше ), используя свойства MergeCells
и MergeArea
для проверки объединенных ячеекв определенном Level
через вспомогательную функцию bIsLevel()
.
Прикладной метод
В основном это
- проверяет каждую ячейку
c
в определенном диапазоне *) принадлежит ли он к диапазону объединенных ячеек (If c.MergeCells Then ...
), - получает результирующие
c.MergeArea.Address
, - проверки найденных адресов по требуемому адресу уровня x через помощникафункция
bIsLevel()
Примечание к последнему редактированию в 1-м цикле
*) Поскольку MergeArea.Addresses
показывает только первый включенный диапазон (верхняя / левая ячейка)в диапазоне слияния), можно тo сузить диапазон поиска, например, .UsedRange
до столбца в нем, соответствующего Level + 1
;поэтому вместо этого я отредактировал For Each c In Intersect(.UsedRange, .Columns(Level + 1))
как новое условие цикла.
Вызов основной процедуры SelectLevel
Процедура SelectLevel
имеет два необязательных параметра: (1)Разыскиваемый уровень, определенный OP, (2) квалифицированное имя рабочего листа.Он может быть вызван следующим примером оператора ( Примечание: , если вы не назначите 1-й аргумент , level 0
предполагается по умолчанию, 2-й аргумент по умолчанию имя листа по вашему выбору и должно быть заменено на ваше текущее имя листа).
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