Vba excel копировать таблицу

Содержание

  1. Sheets.Copy method (Excel)
  2. Syntax
  3. Parameters
  4. Remarks
  5. Example
  6. Support and feedback
  7. Метод Worksheet.Copy (Excel)
  8. Синтаксис
  9. Параметры
  10. Замечания
  11. Пример
  12. Поддержка и обратная связь
  13. VBA Excel. Копирование данных с одного листа на другой
  14. Условие задачи по копированию данных
  15. Решение копированием с листа на лист
  16. Решение с использованием массивов
  17. 6 комментариев для “VBA Excel. Копирование данных с одного листа на другой”
  18. VBA Excel. Вырезание, копирование и вставка ячеек (диапазонов)
  19. Метод Range.Cut
  20. Синтаксис
  21. Параметры
  22. Метод Range.Copy
  23. Синтаксис
  24. Параметры
  25. Метод Worksheet.Paste
  26. Синтаксис
  27. Параметры
  28. Примеры
  29. 43 комментария для “VBA Excel. Вырезание, копирование и вставка ячеек (диапазонов)”
  30. Sheets.Copy method (Excel)
  31. Syntax
  32. Parameters
  33. Remarks
  34. Example
  35. Support and feedback

Sheets.Copy method (Excel)

Copies the sheet to another location in the workbook.

Syntax

expression.Copy (Before, After)

expression A variable that represents a Sheets object.

Parameters

Name Required/Optional Data type Description
Before Optional Variant The sheet before which the copied sheet will be placed. You cannot specify Before if you specify After.
After Optional Variant The sheet after which the copied sheet will be placed. You cannot specify After if you specify Before.

If you don’t specify either Before or After, Microsoft Excel creates a new workbook that contains the copied sheet.

Example

This example copies Sheet1, placing the copy after Sheet3.

Support and feedback

Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Источник

Метод Worksheet.Copy (Excel)

Копирует лист в другое место в текущей или новой книге.

Синтаксис

expression. Копирование (до, после)

Выражение Переменная, представляющая объект Worksheet .

Параметры

Имя Обязательный или необязательный Тип данных Описание
Before Необязательный Variant Лист, перед которым будет размещен скопированный лист. Невозможно указать параметр Before , если указать After.
After Необязательный Variant Лист, после которого будет размещен скопированный лист. Вы не можете указать After , если укажем значение До.

Замечания

Если не указать значение «До» или «После», Microsoft Excel создает новую книгу, содержащую скопированный объект Worksheet . Только что созданная книга содержит свойство Application.ActiveWorkbook и содержит один лист. На одном листе сохраняются свойства Name и CodeName исходного листа. Если скопированный лист содержал лист кода листа в проекте VBA, он также переносится в новую книгу.

Выбор массива из нескольких листов можно скопировать в новый пустой объект Workbook аналогичным образом.

Источник и назначение должны находиться в одном экземпляре Excel.Application. В противном случае возникает ошибка среды выполнения 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 и обратная связь.

Источник

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

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

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

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

Исходная таблица задания №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 программного модуля.

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

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

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

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

Добрый день, Евгений!
Существует способ автоматической передачи (копирования) данных из одного файла эксель в другой методом =…
А метод автоматической передачи (копирования) цвета имеется?
Подскажите пожалуйста!

Источник

VBA Excel. Вырезание, копирование и вставка ячеек (диапазонов)

Вырезание, перемещение, копирование и вставка ячеек (диапазонов) в VBA Excel. Методы Cut, Copy и PasteSpecial объекта Range, метод Paste объекта Worksheet.

Метод Range.Cut

Синтаксис

Параметры

Параметры Описание
Destination Необязательный параметр. Диапазон ячеек рабочего листа, в который будет вставлен (перемещен) вырезанный объект Range (достаточно указать верхнюю левую ячейку диапазона). Если этот параметр опущен, объект вырезается в буфер обмена.

Для вставки на рабочий лист диапазона ячеек, вырезанного в буфер обмена методом Range.Cut, следует использовать метод Worksheet.Paste.

Метод Range.Copy

Синтаксис

Параметры

Параметры Описание
Destination Необязательный параметр. Диапазон ячеек рабочего листа, в который будет вставлен скопированный объект Range (достаточно указать верхнюю левую ячейку диапазона). Если этот параметр опущен, объект копируется в буфер обмена.

Метод Worksheet.Paste

Синтаксис

Метод Worksheet.Paste работает как с диапазонами ячеек, вырезанными в буфер обмена методом Range.Cut, так и скопированными в буфер обмена методом Range.Copy.

