Vba excel копирование столбца на другой лист
У меня есть 99 столбцов в одной таблице под названием tbl_raw . Мне нужно скопировать 96 из этих столбцов в другую таблицу с точно такими же именами заголовков, но они расположены в другом порядке. Каков наиболее эффективный способ сделать это?
Единственный способ, который я знал, был:
Однако это заняло бы много кода (96 * 2 = 192 строки), и я не был уверен, что есть более эффективный способ сделать это.
Мы будем очень признательны за любые рекомендации.
Переберите ListObject("tbl_processed").HeaderRowRange, чтобы собрать каждый соответствующий столбец в ListObject("tbl_raw").HeaderRowRange. Неясно, добавляете ли вы или заменяете данные в tbl_processed.
Я заменяю данные. Первое, что я делаю, это очищаю содержимое таблицы, за исключением первой строки данных, так как я могу добавить несколько столбцов с некоторыми формулами.
Я не уверен, как достичь вашего решения. Я не лучший в VBA, но мне удалось создать несколько сценариев и учиться на собственном опыте. Будет ли это что-то вроде: `Если tbl_raw.HeaderRowRange = tbl_processed.HeaderRowRange ТО. Я точно не знаю, как к этому подойти динамически.
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно.
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей.
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то.
Ответы 3
Вот простой пример копирования всех столбцов, кроме некоторых, из одной таблицы в другую:
Думаю, я следую этому. Я попытался выполнить этот код в своем скрипте, но не смог заставить его работать. Я предполагаю, что Application.Match проверяет имя столбца в таблице 1. Однако я не вижу, где он сопоставляется с tbl2. Я также не понимаю функцию «Массив». Dim h As ListColumn For Each h In tbl_raw.ListColumns If IsError(Application.Match(h.Name, Array("col10", "col11"), 0)) Then h.DataBodyRange.Copy tbl_imd.ListColumns(h.Name).DataBodyRange(1) End If Next h Спасибо за ответ и буду признательна за любую дальнейшую помощь!
Array() просто создает массив из аргументов — он используется, поскольку Match нуждается в массиве для поиска. Для соответствия таблице 2 предполагается, что имена столбцов одинаковы, и tbl2.ListColumns(h.Name).DataBodyRange(1) дает вам место назначения вставки в качестве первой ячейки в столбце Table2 с заголовком h.Name
Я думаю, оператор хочет скопировать столбцы, в которых совпадают заголовки, а не те, которые не совпадают. В вашем массиве поиска также должно быть 96 элементов, чтобы его было проще использовать tbl1.HeaderRowRange .
Думаю, я понял, о чем спрашивал ОП, и моему массиву нужны только три заголовка «не копировать» …
Копирует лист в другое расположение в текущей книге или новой книге.
Синтаксис
выражения. Copy (Before, After)
выражение Переменная, представляюная объект "Таблица ".
Параметры
Имя | Обязательный или необязательный | Тип данных | Описание |
---|---|---|---|
Before | Необязательный | Variant | Лист, перед которым будет размещен скопирован лист. Вы не можете указать Перед , если указать После. |
After | Необязательный | Variant | Лист, после которого будет размещен скопирован лист. Вы не можете указать После, если вы указываете Раньше. |
Примечания
Если вы не указываете ни до, ни после, Microsoft Excel создает новую книгу, которая содержит скопированные объекты таблицы. Недавно созданная книга содержит свойство Application.ActiveWorkbook и содержит одну таблицу. В единой таблице сохраняются свойства name и CodeName исходных таблиц. Если скопированная таблица держала лист кода листа в проекте VBA, то это также осуществляется в новой книге.
Выбор массива из нескольких листов можно скопировать на новый пустой объект книги аналогичным образом.
Источник и назначение должны быть в одном Excel. Пример приложения, в противном случае он вызывает ошибку времени запуска '1004': Нет такого интерфейса поддерживается, Sheet1.Copy objWb.Sheets(1) если что-то подобное было использовано, или ошибка времени запуска '1004': Метод копирования класса Worksheet не удалось, ThisWorkbook.Worksheets("Sheet1").Copy objWb.Sheets(1) если что-то подобное было использовано.
Пример
В этом примере копируется Sheet1, размещая копию после Sheet3.
В этом примере сначала скопируется sheet1 в новую пустую книгу, а затем сохраняется и закрывается новая книга.
В этом примере листы Sheet1, Sheet2 и Sheet4 копируется в новую пустую книгу, а затем сохраняет и закрывает новую книгу.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
На одном листе расположен список повторяющихся городов с информацией о предприятиях общепита:
Исходная таблица задания №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 программного модуля.
Range.Cut – это метод, который вырезает объект Range (диапазон ячеек) в буфер обмена или перемещает его в указанное место на рабочем листе.
Синтаксис
Параметры
Параметры | Описание |
---|---|
Destination | Необязательный параметр. Диапазон ячеек рабочего листа, в который будет вставлен (перемещен) вырезанный объект Range (достаточно указать верхнюю левую ячейку диапазона). Если этот параметр опущен, объект вырезается в буфер обмена. |
Для вставки на рабочий лист диапазона ячеек, вырезанного в буфер обмена методом Range.Cut, следует использовать метод Worksheet.Paste.
Метод Range.Copy
Range.Copy – это метод, который копирует объект Range (диапазон ячеек) в буфер обмена или в указанное место на рабочем листе.
Синтаксис
Параметры
Параметры | Описание |
---|---|
Destination | Необязательный параметр. Диапазон ячеек рабочего листа, в который будет вставлен скопированный объект Range (достаточно указать верхнюю левую ячейку диапазона). Если этот параметр опущен, объект копируется в буфер обмена. |
Метод Worksheet.Paste
Синтаксис
Метод Worksheet.Paste работает как с диапазонами ячеек, вырезанными в буфер обмена методом Range.Cut, так и скопированными в буфер обмена методом Range.Copy.
Параметры
Параметры | Описание |
---|---|
Destination | Необязательный параметр. Диапазон (ячейка), указывающий место вставки содержимого буфера обмена. Если этот параметр не указан, используется текущий выделенный объект. |
Link | Необязательный параметр. Булево значение, которое указывает, устанавливать ли ссылку на источник вставленных данных: True – устанавливать, False – не устанавливать (значение по умолчанию). |
В выражении с методом Worksheet.Paste можно указать только один из параметров: или Destination, или Link.
Для вставки из буфера обмена отдельных компонентов скопированных ячеек (значения, форматы, примечания и т.д.), а также для проведения транспонирования и вычислений, используйте метод Range.PasteSpecial (специальная вставка).
Примеры
Вырезание и вставка диапазона одной строкой (перемещение):
Вырезание ячеек в буфер обмена и вставка методом ActiveSheet.Paste:
Копирование и вставка диапазона одной строкой:
Копирование ячеек в буфер обмена и вставка методом ActiveSheet.Paste:
Копирование одной ячейки и вставка ее данных во все ячейки заданного диапазона:
18 комментариев для “VBA Excel. Вырезание, копирование и вставка ячеек (диапазонов)”
Странно, что не рассмотрено копирование ячеек, которые Cells.
Например, следующая строка копирует ячейку A1 в B2
а эта делает тоже самое, но демонстрирует,
как можно добавить размер и смещение:
Cells ( 1 , "A" ) . Resize ( 1 , 1 ) . Offset ( 0 , 0 ) . Copy Cells ( 2 , "B" ) . Resize ( 1 , 1 ) . Offset ( 0 , 0 )
Здравствуйте!
Скажите, как можно копировать на Лист 1, а вставить на Лист 2 диапазон ячеек целиком, либо отсортированный по 1 признаку диапазон(например по какому-то определенному значению, скажем, числу «500» в одном столбце Листа 1)?
Привет, Максим!
Вот пример сортировки таблицы по значению 500 в первом столбце на "Лист6" и копирования диапазона с "Лист6" на "Лист4" :
Спасибо большое, только я, наверно, неправильно описал ситуацию.
Сперва из эталонной таблицы Лист 1 копируем весь список на существующий Лист4.
Затем, пропускаем шапку, и, начиная со строки7, уже на Лист4 ищем строку, у которой в столбце 5 стоит число 500.
Вырезаем эту строку и вставляем на позицию строки 7. т.е первая после шапки.
Ищем следующую строку — вырезаем, потом вставляем на позицию строки 7+1=8 и т.д.
В итоге оставим только те строки, у которых в столбце 5 стоит число «500», остальные удаляются строки.
(пробовал менять местами строки в предыдущем коде, ошибок нет, копирует, переходит на лист 4, но строки на нем не удаляет, циклы пошагово проходят, но ничего не изменяется.)
Я пытаюсь скопировать определенный столбец с одного рабочего листа на другой, но когда я применяю свой код, я не получаю ни ошибок, ни результатов. Я получаю чистую бумагу. Я применил эту методологию при копировании определенной строки, и она была идеально скопирована на другой лист.
Это касается успешной попытки скопировать строку. Код работает просто отлично:
Этот небольшой фрагмент кода — неудачная попытка скопировать столбец на другой лист.
Что пошло не так с вашим кодом? Есть ошибки? • Обратите внимание, что Sheets(NSheet).Cells(2, 2).PasteSpecial всегда будет вставлять в одну и ту же ячейку B2 при каждой итерации цикла For j = 2 To LColumn , поэтому вы вставляете снова и снова в одну и ту же ячейку, перезаписывая то, что вы вставляли ранее.
Дело в том, что ничего не копируется. Tabelle5 полностью пуст. Wehn я пробую код, но со строкой. Я получаю правильные скопированные ячейки. Я не получаю никаких ошибок. просто пустой рабочий лист.
Пройдитесь по коду шаг за шагом, используя F8. Посмотрите, какие шаги выполняются, и проверьте значения переменных, чтобы выяснить, что именно идет не так. • Обратите внимание, что вы не должны использовать As Integer , вместо этого используйте As Long . В Excel больше строк, чем может обработать Integer . Также ваши имена листов должны быть OSheet As String . Никогда не используйте Variant , если есть лучшая возможность. Variant всегда худший выбор.
Я новичок в vba. Я работаю над ним 2-й день. У меня минимальные знания об этом, но я пытаюсь научиться. Я обновил OSheet as String , но все еще пусто. Нет результатов.
Не беспокойтесь, мы все с чего-то начинали (на самом деле это неплохо для 2ⁿᵈ дня). Вам просто нужно научиться отлаживать свой код: шаг за шагом выполняйте код, используя F8. Excel Easy — отладка
Я не получаю ошибки. Извините, может быть, я не уверен, чего ожидать от отладки. Я буду смотреть в него. Большое спасибо за вашу помощь.
Ошибки легко найти, потому что они появляются. Если ошибки нет, вам нужно проверять значения ваших переменных на каждом шаге (это то, что вы делаете при отладке). Поэтому проверьте значения переменных и убедитесь, что они соответствуют вашим ожиданиям. Вы также увидите, какие утверждения If верны и так далее. Таким образом, вы видите, как работает ваш код. Попытайтесь выяснить, где что-то идет не так или где переменные показывают другое значение, чем ожидалось.
Большое спасибо за вашу помощь. Я узнал больше о том, как отлаживать свой код. Я должен сказать, такой мощный инструмент. Я работал с Fortran для решения числовых проблем, и ему этого не хватает.
Читайте также: