VBA Excel. Копирование данных с одного листа на другой

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

    Условие задачи по копированию данных

    На одном листе расположен список повторяющихся городов с информацией о предприятиях общепита:

    Исходная таблица задания №1

    Исходная таблица задания №1

    Необходимо данные по каждому городу перенести в одну строку на другом листе (таблица обрезана справа):

    Часть результирующего списка задания №1

    Часть результирующего списка задания №1

    Решение копированием с листа на лист

    Это решение значительно проще, чем с использованием массивов, но более медленное. При больших объемах информации обработка может длиться достаточно долго. Решение достигается путем присваивания значений ячеек из таблицы первого листа ячейкам второго листа.

    Переменные:

    • n1 – количество строк в исходной таблице;
    • n2 – номер столбца текущей ячейки исходной таблицы, к которой обращается цикл;
    • n3 – номер строки текущей ячейки на втором листе;
    • n4 – номер столбца текущей ячейки на втором листе;
    • i1 – счетчик цикла For… Next;
    • gorod – переменная с наименованием города, предназначенная для контроля за сменой текущего города, который обрабатывается циклом.

    Решение с использованием массивов

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

    Подпрограммы Kopirovanie и Vstavka используются в цикле For... Next процедуры Resheniye2 по два раза, поэтому их коды вынесены за пределы процедуры Resheniye2 и вызываются по мере необходимости.

    Переменные:

    • massiv1 – его элементам присваиваются значения ячеек исходной таблицы;
    • massiv2 – одномерный массив, заполняемый данными из переменной txt1;
    • massiv3 – двумерный массив, заполняемый данными из одномерного массива massiv2 и используемый для вставки очередной строки на второй лист;
    • txt1 – сюда копируются через разделитель значения элементов массива massiv1, предназначенные для заполнения очередной строки на втором листе;
    • n1 – количество строк в исходной таблице;
    • n2 – количество столбцов в исходной таблице;
    • n3 – номер текущей строки на втором листе;
    • n4 – количество столбцов текущей строки на втором листе (соответствует количеству элементов массива massiv2);
    • i1, i2, i3 – счетчики цикла For… Next;
    • gorod – переменная с наименованием города, предназначенная для контроля за сменой текущего города, который обрабатывается циклом.

    Переменные, использующиеся более чем в одной процедуре, объявлены как глобальные в разделе Declarations программного модуля.

    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

    3 комментария для “VBA Excel. Копирование данных с одного листа на другой”

    1. Классно! Авторам — уважение! Толково, без соплей, со знанием дела.
      Можете подсказать синтаксис такой проблемы: таблица 10 строк, 8 столбцов, если первая ячейка не пустая, скопировать на другой лист этой книги, а лучше — в отдельную книгу всю строку таблицы. Потом то же самое со строкой ниже, и так до последней. Потом пустые строки надо скрыть.
      Это сложно?
      Заранее спасибо за ответ.

      1. Евгений

        Привет, Илья!
        Для диапазона A1:H10:

        1. Здравствуйте, Евгений! Огромное Вам спасибо! Потраченное время и желание помочь дорогого стОит, это большая редкость в наше время, поверьте. Ваш макрос — не совсем то, что мне нужно (например, новую книгу открывать не нужно, она уже есть, нужно просто на неё (и нужный лист) сослаться). Месторасположение ячеек в книгах не совпадает, строки тоже (27-я строка первой книги вставляется в 6-ю второй, т.е., например D27 в E6). И самое главное — вторая книга заполняется с нарастающим итогом. Т.е с первой книги берутся данные, вносятся во вторую, потом первая заполняется по новой, эти данные вносятся во вторую, но уже ниже и т.д.
          Но, в любом случае, огромное спасибо, Вы дали направление, куда двигаться, буду думать ):

    Добавить комментарий

    Ваш комментарий будет опубликован после прохождения обязательной модерации. Исходящие ссылки не допускаются. Время модерации составит от нескольких минут до нескольких часов в зависимости от времени суток и занятости модератора.