Параметры

Параметры Описание
Destination Необязательный параметр. Диапазон (ячейка), указывающий место вставки содержимого буфера обмена. Если этот параметр не указан, используется текущий выделенный объект.
Link Необязательный параметр. Булево значение, которое указывает, устанавливать ли ссылку на источник вставленных данных: True – устанавливать, False – не устанавливать (значение по умолчанию).

В выражении с методом Worksheet.Paste можно указать только один из параметров: или Destination, или Link.

Для вставки из буфера обмена отдельных компонентов скопированных ячеек (значения, форматы, примечания и т.д.), а также для проведения транспонирования и вычислений, используйте метод Range.PasteSpecial (специальная вставка).

Примеры

Вырезание и вставка диапазона одной строкой (перемещение):

Вырезание ячеек в буфер обмена и вставка методом ActiveSheet.Paste:

Копирование и вставка диапазона одной строкой:

Копирование ячеек в буфер обмена и вставка методом ActiveSheet.Paste:

Копирование одной ячейки и вставка ее данных во все ячейки заданного диапазона:

43 комментария для “VBA Excel. Вырезание, копирование и вставка ячеек (диапазонов)”

Странно, что не рассмотрено копирование ячеек, которые Cells.
Например, следующая строка копирует ячейку A1 в B2

а эта делает тоже самое, но демонстрирует,
как можно добавить размер и смещение:

Здравствуйте!
Скажите, как можно копировать на Лист 1, а вставить на Лист 2 диапазон ячеек целиком, либо отсортированный по 1 признаку диапазон(например по какому-то определенному значению, скажем, числу «500» в одном столбце Листа 1)?

Привет, Максим!
Вот пример сортировки таблицы по значению 500 в первом столбце на «Лист6» и копирования диапазона с «Лист6» на «Лист4» :

Спасибо большое, только я, наверно, неправильно описал ситуацию.
Сперва из эталонной таблицы Лист 1 копируем весь список на существующий Лист4.
Затем, пропускаем шапку, и, начиная со строки7, уже на Лист4 ищем строку, у которой в столбце 5 стоит число 500.
Вырезаем эту строку и вставляем на позицию строки 7. т.е первая после шапки.
Ищем следующую строку — вырезаем, потом вставляем на позицию строки 7+1=8 и т.д.
В итоге оставим только те строки, у которых в столбце 5 стоит число «500», остальные удаляются строки.

(пробовал менять местами строки в предыдущем коде, ошибок нет, копирует, переходит на лист 4, но строки на нем не удаляет, циклы пошагово проходят, но ничего не изменяется.)

Источник

Sheets.Copy method (Excel)

Copies the sheet to another location in the workbook.

Syntax

expression.Copy (Before, After)

expression A variable that represents a Sheets object.

Parameters

Name Required/Optional Data type Description
Before Optional Variant The sheet before which the copied sheet will be placed. You cannot specify Before if you specify After.
After Optional Variant The sheet after which the copied sheet will be placed. You cannot specify After if you specify Before.

If you don’t specify either Before or After, Microsoft Excel creates a new workbook that contains the copied sheet.

Example

This example copies Sheet1, placing the copy after Sheet3.

Support and feedback

Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Источник

 

tod2020

Пользователь

Сообщений: 261
Регистрация: 10.05.2017

Есть умная таблица Table1
Как скопировать и вставить эту умную таблицу в начальную точку Cells (10,5) и назначить ей имя MyTable1

Изменено: tod202024.06.2017 23:10:31

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#2

24.06.2017 22:52:49

Цитата
2.3. Приложите файл(ы) с примером (общим весом не более 100 Кб) в реальной структуре и форматах данных того, что есть сейчас и того, что хотелось бы на выходе.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

tod2020

Пользователь

Сообщений: 261
Регистрация: 10.05.2017

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#4

24.06.2017 23:06:01

Код
    Range("Table1[#All]").Copy Range("E10")
    Range("E10").ListObject.Name = "MyTable1"

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

tod2020

Пользователь

Сообщений: 261
Регистрация: 10.05.2017

спасибо
всё работает и понятно

Изменено: tod202024.06.2017 23:21:08

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#6

24.06.2017 23:18:02

Цитата
tod2020 написал: я догадываюсь

Вот, и ладненько. А на остальное я пойтить не могу.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

tod2020

Пользователь

Сообщений: 261
Регистрация: 10.05.2017

JayBhagavan, Как в Range(«E10») задать цифрами координату в виде (10,5) ?

Изменено: tod202026.06.2017 19:33:17

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

 

