Найти тему
VBA Excel с нуля

VBA Excel № 121. Несмежные диапазоны. Копируем

Оглавление

Как скопировать совершенно разные диапазоны? Если вы попытаетесь скопировать выделенные несмежные диапазоны, вы столкнетесь с проблемой, так как Excel не поддерживает такие операции. Попытка выполнить это действие приведет к появлению сообщения об ошибке: "Эта команда не применима для несвязных диапазонов".

В Excel обычно почти любые ограничения можно обойти, создав специальный макрос. Ниже приведен пример процедуры на VBA, которая позволяет копировать несколько выделенных областей в другое место.

-2
-3

📌 Скачать файл пример с макросом можно в конце статьи.

И как он работает? Давайте разберем.

  1. Сначала он проверяет, что что-то выделено на листе. Если нет, то макрос завершает свою работу.
  2. Затем он сохраняет каждый выделенный диапазон как отдельный объект Range в массиве ВыбранныеОбласти.
  3. После этого макрос определяет самую верхнюю строку и самую левую колонку среди всех выделенных диапазонов.
  4. Далее он запрашивает пользователя выбрать верхнюю левую ячейку для вставки скопированных данных.
  5. После того, как пользователь выбрал ячейку для вставки, макрос проверяет, что выбрана только одна верхняя левая ячейка.
  6. Наконец, для каждого выделенного диапазона макрос копирует его содержимое и вставляет в указанное место на листе с учетом смещения относительно верхней левой ячейки.
-4
-5
-6

Бонус! В скачанном примере в модуле2 найдёте этот же, но улучшенный макрос (КопированиеНесмежногоДиапазона2), который предупреждает пользователя, если происходит перезапись данных (т.е. если копирование происходит на уже занятый диапазон).

А именно:

1. Проверяет, что на листе что-то выделено. Если нет, то макрос прекращает свою работу.

2. Сохраняет каждый выделенный диапазон в массиве ВыбранныеОбласти.

3. Определяет верхнюю левую ячейку среди всех выделенных диапазонов.

4. Запрашивает у пользователя выбор верхней левой ячейки для вставки скопированных данных.

5. Проверяет, что выбрана только одна верхняя левая ячейка для вставки.

6. Проверяет, что диапазон вставки не содержит уже существующих данных.

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

8. Наконец, для каждого выделенного диапазона макрос копирует его содержимое и вставляет в указанное место на листе с учетом смещения относительно верхней левой ячейки.

СКАЧАТЬ ФАЙЛ ПРИМЕР