Логотип
Надстройка VBA-Excel
Спасибо Алексею за надстройку, надстройка очень хорошая, но хотелось бы дальнейшего расширения функционала для дальнейшего уменьшения рутинной работы. Еще раз спасибо!
Сергей

Определение типа выделенного диапазона

Если вы хотите писать качественный код, то необходимо учитывать все возможные действия ваших пользователей. Поэтому если обрабатываете выделенный диапазон, то всегда проверяйте его тип.

 

Скачать файл!

Создан:    01.05.2016

 Скачан:    37

Определение типа выделенного диапазона

Какие типы диапазонов имеются в Excel

Вы можете выделить диапазоны следующих типов:

  • одна отдельная ячейка;
  • несколько смежных между собой ячеек;
  • один или несколько столбцов;
  • одну или несколько строк;
  • рабочий лист целиком;
  • также можете выделить комбинацию типов (множественное выделение).


Когда вы обрабатываете выделенный диапазон, то должны быть уверены, что он нужного типа иначе не исключено, что макрос будет работать не так как хотелось. 

Перед тем как обрабатывать выделенный диапазон ячеек необходимо убедиться, а на сомом ли деле это диапазон ячеек, а не график или кнопка. Следующим образом можно предупредить пользователя, что выделен совсем не диапазон.

    ' Проверяем выделен ли диапазон
    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 - область ячеек и проверяет условия.

  1. Если диапазон rng содержит 1 ячейку - возвращает значение "Ячейка".
  2. Если количество ячеек в диапазоне rng совпадает с количеством ячеек на листе - значит выделен лист целиком.
  3. Если количество строк в диапазоне совпадает с количеством строк на листе - выделен столбец целиком.
  4. Аналогично определяется, что выделена строка.
  5. Если ничего из вышеперечисленного не подошло, значит выделена ограниченная область ячеек.

Множественное выделение

Функция выше работает только с единичным выделением. Но как быть если выделено сразу несколько областей? Правильно, нужно разобраться с каждой по отдельности.

Сначала определим, на самом ли деле у нас несколько областей. Для этого посчитаем их с помощью следующего кода:

    ' Количество выделенных областей
    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.

Данный пример можно скачать, нажав на кнопку в начале статьи.

Комментарии:

comments powered by Disqus