Excel макросы копирование данных ячеек

Вырезание, перемещение, копирование и вставка ячеек (диапазонов) в 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»)


На чтение 3 мин. Просмотров 51.6k.

Итог: Изучите 3 различных способа копирования и вставки ячеек или диапазонов в Excel с помощью макросов VBA. Это серия из трех частей, также вы сможете скачать файл, содержащий код.

Уровень мастерства: Начинающий

Копировать и вставить: наиболее распространенное действие Excel

Копирование и вставка, вероятно, является одним из самых
распространенных действий в Excel. Это также одна из самых распространенных
задач, которые мы автоматизируем при написании макросов.

Есть несколько различных способов выполнить эту задачу, и устройство записи макросов не всегда дает вам наиболее эффективный код VBA.

В следующих трех видео я объясняю:

  • Самый эффективный метод для простого копирования
    и вставки в VBA.
  • Самый простой способ вставить значения.
  • Как использовать метод PasteSpecial для других
    типов вставок.

Видео № 1: Простой метод «Копировать-вставить»

Видео лучше всего просматривать в полноэкранном HD.

Sub Примеры_копирования_диапазона()
'Используйте метод Range.Copy для простого копирования / вставки

    'Метод Range.Copy - копирование и вставка с 1 строкой
    Range("A1").Copy Range("C1")
    Range("A1:A3").Copy Range("D1:D3")
    Range("A1:A3").Copy Range("D1")
    
    'Range.Copy с одного листа на другой
    Worksheets("Лист1").Range("A1").Copy Worksheets("Лист2").Range("A1")
    
    'Range.Copy с одного файла (на другой
    Workbooks("План.xlsx").Worksheets("Лист1").Range("A1").Copy _
        Workbooks("Факт.xlsx").Worksheets("Лист1").Range("A1")

End Sub

Видео № 2: Простой способ вставить значения

Sub Копируем_только_значения()
'Установите значения ячеек равными другим, чтобы вставить значения

'Устанавливает равенство одного диапазона другому
    Range("C1").Value = Range("A1").Value
    Range("D1:D3").Value = Range("A1:A3").Value
     
'Равенство значений между листами
    Worksheets("Лист1").Range("A1").Value = Worksheets("Лист2").Range("A1").Value
     
'Равенство значений между книгами
    Workbooks("Факт.xlsx").Worksheets("Лист1").Range("A1").Value = _
        Workbooks("План.xlsx").Worksheets("Лист1").Range("A1").Value
        
End Sub

Видео № 3: Метод PasteSpecial

Sub Копируем_с_помощью_специальной_вставки()
'Используйте метод Range.PasteSpecial для выбора типа вставки

 'Копируем и вставляем через СпецВставку
Range("A1").Copy
Range("A5").PasteSpecial Paste:=xlPasteFormats

'Используем спецвставку между листами
Worksheets("Лист1").Range("A2").Copy
Worksheets("Лист2").Range("A2").PasteSpecial Paste:=xlPasteFormulas

'Используем спецвставку между файлами
Workbooks("План.xlsx").Worksheets("Лист1").Range("A3").Copy
Workbooks("Факт.xlsx").Worksheets("Лист1").Range("A1").PasteSpecial Paste:=xlPasteFormats

'Убираем "бегающих муравьёв" после копирования (очищаем буфер обмена)
Application.CutCopyMode = False    
   
End Sub

Вставить данные ниже последней заполненной строки

Один из самых распространенных вопросов, которые я получаю о копировании и вставке с помощью VBA: «Как мне вставить данные в конец таблицы? «

Сначала нужно найти последнюю заполненную строку данных, а затем скопировать и вставить ниже неё.

Переходите по ссылке, чтобы научиться 3 способам поиска последней заполненной ячейки

How to copy and paste data using a Macro in Excel. I’ll show you multiple ways to do this, including across worksheets and workbooks.

Sections:

Simple Copy/Paste

Copy Entire Range

Copy between Worksheets

Copy between Workbooks

Notes

Simple Copy/Paste

Range("A1").Copy Range("B1")

This copies cell A1 to cell B1.

Range(«A1»).Copy is the part that copies the cell.

Range(«B1») is the cell where the data will be copied.

This is a simple one line piece of code and it’s very easy to use.

Notice that there is a space between these two parts of the code.

Copy Entire Range

Range("A1:A5").Copy Range("B1:B5")

