Вы можете выделить диапазоны следующих типов:
Когда вы обрабатываете выделенный диапазон, то должны быть уверены, что он нужного типа иначе не исключено, что макрос будет работать не так как хотелось.
Перед тем как обрабатывать выделенный диапазон ячеек необходимо убедиться, а на сомом ли деле это диапазон ячеек, а не график или кнопка. Следующим образом можно предупредить пользователя, что выделен совсем не диапазон.
' Проверяем выделен ли диапазон If TypeName(Selection) <> "Range" Then MsgBox "Необходимо выделить диапазон ячеек", vbOKOnly Or vbInformation, "Определение типа диапазона" Exit Sub End If
Теперь разберем, как определить тип выделенного диапазона. Рассмотрим следующую функцию.
Function RangeType(rng As Range) As String '************************************************************** ' Метод : RangeType ' Разработчик : Желтов Алексей ' Дата создания : 01.05.2016 14:50 ' Описание : Определение типа диапазона '************************************************************** Select Case True Case rng.Cells.CountLarge = 1 RangeType = "Ячейка" Case rng.CountLarge = Cells.CountLarge RangeType = "Лист" Case rng.Rows.Count = Cells.Rows.Count RangeType = "Столбец" Case rng.Columns.Count = Cells.Columns.Count RangeType = "Строка" Case Else RangeType = "Область" End Select End Function
В качестве аргумента (rng) функция получает объект Range - область ячеек и проверяет условия.
Функция выше работает только с единичным выделением. Но как быть если выделено сразу несколько областей? Правильно, нужно разобраться с каждой по отдельности.
Сначала определим, на самом ли деле у нас несколько областей. Для этого посчитаем их с помощью следующего кода:
' Количество выделенных областей AreasCount = Selection.Areas.Count
Ну а теперь организуем цикл, который будет проходить по всем областям. Заодно посчитаем количество ячеек, столбцов, строк. Определим является ли выделение смешанным (например выделен столбец и еще ограниченная область ячеек).
' Определим и запомним тип выделения первой области FirstRangeType = RangeType(Selection.Areas(1)) For Each Area In Selection.Areas ' Определяем тип каждой области и ведем подсчет (без перекрытия областей) CurreRangeType = RangeType(Area) Select Case CurreRangeType Case "Строка" RowsCount = RowsCount + Area.Rows.Count Case "Столбец" ColsCount = ColsCount + Area.Columns.Count Case "Лист" ColsCount = ColsCount + Area.Columns.Count RowsCount = RowsCount + Area.Rows.Count Case "Область" ColsCount = ColsCount + Area.Columns.Count RowsCount = RowsCount + Area.Rows.Count RangeAreasCount = RangeAreasCount + 1 End Select ' Количество ячеек CellsCount = CellsCount + Area.CountLarge ' Определяем является ли выделение смешанным (разный тип выделения) If CurreRangeType <> FirstRangeType Then DifferentType = True Next ' Информационное сообщение MsgBox "Множественное выделение: " & IIf(AreasCount > 0, "Да", "Нет") & vbCrLf & _ "Тип выделения: " & IIf(DifferentType, "Смешанный", "Однотипный") & vbCrLf & _ "Количество диапазонов: " & AreasCount & vbCrLf & _ "Количество столбцов: " & Format(ColsCount, "#,###") & vbCrLf & _ "Количество строк: " & Format(RowsCount, "#,###") & vbCrLf & _ "Областей ячеек: " & Format(RangeAreasCount, "#,###") & vbCrLf & _ "Количество ячеек: " & Format(CellsCount, "#,###") & vbCrLf & _ "", vbOKOnly Or vbInformation, "Определение типа выделенного диапазона"
Как вы видите организовать перебрать все выделенные области можно циклом For Each и для каждого диапазона вызывать функцию RangeType.
Данный пример можно скачать, нажав на кнопку в начале статьи.