Найти в Дзене
VBA Excel с нуля

VBA Excel № 112.1 Выделяем диапазон и идентифицируем его тип.

Приветствую всех читателей! В данной статье мы рассмотрим методы выделения и идентификации различных типов диапазонов в Microsoft Excel. Как известно, в Excel существует несколько типов диапазонов: Если вы работаете с пользовательской процедурой VBA, предназначенной для обработки выделенного диапазона, определение его типа может представлять определенные трудности. Особенно если выделенный диапазон включает области разных типов, например, A1:A5 и D1:D5. Для выделения нескольких диапазонов следует удерживать клавишу <Ctrl> и нажимать по каждому из них. В случае множественного выделения, объект Range будет включать несмежные области. Для определения множественного выделения используется метод Areas, возвращающий коллекцию Areas. Эта коллекция представляет все диапазоны в множественном выделении. Ниже приведены краткая процедура ОписаниеОбластей (для определения типа выделенного диапазона и проверки наличия множественных областей) и функция ТипОбласти, которая возвращает текстовую строку,
Оглавление
Скриншот с моего ноутбука
Скриншот с моего ноутбука

Приветствую всех читателей! В данной статье мы рассмотрим методы выделения и идентификации различных типов диапазонов в Microsoft Excel. Как известно, в Excel существует несколько типов диапазонов:

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

Если вы работаете с пользовательской процедурой VBA, предназначенной для обработки выделенного диапазона, определение его типа может представлять определенные трудности. Особенно если выделенный диапазон включает области разных типов, например, A1:A5 и D1:D5. Для выделения нескольких диапазонов следует удерживать клавишу <Ctrl> и нажимать по каждому из них.

В случае множественного выделения, объект Range будет включать несмежные области. Для определения множественного выделения используется метод Areas, возвращающий коллекцию Areas. Эта коллекция представляет все диапазоны в множественном выделении.

Ниже приведены краткая процедура ОписаниеОбластей (для определения типа выделенного диапазона и проверки наличия множественных областей) и функция ТипОбласти, которая возвращает текстовую строку, описывающую тип выделенного диапазона.

В следующей статье разберем полный код процедуры "ОписаниеОбластей".

Скриншот с моего ноутбука
Скриншот с моего ноутбука

И сама функция

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Функция ТипОбласти принимает объект Range в качестве аргумента и возвращает одну из пяти строк, описывающих тип данной области: Ячейка, Рабочий лист, Столбец, Строка, Блок. Функция использует конструкцию Select Case для идентификации типа области на основе ее свойств.

Попробуем её (функцию) разобрать:

Private Function ТипОбласти(RangeArea As Range) As String: Объявление функции ТипОбласти с аргументом RangeArea, который представляет собой объект диапазона, и возвращаемым значением типа String.

  • Select Case True: Начало блока Select Case, где будет производиться выбор в зависимости от различных условий.
  • Case RangeArea.Cells.CountLarge = 1: Если количество ячеек в переданной области равно 1, то функция возвращает строку "Ячейка".
  • ТипОбласти = "Ячейка": Присваивание результату функции значения "Ячейка", если выполнено условие из предыдущей строки.
  • Case RangeArea.CountLarge = Cells.CountLarge: Если количество элементов в переданной области (все ячейки) равно общему числу ячеек на рабочем листе, то функция возвращает строку "Рабочий лист".
  • ТипОбласти = "Рабочий лист": Присваивание результату функции значения "Рабочий лист", если выполнено условие из предыдущей строки.
  • Case RangeArea.Rows.Count= Cells.Rows.Count: Если количество строк в переданной области равно общему числу строк на рабочем листе, то функция возвращает строку "Столбец".
  • ТипОбласти = "Столбец": Присваивание результату функции значения "Столбец", если выполнено условие из предыдущей строки.
  • Case RangeArea.Columns.Count= Cells.Columns.Count: Если количество столбцов в переданной области равно общему числу столбцов на рабочем листе, то функция возвращает строку "Строка".
  • ТипОбласти = "Строка": Присваивание результату функции значения "Строка", если выполнено условие из предыдущей строки.
  • Case Else: В случае, если ни одно из вышеперечисленных условий не выполнено, функция возвращает строку "Блок".
  • ТипОбласти = "Блок": Присваивание результату функции значения "Блок" в случае, если выполнено условие Case Else.
  • End Select: Завершение блока Select Case.
  • End Function: Завершение функции.

То есть например:

  • Если область состоит из одной ячейки, функция возвращает "Ячейка";
  • Если количество ячеек в области равно количеству ячеек на рабочем листе, то функция возвращает "Рабочий лист";
  • Если количество строк в области равно количеству строк на рабочем листе, функция возвращает "Столбец";
  • Если количество столбцов в области равно количеству столбцов на рабочем листе, функция возвращает "Строка";
  • В противном случае функция возвращает "Блок".

И да, вы наверно заметили, что для подсчета количества ячеек использовано свойство CountLarge, так как количество выделенных ячеек может превышать предел для свойства Count.

Выглядеть это будет примерно так:

Скриншот с моего ноутбука
Скриншот с моего ноутбука
Дополнительный интересный факт: Excel поддерживает создание идентичных множественных выделений. Например, удерживая клавишу <Ctrl> и нажимая ПКМ (правой клавишей мыши) пять раз на ячейке E10, выделение будет содержать пять идентичных объектов. Это также отражается в процедуре ОписаниеОбластей (рассмотрим в следующей статье), которая различает идентичные ячейки. В Excel перекрывающиеся выделенные диапазоны выделяются более темными оттенками.