Range(«A1:A5»).Copy is the part that copies the range.

Range(«B1:B5») is the range where the data will be copied.

You can also write it like this:

Range("A1:A5").Copy Range("B1")

Notice that the range to where you will copy the data has only a reference to cell B1.

You only have to reference the very first cell to which the range will be copied and the entire range will copy in the cells below there.

NOTE: if you do it like this, you may end up overwriting data and Excel will not give you a warning about this; the data will simply be filled down as far as it needs to go to copy the first range.

Copy between Worksheets

Sheets("Sheet1").Range("A1").Copy Sheets("Sheet2").Range("B1")

This follows the same pattern as the above examples except that we need to tell the macro from which sheet we want to get the data and to which sheet we want to copy the data.

Sheets(«Sheet1»). is placed in front of the first range and that means to get the data from Sheet1, which is the name of a worksheet in the workbook.

Sheets(«Sheet2»). is placed in front of the range to which we want to copy the data and Sheet2 is the name of the worksheet where the data will be copied.

Copy between Workbooks

Workbooks("Copy and Paste Data using Macro VBA in Excel.xlsm").Sheets("Sheet1").Range("A1").Copy Workbooks("Copy and Paste Data using Macro VBA in Excel.xlsm").Sheets("Sheet3").Range("A1")

Here, we follow the above examples and, this time, add a reference to the workbooks from which we want to get the data and to which we want to place the data.

Workbooks(«Copy and Paste Data using Macro VBA in Excel.xlsm»). is the code that says in which workbook we want to place the data. Copy and Paste Data using Macro VBA in Excel.xlsm is the name of the workbook. In this example I used this for both parts, the workbook from which the data comes and where it goes. This allows you to run this macro within a single workbook and still show you how it works. In a real-world example, the first part contains the name of the workbook where you get the data from and the second contains the name of the workbook where you want to place the data.

Read this tutorial to copy values from another workbook, even if it’s closed.

Notes

All examples in the attached workbook have been commented out. Simply remove the single quote from the line of code you want to test and then run the macro.

cf5e0ebf6d62c9ec73df03c55f727e77.jpg

Download the attached file to get these examples in Excel.

Similar Content on TeachExcel

Activate or Navigate to a Worksheet using Macros VBA in Excel

Tutorial: Make a particular worksheet visible using a macro in Excel.
This is called activating a wo…

Get the Name of a Worksheet in Macros VBA in Excel

Tutorial: How to get the name of a worksheet in Excel using VBA and Macros and also how to store tha…

Get the Last Row using VBA in Excel

Tutorial:
(file used in the video above)
How to find the last row of data using a Macro/VBA in Exce…

Remove Dashed Lines from Copy Paste VBA in Excel

Tutorial: How to remove the flashing dashes from a copy/paste range using VBA in Excel; this removes…

Copy one range and paste in another range

Tutorial: Below is a macro, just copy and paste it into a module in your workbook and go from there…

Guide to Combine and Consolidate Data in Excel

Tutorial: Guide to combining and consolidating data in Excel. This includes consolidating data from …

Subscribe for Weekly Tutorials

BONUS: subscribe now to download our Top Tutorials Ebook!

Содержание

  1. Способы VBA работы с ячейками Excel
  2. Копировать и вставить: наиболее распространенное действие Excel
  3. Вставить данные ниже последней заполненной строки
  4. VBA Excel. Буфер обмена (копирование, вставка, очистка)
  5. Копирование и вставка ячеек
  6. Буфер обмена и переменная
  7. Объект DataObject
  8. Копирование текста из переменной в буфер обмена
  9. Копирование текста из буфера обмена в переменную
  10. Очистка буфера обмена
  11. Функции для работы с буфером обмена
  12. 8 комментариев для “VBA Excel. Буфер обмена (копирование, вставка, очистка)”
  13. VBA Excel. Вырезание, копирование и вставка ячеек (диапазонов)
  14. Метод Range.Cut
  15. Синтаксис
  16. Параметры
  17. Метод Range.Copy
  18. Синтаксис
  19. Параметры
  20. Метод Worksheet.Paste
  21. Синтаксис
  22. Параметры
  23. Примеры
  24. 43 комментария для “VBA Excel. Вырезание, копирование и вставка ячеек (диапазонов)”
  25. Метод Range.Copy (Excel)
  26. Синтаксис
  27. Параметры
  28. Возвращаемое значение
  29. Пример
  30. Поддержка и обратная связь
  31. VBA Excel. Диапазон ячеек и массив (обмен значениями)
  32. Копирование значений из диапазона ячеек в массив
  33. Копирование значений из массива в диапазон ячеек
  34. Обмен значениями между двумя диапазонами