tod2020

Пользователь

Сообщений: 261
Регистрация: 10.05.2017

#9

26.06.2017 19:58:00

Код
Range (Cells (10,5)) 

так нельзя, потомучто миниму вторая ячейка нужна

Код
Range("Table1[#All]").Copy Cells (10,5) 

Выдает ошибку при копирован умной таблицы в эту ячейку

Изменено: tod202026.06.2017 19:58:37

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#10

26.06.2017 20:06:34

Цитата
tod2020 написал:
так нельзя

А Вам так никто и не предлагал :)

Цитата
tod2020 написал:
Выдает ошибку

Может потому что пробел перед скобкой лишний? Что за ошибка-то?

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#11

26.06.2017 20:09:03

Цитата
tod2020 написал:
так нельзя, потомучто миниму вторая ячейка нужна

А вот так, как Вы написали (с Range) действительно нельзя.
Предложенный мной вариант Cells(10, 5) идентичен записи Range(«E10»)
А вот про «вторую ячейку» не понял.

 

tod2020

Пользователь

Сообщений: 261
Регистрация: 10.05.2017

#12

26.06.2017 20:26:16

Да какого ?!!! Я же так делал и не принимал и ошибку выдавал. что за фигня

Код
Range("Table1[#All]").Copy Cells (10,5)
Cells (10,5).ListObject.Name = "MyTable1"

КОРОЧЕ: ТАК ТОЖЕ РАБОТАЕТ

Изменено: tod202026.06.2017 20:26:46

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Короче. У меня работает. Что там не работает у Вас — непонятно, ведь текст ошибки Вам лень написать. И пробел перед скобками(после Cells) как был — так и остался. У Вас и в коде так же или Вы специально для нас его вставляете в код?

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

tod2020

Пользователь

Сообщений: 261
Регистрация: 10.05.2017

Я прописал в редакторе
выполнил кода
всё благополучно произошло

и ровно это благополучие скопировал из редактора
а пробелы он сам вклинивает

Изменено: tod202026.06.2017 20:41:30

 

tod2020

Пользователь

Сообщений: 261
Регистрация: 10.05.2017

 

tod2020

Пользователь

Сообщений: 261
Регистрация: 10.05.2017

#16

27.06.2017 17:32:10

Решил в Range задать вместо конкретного имени переменную с именем умной таблицы