Способы VBA работы с ячейками Excel

Итог: Изучите 3 различных способа копирования и вставки ячеек или диапазонов в Excel с помощью макросов VBA. Это серия из трех частей, также вы сможете скачать файл, содержащий код.

Уровень мастерства: Начинающий

Копировать и вставить: наиболее распространенное действие Excel

Копирование и вставка, вероятно, является одним из самых распространенных действий в Excel. Это также одна из самых распространенных задач, которые мы автоматизируем при написании макросов.

Есть несколько различных способов выполнить эту задачу, и устройство записи макросов не всегда дает вам наиболее эффективный код VBA.

В следующих трех видео я объясняю:

  • Самый эффективный метод для простого копирования и вставки в VBA.
  • Самый простой способ вставить значения.
  • Как использовать метод PasteSpecial для других типов вставок.

Видео № 1: Простой метод «Копировать-вставить»

Видео лучше всего просматривать в полноэкранном HD.

Видео № 2: Простой способ вставить значения

Видео № 3: Метод PasteSpecial

Вставить данные ниже последней заполненной строки

Один из самых распространенных вопросов, которые я получаю о копировании и вставке с помощью VBA: «Как мне вставить данные в конец таблицы? «

Сначала нужно найти последнюю заполненную строку данных, а затем скопировать и вставить ниже неё.

Источник

VBA Excel. Буфер обмена (копирование, вставка, очистка)

Работа с буфером обмена в VBA Excel: копирование и вставка ячеек, копирование текста из переменной, очистка буфера обмена. Объект DataObject. Примеры.

Копирование и вставка ячеек

Копирование содержимого и форматов ячеек (диапазона) в буфер обмена осуществляется методом Range.Copy, а вставка – методом Worksheet.Paste:

При вставке диапазона ячеек из буфера обмена на рабочий лист достаточно указать верхнюю левую ячейку места (диапазона) вставки.

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

Буфер обмена и переменная

Передача текста между переменной и буфером обмена в VBA Excel осуществляется с помощью объекта DataObject. Стоит иметь в виду, что на некоторых компьютерах DataObject может некорректно работать при открытом окне проводника.

Объект DataObject

Подробнее об элементе DataObject вы можете прочитать на сайте разработчиков.

Методы объекта DataObject:

Метод Описание
GetFromClipboard Копирует данные из буфера обмена в DataObject
GetText Извлекает текстовую строку из объекта DataObject в указанном формате
PutInClipboard Перемещает данные из DataObject в буфер обмена
SetText Копирует текстовую строку в DataObject, используя указанный формат

Копирование текста из переменной в буфер обмена

Копирование текста из буфера обмена в переменную

Очистка буфера обмена

Специального метода для очистки буфера обмена в VBA Excel нет. Для решения этой задачи можно использовать выход из режима вырезания-копирования:

Следующий пример демонстрирует вставку скопированной ячейки «A1» в ячейки «A2» и «A3» и отсутствие вставки в ячейки «A4» и «A5» после строки Application.CutCopyMode = False :

Оператор On Error Resume Next необходим для обработки (пропуска) ошибки, возникающей при вставке из пустого буфера обмена.

Функции для работы с буфером обмена

В некоторых системах, начиная с Windows 8, метод DataObject.PutInClipboard не работает правильно: если открыт хотя бы один экземпляр Проводника (папка), в буфер обмена записываются два квадратика. Следующие функции должны решить эту проблему:

Пример использования функций для работы с буфером обмена:

8 комментариев для “VBA Excel. Буфер обмена (копирование, вставка, очистка)”

Код — не работает ▼

В А1 вставляется какой-то непечатаемый символ и всё. При переходе к другому приложению и попытке вставить содержимое буфера — фиаско.

Добрый день, Михаил!
Такое встречается, начиная с Windows 8, когда открыта хотя бы одна папка в Проводнике. Я добавил в статью функции для работы с буфером обмена, они должны работать.

В Win 8.1 такой проблемы не наблюдаю, уж по всякому погонял, пытаясь вызвать ошибку — всегда правильно отрабатывает ))
А за статью большое спасибо!

Нашёл такую информацию на случай получения ошибки относительно типа данных DataObject.
Чтобы заработал тип данных «DataObject» нужно подключить инструмент «Microsoft Forms Object Libraries». Для этого необходимо выполнить действия в редакторе макросов Эксель:
1. Открыть Tools/References;
2. Через кнопку Browse открыть файл C:WINDOWSSYSTEM32FM20.DLL. Файл «FM20.DLL» может оказаться в другой подпапке Windows, поискать по названию. Может быть в «SysWOW64» или в «System».

Источник

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, но строки на нем не удаляет, циклы пошагово проходят, но ничего не изменяется.)

Источник

Метод Range.Copy (Excel)

Копирует диапазон в указанный диапазон или в буфер обмена.

Хотите создавать решения, которые расширяют возможности Office на разнообразных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любую технологию веб-программирования, например HTML5, JavaScript, CSS3 и XML.

Синтаксис

выражение.Copy (Destination)

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

Параметры

Имя Обязательный или необязательный Тип данных Описание
Destination Необязательный Variant Указывает новый диапазон, в который будет скопирован заданный диапазон. Если этот аргумент опущен, Microsoft Excel копирует диапазон в буфер обмена.

Возвращаемое значение

Пример

В следующем примере кода копируются формулы ячеек A1:D4 с листа Sheet1 в ячейки с E5:H8 на листе Sheet2.

В приведенном ниже примере кода проверяется значение столбца D для каждой строки на листе Sheet1. Если значение в столбце D равно «A», вся строка копируется на лист SheetA в следующую пустую строку. Если значение равно «B», строка копируется на лист SheetB.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

VBA Excel. Диапазон ячеек и массив (обмен значениями)

Копирование значений из диапазона ячеек в массив и обратно с помощью VBA Excel. Простейшие примеры обмена значениями между диапазоном и массивом.

Копирование значений из диапазона ячеек в массив

Чтобы скопировать значения из диапазона ячеек в массив, необходимо объявить переменную универсального типа (As Variant) и присвоить ей значения диапазона ячеек с помощью оператора присваивания (=):

VBA Excel автоматически преобразует объявленную переменную в двумерный массив, соответствующий размерности диапазона ячеек, в нашем случае в массив — a(1 To 3, 1 To 3), и заполняет его значениями. Нумерация измерений массивов, созданных таким образом, начинается с единицы (1).

Можно, в этом случае, объявить сразу динамический массив, чтобы изначально указать, что эта переменная будет массивом. Так как свойством диапазона ячеек по умолчанию в VBA Excel является значение (Value), его можно в коде явно не указывать, но, при желании, можно и указать. Получится такая конструкция, аналогичная первой:

Стоит отметить, что для копирования значений из диапазона ячеек в массив можно использовать только обычную переменную или динамический массив универсального типа (Variant). VBA Excel автоматически преобразовывает их в двумерный массив. Если объявить двумерный массив с указанной заранее размерностью, использовать его не получится, будет сгенерирована ошибка с сообщением: Can’t assign to array (Нельзя назначать массив).

Копирование значений из массива в диапазон ячеек

Значения в диапазон ячеек добавляются из массива с помощью оператора присваивания (=):

Обратите внимание, что вставить значения в диапазон ячеек можно только из двумерного массива. Размерность такого массива может начинаться с нуля (0). Количество элементов в измерениях массива должно совпадать с количеством строк и столбцов в диапазоне ячеек. Если вам нужно вставить значения в одну строку или в один столбец, укажите размерность единственной строки или единственного столбца как (0) или (1 To 1), если вы хотите использовать нумерацию измерений своего массива с единицы. Например, для записи десяти значений из массива в одну строку можно объявить такой массив — massiv(9, 0), или в один столбец — massiv(0, 9).

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

Обмен значениями между двумя диапазонами

Обмен значениями можно осуществить в VBA Excel не только между массивом и диапазоном, но и между двумя диапазонами одинаковой размерности:

Источник

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

Sub Название_Макроса()

'Выделить диапазон который необходимо скопировать
Range("A1:F52").Select
'Скопировать то, что выделено
Selection.Copy
ChDir "путь к папке где лежит файл в который необходимо скопировать"
Workbooks.Open Filename:= "Название файла, который находится в папке, путь к которой указан выше"
'Выделить начальную ячейку в которую необходимо вставить скопированные данные
Range("A6").Select
'Вставить данные
ActiveSheet.Paste
'сохранить текущую книгу
ActiveWorkbook.Save
'Закрыть книгу
ActiveWorkbook.Close
End Sub