Код
Dim TableNAME As String
TableNAME = "Table1"
Range(TableNAME[#All]).Copy Range("E10")

но выдает ошибку из-за того что в скобках Range не верно сформулировано
Как правильно прописать?

Изменено: tod202027.06.2017 17:32:38

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#17

27.06.2017 17:41:55

Код
Range(TableNAME).ListObject.Range.Copy

ну, или

Код
Range(TableNAME & "[#All]").Copy Range("E10")

Изменено: RAN27.06.2017 17:45:28

Sub ExcelRangeToWord()

‘PURPOSE: Copy/Paste An Excel Table Into a New Word Document
‘NOTE: Must have Word Object Library Active in Order to Run _
  (VBE > Tools > References > Microsoft Word 12.0 Object Library)

‘SOURCE: www.TheSpreadsheetGuru.com

Dim tbl As Excel.Range
Dim WordApp As Word.Application
Dim myDoc As Word.Document
Dim WordTable As Word.Table

‘Optimize Code
  Application.ScreenUpdating = False
  Application.EnableEvents = False

‘Copy Range from Excel
  Set tbl = ThisWorkbook.Worksheets(Sheet1.Name).ListObjects(«Table1»).Range

‘Create an Instance of MS Word
  On Error Resume Next

        ‘Is MS Word already opened?
      Set WordApp = GetObject(class:=»Word.Application»)

        ‘Clear the error between errors
      Err.Clear

    ‘If MS Word is not already open then open MS Word
      If WordApp Is Nothing Then Set WordApp = CreateObject(class:=»Word.Application»)

        ‘Handle if the Word Application is not found
      If Err.Number = 429 Then
        MsgBox «Microsoft Word could not be found, aborting.»
        GoTo EndRoutine
      End If

  On Error GoTo 0

  ‘Make MS Word Visible and Active
  WordApp.Visible = True
  WordApp.Activate

    ‘Create a New Document
  Set myDoc = WordApp.Documents.Add

  ‘Copy Excel Table Range
  tbl.Copy

‘Paste Table into MS Word
  myDoc.Paragraphs(1).Range.PasteExcelTable _
    LinkedToExcel:=False, _
    WordFormatting:=False, _
    RTF:=False

‘Autofit Table so it fits inside Word Document
  Set WordTable = myDoc.Tables(1)
  WordTable.AutoFitBehavior (wdAutoFitWindow)

   EndRoutine:
‘Optimize Code
  Application.ScreenUpdating = True
  Application.EnableEvents = True

‘Clear The Clipboard
  Application.CutCopyMode = False

End Sub

In this part of the code we are determining if Microsoft Word is open or not.  If Word is already open, we can set a variable equal to the entire program by using GetObject.  If MS Word is not currently running we can use CreateObject to run an instance of Word and then set a variable equal to that specific instance of MS Word.

When using CreateObject, the target application will start running but it is not visible on screen.  Therefore we need to turn the Visible setting on (equal to true).  Also, VBA with Word is a little bit different than with Excel in that it is much more dependent on its window showing on screen.  Therefore a second command must be written to Activate Microsoft Word.

Copy From Excel, Paste Onto Document

Now that you have a new document created, you can command Excel to paste your table into MS Word.  Near the beginning of the code, there was a line that allowed you to specify the exact table you wanted to copy.  The variable tbl was used to remember this table range and to allow you to reference the range later on in the code.  

Guru Tip: It is a good idea to place code that may need to be manually changed at some point in the future near the beginning of the subroutine.  This prevents you from having to scroll through your code and pinpoint the exact place where you spelled out which range you wanted to copy or which worksheet you wanted to pull data from.  This can save you a bunch of time and prevent confusion!

Word has a special method called PasteExcelTable, which (as you can guess) allows you paste in an Excel table.  There are three variables you can tweak to get you table looking and functioning just the way you want.

  • LinkedToExcel True links the pasted table to the original Excel file so that changes made to the Excel file are reflected in Microsoft Word.

  • WordFormatting True formats the table using the formatting in the Word document.  False formats the table according to the original Excel file.

  • RTF True pastes the Excel table using Rich Text Format (RTF).  False pastes the Excel table as HTML.

Now for the last step!  Depending on how large your table is, it may be spilling outside of your document page.  In order to prevent this from happening you can go ahead and use AutoFitBehavior to resize the table to fit perfectly inside your Word document.

About The Author

Hey there! I’m Chris and I run TheSpreadsheetGuru website in my spare time. By day, I’m actually a finance professional who relies on Microsoft Excel quite heavily in the corporate world. I love taking the things I learn in the “real world” and sharing them with everyone here on this site so that you too can become a spreadsheet guru at your company.

Through my years in the corporate world, I’ve been able to pick up on opportunities to make working with Excel better and have built a variety of Excel add-ins, from inserting tickmark symbols to automating copy/pasting from Excel to PowerPoint. If you’d like to keep up to date with the latest Excel news and directly get emailed the most meaningful Excel tips I’ve learned over the years, you can sign up for my free newsletters. I hope I was able to provide you with some value today and I hope to see you back here soon!

— Chris
Founder, TheSpreadsheetGuru.com

Вырезание, перемещение, копирование и вставка ячеек (диапазонов) в VBA Excel. Методы Cut, Copy и PasteSpecial объекта Range, метод Paste объекта Worksheet.

Метод Range.Cut

Range.Cut – это метод, который вырезает объект Range (диапазон ячеек) в буфер обмена или перемещает его в указанное место на рабочем листе.

Синтаксис

Параметры

Параметры Описание
Destination Необязательный параметр. Диапазон ячеек рабочего листа, в который будет вставлен (перемещен) вырезанный объект Range (достаточно указать верхнюю левую ячейку диапазона). Если этот параметр опущен, объект вырезается в буфер обмена.

Для вставки на рабочий лист диапазона ячеек, вырезанного в буфер обмена методом Range.Cut, следует использовать метод Worksheet.Paste.

Метод Range.Copy

Range.Copy – это метод, который копирует объект Range (диапазон ячеек) в буфер обмена или в указанное место на рабочем листе.

Синтаксис

Параметры

Параметры Описание
Destination Необязательный параметр. Диапазон ячеек рабочего листа, в который будет вставлен скопированный объект Range (достаточно указать верхнюю левую ячейку диапазона). Если этот параметр опущен, объект копируется в буфер обмена.

Метод Worksheet.Paste

Worksheet.Paste – это метод, который вставляет содержимое буфера обмена на рабочий лист.

Синтаксис

Worksheet.Paste (Destination, Link)

Метод Worksheet.Paste работает как с диапазонами ячеек, вырезанными в буфер обмена методом Range.Cut, так и скопированными в буфер обмена методом Range.Copy.

Параметры

Параметры Описание
Destination Необязательный параметр. Диапазон (ячейка), указывающий место вставки содержимого буфера обмена. Если этот параметр не указан, используется текущий выделенный объект.
Link Необязательный параметр. Булево значение, которое указывает, устанавливать ли ссылку на источник вставленных данных: True – устанавливать, False – не устанавливать (значение по умолчанию).

В выражении с методом Worksheet.Paste можно указать только один из параметров: или Destination, или Link.

Для вставки из буфера обмена отдельных компонентов скопированных ячеек (значения, форматы, примечания и т.д.), а также для проведения транспонирования и вычислений, используйте метод Range.PasteSpecial (специальная вставка).

Примеры

Вырезание и вставка диапазона одной строкой (перемещение):

Range(«A1:C3»).Cut Range(«E1»)

Вырезание ячеек в буфер обмена и вставка методом ActiveSheet.Paste:

Range(«A1:C3»).Cut

ActiveSheet.Paste Range(«E1»)

Копирование и вставка диапазона одной строкой:

Range(«A18:C20»).Copy Range(«E18»)

Копирование ячеек в буфер обмена и вставка методом ActiveSheet.Paste:

Range(«A18:C20»).Copy

ActiveSheet.Paste Range(«E18»)

Копирование одной ячейки и вставка ее данных во все ячейки заданного диапазона:

Range(«A1»).Copy Range(«B1:D10»)


Дублирование таблицы на другой лист нужных столбцов

lebensvoll

Дата: Среда, 05.12.2018, 12:02 |
Сообщение № 1

Группа: Проверенные

Ранг: Старожил

Сообщений: 1002


Репутация:

30

±

Замечаний:
0% ±


Excel 2010

Добрый день многоуважаемые форумчане.
Прошу Вас помощи в решении.
ЧЕСТНО! Пытался сам, пытал ГУГЛ помощи, смотрел в книгу «видел фигу %) :'( » и все это в течении двух суток.
Информации очень много с решением, но увы не смог достичь что нужно мне.
Имеется таблица «Отгрузка» на листе1, условие такое
Нужно чтоб при любом изменении в данной таблице эти данные «дублировались, копировались» на лист2 в таблицу (пусть будет «Отчет») но не вся полностью а лишь три ДАТА, НОМЕР СЧЕТ.
Прекрасно понимаю что для каких либо изменений в таблице я должен применить вот этот код

Но тут я потерялся совсем
Объявление переменных, поиск последней строки, выделение, копирование на другой лист в нужный мне диапазон %)
Наткнулся на код который копирует но всю таблицу переносит на нужный лист но не как таблицу а лишь значения
Прошу Вас подскажите как более правильно преобразовать код в нужное мне русло, спасибо за ранее за ответы
Сам код вот
[vba]

Код

Sub iCopy()
Dim Sht As Worksheet
Dim iLastRow As Long
  iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For Each Sht In Worksheets
      If Sht.Name <> «Лист1» Then
       If Sht.Name = «Лист2» Then
         With Sht
            Range(«A3:D» & iLastRow).Copy
            .Cells(3, 1).PasteSpecial xlPasteColumnWidths
            .Cells(3, 1).PasteSpecial xlPasteValues
         End With
       End If
      End If
    Next
End Sub

[/vba]
Пытался записать свое действие и применить это все для листа3 при этом на листе1 применить Worksheet_Change тогда код ругается
[vba]

Код

Sub Макрос2()
‘ Макрос2 Макрос
    Range(«A2:A8,C2:D8»).Select
    Range(«Отгрузка[[#Headers],[номер]]»).Activate
    Application.CutCopyMode = False
    Selection.Copy
    Sheets(«Лист3»).Select
    Range(«A2»).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    ActiveSheet.ListObjects.Add(xlSrcRange, Range(«$A$2:$C$8»), , xlYes).Name = _
        «Таблица2»
    Range(«Таблица2[#All]»).Select
End Sub

[/vba]

ааааааа

К сообщению приложен файл:

1203623.xlsm
(21.1 Kb)


Кто бы ты ни был, мир в твоих руках

 

Ответить

boa

Дата: Среда, 05.12.2018, 12:40 |
Сообщение № 2

Группа: Друзья

Ранг: Ветеран

Сообщений: 543


Репутация:

166

±

Замечаний:
0% ±


2013, 365

Здравствуйте, lebensvoll,
вам надо что бы скопировались изменения, т.е. было-стало?
или просто колонки целиком?
Если целиком, то можно добавить таблицу которая будет ссылаться на таблицу «Отгрузка» и обновлять ее по удобному событию: то ли внесение изменений, то ли активация/деактивация листа

В примере добавил таблицу и события. Не нужное закомментируйте.
ну или
[vba]

Код

Sheets(«Лист1»).Range(«A2:A8,C2:C8,D2:D8»).Copy Sheets(«Лист3»).Cells(2, 1)

[/vba]

К сообщению приложен файл:

1203623.7z
(41.9 Kb)


 

Ответить

lebensvoll

Дата: Среда, 05.12.2018, 12:49 |
Сообщение № 3

Группа: Проверенные

Ранг: Старожил

Сообщений: 1002


Репутация:

30

±

Замечаний:
0% ±


Excel 2010

boa, спасибо за отзывчивость…
Но файл не смог открыть [img][/img]

Цитата

вам надо что бы скопировались изменения, т.е. было-стало?

Нужно чтоб при любых изменениях в таблице на листе 1 (данные «копировались, дублировались» Не вся таблица а лишь 1;3;4 графы) на другой лист2 в таблицу


Кто бы ты ни был, мир в твоих руках

 

Ответить

boa

Дата: Среда, 05.12.2018, 12:56 |
Сообщение № 4

Группа: Друзья

Ранг: Ветеран

Сообщений: 543


Репутация:

166

±

Замечаний:
0% ±


2013, 365

lebensvoll, надо пересоздать таблицу на sheet1, а то она ссылается на мой путь


 

Ответить

boa

Дата: Среда, 05.12.2018, 13:01 |
Сообщение № 5

Группа: Друзья

Ранг: Ветеран

Сообщений: 543


Репутация:

166

±

Замечаний:
0% ±


2013, 365

или используйте копирование
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range(«Отгрузка[#All]»)) Is Nothing Then
        Application.EnableEvents = 0
        Range(«A2:A8,C2:C8,D2:D8»).Copy Sheets(«Лист3»).Cells(2, 1)
        Application.EnableEvents = 1
    End If
End Sub

[/vba]


 

Ответить

boa

Дата: Среда, 05.12.2018, 13:06 |
Сообщение № 6

Группа: Друзья

Ранг: Ветеран

Сообщений: 543


Репутация:

166

±

Замечаний:
0% ±


2013, 365

можно даже столбцы целиком
[vba]

Код

Range(«A:A,C:D»).Copy Sheets(«Лист2»).Cells(1, 1)

[/vba]


 

Ответить

lebensvoll

Дата: Среда, 05.12.2018, 13:35 |
Сообщение № 7

Группа: Проверенные

Ранг: Старожил

Сообщений: 1002


Репутация:

30

±

Замечаний:
0% ±


Excel 2010

boa, Спасибо огромное!!!
Блин это все можно было лишь в одну строку прописать :o
Но буду все равно искать и пробывать как сделать так (вот оператор дополнил таблицу новыми данными «увеличил диапазон» примерно) тогда код уже не приемлем :(
Спасибо еще раз


Кто бы ты ни был, мир в твоих руках

 

Ответить

_Boroda_

Дата: Среда, 05.12.2018, 13:50 |
Сообщение № 8

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

это фигня. А вот если уменьшил кол-во строк, вот здесь засада
Я бы вот так написал. Пробегается по второй таблице, берет названия столбцов, ищет их в первой таблице и копирует найденный столбец
Обработчик ошибки в случае ненахождения искомого столбца самостоятельно добавьте там, я забыл
Добавил. Файл перевложил
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range(«Отгрузка»)) Is Nothing Then
        Set tb1_ = Sheets(«Лист3»).ListObjects(«Таблица2»)
        With tb1_
            nc_ = .ListColumns.Count
            nr_ = .ListRows.Count
            If nr_ Then
                .Range(1).Offset(1).Resize(nr_, nc_).Delete
            End If
            On Error Resume Next
            For i = 1 To nc_
                Range(«Отгрузка[» & .Range(i) & «]»).Copy .Range(nc_ + i)
            Next i
            On Error GoTo 0
        End With
    End If
End Sub

[/vba]


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

lebensvoll

Дата: Среда, 05.12.2018, 15:50 |
Сообщение № 9

Группа: Проверенные

Ранг: Старожил

Сообщений: 1002


Репутация:

30

±

Замечаний:
0% ±


Excel 2010

_Boroda_, Ваш пример более выразителен и убийственен в решении задачи…
Но увы…
Данный пример хотел применить для файла другого :( :'( %)
(Другие листы скрыты) имеется два листа (Отгрузка и Отчет списание). Задача моя была в следующем (ну как думал Я, в итоге подход был задуман не верен)
Оператор вносит отгрузку в таблицу Отгрузка на листе Отгрузка по кнопке.
Как только данная запись была внесена, то она сразу дублируется (куском, не все таблица а нужное) на другой лист.
Ваш код Александр гениален но почему то для моего примера он не подошел. Но хотя не могу понять почему. Ведь даже на Вашем примере если бы я добавил новую хоть какую то запись то она дополняется сразу на другой лист.
А скопировал его в файл (((( потерпел крах
Он работает если я после внесении новой записи изменяю что то либо в таблице тогда она сразу на ура работает.

К сообщению приложен файл:

_1.xlsm
(71.5 Kb)


Кто бы ты ни был, мир в твоих руках

 

Ответить

boa

Дата: Среда, 05.12.2018, 15:53 |
Сообщение № 10

Группа: Друзья

Ранг: Ветеран

Сообщений: 543


Репутация:

166

±

Замечаний:
0% ±


2013, 365

lebensvoll, если оператор увеличивает количество строк(что есть нормально), то используйте копирование из сообщения №6
определив последнюю строку можно переписать Range
[vba]

Код

    Dim LastRow&: LastRow = Me.UsedRange.SpecialCells(xlLastCell).Row
    Range(«A2:A» & LastRow & «,C2:C» & LastRow & «,D2:D» & LastRow).Copy Sheets(«Лист3»).Cells(2, 1)

[/vba]
ну а если он столбцы будет добавлять/двигать, то можно финдом по заголовку таблицы пройтись и определить копируемый диапазон.
[vba]

Код

Sub NewMacros()
    Dim LastRow&, LetterCol$, AddressRange$, a
    With Sheets(«Лист1»)
        LastRow = .UsedRange.SpecialCells(xlLastCell).Row   ‘получаем номер последней строки
        For Each a In Array(«дата», «номер», «счет»)
            LetterCol = Split(.Columns(.Range(«Отгрузка[[#Headers]]»).Find(a, LookIn:=xlValues, LookAt:=xlWhole).Column).Address(0, 0), «:»)(0)    ‘получаем букву столбца
            AddressRange = AddressRange & IIf(Len(AddressRange) > 0, «,», «») & LetterCol & «2:» & LetterCol & LastRow    ‘генерируем строку адреса
        Next
        .Range(AddressRange).Copy Sheets(«Лист3»).Cells(2, 1)
    End With
End Sub

[/vba]


Сообщение отредактировал boaСреда, 05.12.2018, 15:54

 

Ответить

boa

Дата: Среда, 05.12.2018, 16:20 |
Сообщение № 11

Группа: Друзья

Ранг: Ветеран

Сообщений: 543


Репутация:

166

±

Замечаний:
0% ±


2013, 365

а что бы отрабатывало и для новых строк таблицы в модульлиста вставьте
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim iCol&, a
    With Me
        For Each a In Array(«дата», «номер», «счет»)
            iCol = .Range(«Отгрузка[[#Headers]]»).Find(a, LookIn:=xlValues, LookAt:=xlWhole).Column
            If Target.Column = iCol Then Call NewMacros: Exit Sub
        Next
    End With
End Sub

[/vba]


 

Ответить

_Boroda_

Дата: Среда, 05.12.2018, 16:25 |
Сообщение № 12

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

А все потому, что кто-то до сих пор не выучил п.3 Правил форума и кладет примеры, несоответствующие реальным файлам
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range(«Отгрузка»)) Is Nothing Then
        Set tb1_ = Sheets(«Отчет списание»).ListObjects(«Отчет»)
        With tb1_
            nc_ = .ListColumns.Count
‘            nr_ = .ListRows.Count
‘            If nr_ Then
‘                .Range(1).Offset(1).Resize(nr_, nc_).Delete
‘            End If
            On Error Resume Next
            For i = 1 To nc_
                Range(«Отгрузка[» & .Range(i) & «]»).Copy .Range(nc_ + i)
            Next i
            On Error GoTo 0
        End With
    End If
End Sub

[/vba]


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

lebensvoll

Дата: Среда, 05.12.2018, 16:44 |
Сообщение № 13

Группа: Проверенные

Ранг: Старожил

Сообщений: 1002


Репутация:

30

±

Замечаний:
0% ±


Excel 2010

_Boroda_, спорить не буду. Простите если что не так…
Но задача ведь была аналогична задумке на другом листе. Но понимание того что ошибочно пришло с ответом.
Потому как в теме поста был файл с данными которые просто либо заполняются или дополняются. А куда это решение хотел применить дополнение через кнопку
Но я то думал что и там и там умные таблицы и итог решения одинаков
Закоментирование части кода не дало решения. Запись вносится а на другой лист она дублируется лишь тогда когда начинаешь корректировать записи в таблице.
[vba]

Код

‘            nr_ = .ListRows.Count
‘            If nr_ Then
‘                .Range(1).Offset(1).Resize(nr_, nc_).Delete
‘            End If

[/vba]
Мое мнение возможно ли что нужно как то прописать определение последней ячейки в таблице. Но не уверен в логике
[vba]

Код

lLastRow = Cells(Rows.Count,1).End(xlUp).Row

[/vba]
Скорее всего можно поступить иначе и привязаться к кнопке «Внесения записи» но тогда теряется «задача». Потому как оператор может потом взять и удалить запись из таблицы :'( в одной таблицы запись будет а в другой не будет. Или еще хуже в одной она будет с одними данными (а потом оператор меняет что нибудь, есть такое за ними) а у меня будут записаны другие данные….


Кто бы ты ни был, мир в твоих руках

Сообщение отредактировал lebensvollСреда, 05.12.2018, 16:52

 

Ответить

boa

Дата: Среда, 05.12.2018, 16:58 |
Сообщение № 14

Группа: Друзья

Ранг: Ветеран

Сообщений: 543


Репутация:

166

±

Замечаний:
0% ±


2013, 365

lebensvoll,
у вас на кнопке стоит EnableEvents = False следовательно ни какие события не будут обрабатываться.
в т.ч. и Worksheet_Change


Сообщение отредактировал boaСреда, 05.12.2018, 16:59

 

Ответить

lebensvoll

Дата: Среда, 05.12.2018, 17:04 |
Сообщение № 15

Группа: Проверенные

Ранг: Старожил

Сообщений: 1002


Репутация:

30

±

Замечаний:
0% ±


Excel 2010

_Boroda_, Ну вот смотрите
на листе ОТГРУЗКА оператором вносится запись, которую он формирует тут
[img][/img]
Затем вносит эти данные в таблицу на лист Отгрузка при нажатии кнопки
[img][/img]
Данные вносятся в таблицу
[img][/img]
И как только эти данные внеслись в таблицу то они дублируются на лист Отчет списание
Но лишь часть нужных столбцов из таблицы Отгрузка (Дата; Контрагент; Госномер ТС; Продукция; Количество)
[img][/img]
Но есть нюанс.
Любые изменения в таблице Отгрузка, должны сразу же дублироваться (конечно же интересует лишь столбцы Дата; Контрагент; Госномер ТС; Продукция; Количество) в другой таблице Отчет.
Ваше решение было отличным и оно срабытавает.
Но лишь только тогда когда оператор производит изменения в таблице Отгрузка. А вот когда появляется новая запись увы (хотя в файле первого файла сообщения №8 она срабатывает на ура просто. К примеру я беру и протягиваю таблицу дальше на две три строки и забиваю туда информация и как только я ее завершаю они дублируются). ПОЧЕМУ ТАК ТО


Кто бы ты ни был, мир в твоих руках

Сообщение отредактировал lebensvollСреда, 05.12.2018, 17:07

 

Ответить

_Boroda_

Дата: Среда, 05.12.2018, 17:10 |
Сообщение № 16

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

В макрос для кнопки последней строкой (перед End sub) добавьте
[vba]

Код

Range(«Отгрузка»).Cells(1) = Range(«Отгрузка»).Cells(1)

[/vba]

См. пост boa выше

К сообщению приложен файл:

_1-5-1.xlsm
(65.4 Kb)


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

Сообщение отредактировал _Boroda_Среда, 05.12.2018, 17:11

 

Ответить

lebensvoll

Дата: Среда, 05.12.2018, 20:38 |
Сообщение № 17

Группа: Проверенные

Ранг: Старожил

Сообщений: 1002


Репутация:

30

±

Замечаний:
0% ±


Excel 2010

_Boroda_, :o
Вот ну как так то одна строка а запрещала дальнейшее событие на листе %)
hands СПАСИБО ВАМ ОГРОМНОЕ АЛЕКСАНДР!!!
boa, Вам также!!! hands yes


Кто бы ты ни был, мир в твоих руках

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Vba excel копировать строки
  • Vba excel копировать значение диапазона
  • Vba excel координаты активной ячейки
  • Vba excel конструкция with
  • Vba excel конструкция for