Вариант 2: В открывшейся книге запускаем макрос, чтобы он открыл нужную нам книгу, скопировал от туда нужные нам данные и вставил в нашу открытую книгу, закрыв файл из которого эти данные были скопированы

Sub Название_Макроса2()
'Открываем файл с которого нужно скопировать данные
Workbooks.Open Filename:="C:Данные.xlsx"

'Скопировать нужный диапазон в открывшейся книге на листе 1
Workbooks("Данные.xlsx").Worksheets("Лист1").Range("A16:E16").Copy
'Активируем нужную нам книгу
Workbooks("Книга1.xlsm").Activate

'Выделяем и вставляем скопированные данные в ячейку А1
ActiveWorkbook.Worksheets("Лист1").Range("A1").Select
ActiveSheet.Paste

'Закрываем книгу откуда мы скопировали данные
Workbooks("Данные.xlsx").Close

End Sub

Еще пример — Скопировать диапазоны данных из активной открытой книги Excel нескольких листов (в нашем примере 3-х листов) в другую книгу, которая хранится в определенном месте. Данные будут вставлены как значения, плюс будут перенесены форматы ячеек.

Sub Копируем_листы_в_другую_книгу()
Dim bookconst As Workbook
Dim abook As Workbook
Set abook = ActiveWorkbook 'присваиваем перменную активной книге
Set bookconst = Workbooks.Open("C:UsersUserDesktop1.xlsx") 'присваиваем перменную книге куда необходимо копировать данные

'переходим в активную книгу откуда необходимо скопировать данные
abook.Worksheets("Лист1").Activate
Range("A1:I23").Copy 'копируем определенный диапазон листа, укажите свой диапазон
bookconst.Worksheets("Лист1").Activate 'активируем лист куда необходимо вставить данные
Range("A1:I23").Select 'встаем на ячейку А1
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'второй лист
abook.Worksheets("Лист2").Activate
Range("A1:I23").Copy
bookconst.Worksheets("Лист2").Activate
Range("A1:I23").Select 'выделяем диапазон
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'третий лист
abook.Worksheets("Лист3").Activate
Range("A1:I23").Copy
bookconst.Worksheets("Лист3").Activate
Range("A1:I23").Select 'выделяем диапазон
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'сохранить текущую книгу
bookconst.Save
'Закрыть книгу
bookconst.Close
abook.Activate

End Sub

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

Спасибо за внимание.

0 / 0 / 0

Регистрация: 03.10.2017

Сообщений: 12

1

27.11.2017, 10:34. Показов 32402. Ответов 18


Студворк — интернет-сервис помощи студентам

Здравствуйте господа программисты!

Столкнулся с непосильной задачей. Знания в написании макросов на уровне новичка, да и то, в большей степени по примерам, так что прошу помощи. Буду благодарен за любые советы.

И так, есть некий (см. вложение) в котором на первом листе заполняются данные каждый день. Хотелось бы чтобы данные с первого листа копировались на второй лист по условию: а именно на первом листе в 1ом столбце числа. Нужно копировать данные на второй лист по числам. Если второе число не вводится то по умолчанию считаем, что копирование происходит с введенного числа до конца заполненных ячеек. Копировать необходимо только с 3 по 7 столбец Листа1. С последующей выгрузкой на отправку на почту с названием которое берется с ячейки R1 лист1. Внутри два макроса. Помогите довести макрос до ума…
ЗЫ. Второй лист можно и изключить. Он у меня как буфер для отправки почты



0



2628 / 1634 / 744

Регистрация: 23.03.2015

Сообщений: 5,135

27.11.2017, 14:36

2

DEN_ZH,
Покажите, что должно получиться на 2-ом листе( как пример)



0



0 / 0 / 0

Регистрация: 03.10.2017

Сообщений: 12

27.11.2017, 14:46

 [ТС]

3

На втором листе должно получится столбцы первого листа с 3го по 7ой. определенной даты



0



0 / 0 / 0

Регистрация: 03.10.2017

Сообщений: 12

27.11.2017, 15:01

 [ТС]

4

в примере есть макрос. который я нарыл в сети, но не знаю как приспособить его под свою задачу. Макрос почта работает как полагается. Идеальный вариант бы их объеденить. И первую часть с разъяснением. так как пока далек от детального понимания



0



Narimanych

2628 / 1634 / 744

Регистрация: 23.03.2015

Сообщений: 5,135

27.11.2017, 16:08

5

DEN_ZH,

Попробуйте

Visual Basic
1
2
3
4
Sub SelectData()
c = Sheets(1).Cells(3, 3).CurrentRegion.Rows.Count
Sheets(2).Range("A3").Resize(c - 2, 5) = Sheets(1).Range(Sheets(1).Cells(3, 3), Sheets(1).Cells(c, 7)).Value
End Sub



0



0 / 0 / 0

Регистрация: 03.10.2017

Сообщений: 12

27.11.2017, 16:21

 [ТС]

6

да по копированию это то что надо, в плане столбцов. Но копирует полностью массив, а необходимо чтоб копировал только массив определенного числа. Иначе говоря должен в столбце А найти необходимое число. Положем оно находится на 15ой строке. Значит верхнюю точку массива должен присвоить не Cells(3, 3) а Cells(15, 3), далее найти наше число +1 ниже. И поставить ограничение нижнего угла массива Cells(28, 7). А если нашего числа+1 нет, то ограничится пустой ячейкой.



0



2628 / 1634 / 744

Регистрация: 23.03.2015

Сообщений: 5,135

27.11.2017, 16:42

7

Цитата
Сообщение от DEN_ZH
Посмотреть сообщение

да по копированию это то что надо, в плане столбцов. Но копирует полностью массив, а необходимо чтоб копировал только массив определенного

Я же просил … показать на втором листе….

Цитата
Сообщение от DEN_ZH
Посмотреть сообщение

да по копированию это то что надо, в плане столбцов. Но копирует полностью массив, а необходимо чтоб копировал только массив определенного числа. Иначе говоря должен в столбце А найти необходимое число. Положем оно находится на 15ой строке. Значит верхнюю точку массива должен присвоить не Cells(3, 3) а Cells(15, 3), далее найти наше число +1 ниже. И поставить ограничение нижнего угла массива Cells(28, 7). А если нашего числа+1 нет, то ограничится пустой ячейкой.

Необходимо выделить значения определенной даты…- подтвердите, правильно ли я понял?

Добавлено через 3 минуты
Вечером дома посмотрю….



0



0 / 0 / 0

Регистрация: 03.10.2017

Сообщений: 12

28.11.2017, 05:45

 [ТС]

8

Да правильно. Необходимо чтобы бралось определенное число. Если вбиваю 27.11.2017 то брался массив с11:g41
если число 28.11.2017 то соответственно массив (с42:i) где i = до свободной ячейки в столбце D. И для копирования был запрос на ввод даты. Типа:
dat1 = CDate(InputBox(«Введите начало периода»))



0



0 / 0 / 0

Регистрация: 03.10.2017

Сообщений: 12

28.11.2017, 05:46

 [ТС]

9

обновленный файл



0



DEN_ZH

0 / 0 / 0

Регистрация: 03.10.2017

Сообщений: 12

28.11.2017, 09:35

 [ТС]

10

Макрос как я понимаю должен быть что то подобие этого:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Dim LastRow As Long, Rw As Long 'Объявили переменный послдедних строк для двух слистов
LastRow = Cells(Rows.Count, 4).End(xlUp).Row 'Нашли номер последней строки на активном листе (там, где кнопка)
With Sheets("Лист2") 'Применительно к Лист2
Rw = .Cells(Rows.Count, 4).End(xlUp).Row + 1 'Нашли номер первой свободной строки на этом листе
Range(.Cells(3, 1), .Cells(Rw + 1, 5)).ClearContents 'Очистили ПОЛНОСТЬЮ диапазон на втором листе
Rw = 7 'Указали, что первая свободная строка =7
For i = 3 To LastRow 'Цикл со строки № 3 по последнюю заполненную (на активном листе)
If Cells(i, 1) = "27.11.2017" Then 'Если ячейка столбца 1 текущей строки = "27.11.2017", то
Range(Cells(i, 3), Cells(i, 7)).Copy .Cells(Rw, 1) 'Дипазон (текущая строка, столбцы 3:7) копируем в первую свободную ячейку второго листа
Rw = Rw + 1 'Увеличивем переменную-счётчик первой свободной строки второго листа
End If
Next
End With

Единственные поправки в том, что во-первых: If Cells(i, 1) = «27.11.2017» Then
хотелось бы забивать через ввод значений в сообщения типа: dat1 = CDate(InputBox(«Введите начало периода»))

второе: макрос копирует не значения а формулы, а надо чтоб копировал формат ячейки и данные
ну и третье: как вписать копирование шапки таблицы как константу. с первого листа массива C1:G2

Добавлено через 1 час 34 минуты
После доработки пришел к виду, что я и хотел

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 Range("C1:G2").Select
    Selection.Copy
    Sheets("Лист2").Select
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
    Sheets("Лист1").Select
Dim LastRow As Long, Rw As Long 
LastRow = Cells(Rows.Count, 4).End(xlUp).Row 
With Sheets("Лист2") '
Rw = .Cells(Rows.Count, 4).End(xlUp).Row + 1
Range(.Cells(3, 1), .Cells(Rw + 1, 5)).ClearContents
Rw = 3 
For i = 3 To LastRow 
If Cells(i, 1) = "28.11.2017" Then 
Range(Cells(i, 3), Cells(i, 7)).Copy .Cells(Rw, 1)
Rw = Rw + 1 
End If
Next
End With

Не могу додумать как же вставить ввод числа (как пример dat1 = CDate(InputBox(«Введите начало периода»))), пробывал вставлять строку, и тогда начинается нескончаемый цикл с вводом числа. иначе с=говоря строка уходит в цикл

И не могу додумать как же все же на втором листе получить не формулы а значения в скопированных ячейках…

Добавлено через 3 минуты
ЗЫ. at1 = CDate(InputBox(«Введите начало периода»))) — уже приделал. пустил 1ой строкой. и ввод даты перестал входить в цикл



0



2628 / 1634 / 744

Регистрация: 23.03.2015

Сообщений: 5,135

28.11.2017, 23:05

11

DEN_ZH,

Посмотрите прикрепленный файл…
Двойной щелчок по ячейке «D1» (где написано «Время»)
Вместо Inputbox’a использовал фому…
Вводите дату в формате «ДД/ММ/ГГГГ»
Не учтены ошибки при вводе дат, таких как 31/02/2018 или 31/06/2017

Если что не понятно, пишите.

P.S. Простите за задержку, на работе -аврал.



0



DEN_ZH

0 / 0 / 0

Регистрация: 03.10.2017

Сообщений: 12

29.11.2017, 06:14

 [ТС]

12

Все просто замечательно, по этой задаче. Даже через форму сделано — это просто супер, но мы же простых путей не ищем. С кодом вроде все понятно так же. Но вот теперь еще другой вопрос: а если усложнить задачу таким образом, чтоб лист два был не физичиский лист, а переменный (иначе говоря виртуальный — как буфер обмена) чтоб происходило бы открытие нового файла, куда вставлялось бы, все то что скопировано и уходило по почте. (это вторая часть изночального соощения) мой код подобной работы выглядит так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Sub SaveSheet()
 
If Len(Dir("c:12321", vbDirectory)) = 0 Then MkDir "c:12321"
Dim ActiveSht As Worksheet
Dim NewWb As Workbook
 
    Set ActiveSht = ActiveSheet
    Set NewWb = Workbooks.Add
    ActiveSht.Copy Before:=Workbooks(NewWb.Name).Sheets(1)
    With ActiveSheet.UsedRange
        .Value = .Value
    End With
    
    ActiveWorkbook.SaveAs Filename:="C:12321" & [O2]
Application.DisplayAlerts = True
 
 
 
send_soft = "C:Program FilesMozilla Thunderbirdthunderbird.exe"
 
stroka1 = " -compose to='" & "gtk-557@mail.ru"
stroka2 = "',subject='" & ActiveWorkbook.Name
stroka3 = "',body="" Сводка 14ч. " '""
stroka4 = """,attachment=" & "'C:12321" & ActiveWorkbook.Name & "'"
stroka = send_soft & stroka1 & stroka2 & stroka3 & stroka4
 
Set SMs = CreateObject("WScript.Shell")
SMs.Exec stroka
 
NewWb.Close False 'закрываем старый файл без запроса сохранения
  Worksheets("Лист1").Activate
 
End Sub



0



0 / 0 / 0

Регистрация: 04.02.2019

Сообщений: 14

15.02.2019, 11:31

13

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

У меня есть Книга с 3 листами. Лист «СВОД» заполняется каждый день. Мне надо, чтоб в зависимости от того, какой поставщик указан (столбец С), данные копировались на соответствующий лист.

Важно!!! 1) В листах поставщиков («RP» & «LK») данные не должны перезаписывать предыдущие уже существующие, а должны добавляться ниже.
2) Лист «RP» — колонка Н — это колонка I Лист «СВОД» делить на 1000
3) Лист «LK» — колонка Н — это колонка I Лист «СВОД» делить на 1000

Как я вижу должен работать макрос.

Я заполняю Лист «СВОД». Затем вызываю макрос, указываю дату (Лист «СВОД» колонка В). Соответствующие данные копируются на свои листы.

Очень прошу мне помочь с макросом в решении моей проблемы. Спасибо!

P.S почему мне не подходит вариант это все сделать через формулы и ссылки. Потому что ежедневно добавляется до 100 новых строк. Учитывая такое количество формул — работа Книги будет очень медленной! Поэтому и нужно это все сделать через макрос.



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

16.02.2019, 01:28

14

Фильтры смотрю знакомы — почему бы не использовать их для этой задачи? Зачем плодить сущности?
Или есть ещё информация, которую Вы от нас скрыли?



0



0 / 0 / 0

Регистрация: 04.02.2019

Сообщений: 14

17.02.2019, 11:06

15

Зачем задавать риторические вопросы, упиваясь своим превосходством?

Фильтры возможно и знакомы, но человеку, совершенно не разбирающемуся в VBA — это совсем темный лес. Поэтому приходится просить помощи у людей разбирающихся, а не читать язвительные комментарии.



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

17.02.2019, 16:45

16

Так если есть задача посмотреть всё что относится к «RP» — выбираете в фильтре «RP» и смотрите. И обучаете как использовать фильтр того, кто задал Вам задачу растащить это всё по листам.
А если уж так нужно растащить — включаете рекордер, фильтруете, копируете что отфильтровали на нужный лист, выключаете рекордер — макрос готов. А все ИТОГО для упрощения процесса лучше вынести наверх.



0



0 / 0 / 0

Регистрация: 04.02.2019

Сообщений: 14

17.02.2019, 17:27

17

Уважаемый Hugo121,
Я Вас не понимаю, что за глупые рекомендации? 1) Как записать макрос так, чтоб он понял критерий, по которому надо отфильтровать (дата каждый день меняется)
2) Как показать какой диапазон надо копировать? Каждый день количество строк будет разным
3) Как показать рекордеру, куда надо вставлять копируемые данные? Если листы «RP» & «LK» пополняемые, а не перезаписываемые. Как мне указать, что данные должны вставляться в следующую свободную строку?
4) А ИТОГО мне обязательно надо внизу. Поэтому макрос еще должен умете не перезаписать эту строку, а спустить ее вниз.

Если бы все так было просто, я не стал тратить свое и чужое время на переписку.



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

17.02.2019, 18:03

18

1. Сам конечно не поймёт, ну разве что по отношению к текущей дате можно высчитать. Но можете указать нужную дату в инпутбоксе например, или присобачить любой календарь, универсальнее его взять с форума.
2. Ну фильтр ведь есть? Лишнего не увидите. Или всё же не умеете пользоваться фильтром, судя по вопросу?
3. А вот это уже то, о чём умолчали — нигде ранее я не видел что данные на листы нужно дополнять, а не копировать всё что отобрано фильтром. Но и для этого на форуме полно решений — ищите «как найти последнюю строку».
Но тогда кто будет следить чтоб Вы не наплодили дублей?
4. А вот это самое сложное, вернее самое муторное, поэтому я и говорил что

Цитата
Сообщение от Hugo121
Посмотреть сообщение

для упрощения процесса лучше вынести наверх

5. В целом всё не особо сложно, но мне например непонятно зачем это всё вообще нужно? Почему нельзя просто дополнять один лист, там ведь более миллиона строк? И этим упростить всем (и главное себе) жизнь?

Всё, больше никаких глупых рекомендаций



0



0 / 0 / 0

Регистрация: 04.02.2019

Сообщений: 14

25.02.2019, 12:41

19

Вот помогли сделать рабочий вариант решения моей проблемы (копирование по условию)



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

25.02.2019, 12:41

19

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