Задача состоит в том, чтобы скопировать определенный диапазон текущего листа, открыть другую книгу, и вставить эти скопированные данные в определенную ячейку, сохранить этот файл и закрыть. Ниже приведен код 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
Если статья была вам полезна, то буду благодарен, если вы поделитесь ей со своими друзьями с помощью кнопок расположенных ниже.
Спасибо за внимание.
yelena321 Пользователь Сообщений: 40 |
#1 01.07.2018 13:12:15 Здравствуйте! Подсмотрела подходящий код для своей ситуации. Значения указанного диапазона ячеек копируются в книгу, где прописан макрос. Не подскажите как указать в коде, чтобы название книги, листа от куда надо брать значение ячеек бралось из ячейки книги, где прописан макрос. C:Данные.xlsx указано в ячейке A1. Название листа в ячейке A2. Диапазон копируемых ячеек указано в ячейке A3. Место копирования A4.
Спасибо!!!!! |
||
ocet p Пользователь Сообщений: 438 |
#2 01.07.2018 16:04:39 Вы можете, например, таким образом:
Прикрепленные файлы
|
||
yelena321 Пользователь Сообщений: 40 |
Ооооой, как-то сложно надо разобраться.Спасибо. |
Hugo Пользователь Сообщений: 23249 |
#4 01.07.2018 16:55:04 Есть вариант попроще:
Изменено: Hugo — 01.07.2018 16:55:55 |
||
yelena321 Пользователь Сообщений: 40 |
Мне важно, чтобы в коде макроса не указывались имена (книги, листа, ячеек), а были прописаны в ячейках книги, где прописан макрос. Так как файлов много. Ежемесячно названия меняются и тогда переписывать макрос. |
yelena321 Пользователь Сообщений: 40 |
ocet p, макрос дает ошибку. Скрины в файле. |
Ігор Гончаренко Пользователь Сообщений: 13746 |
#7 01.07.2018 19:01:42 так?
Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
Inexsu Пользователь Сообщений: 758 |
#8 01.07.2018 19:06:28 Привет!
Пожалуйста, приложите оба Ваших файла с образцом данных. В сообщении 1 видны нестыковки … Сравнение прайсов, таблиц — без настроек |
||
Ігор Гончаренко Пользователь Сообщений: 13746 |
#9 01.07.2018 19:07:34 или так:
Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
yelena321 Пользователь Сообщений: 40 |
|
Inexsu Пользователь Сообщений: 758 |
#11 01.07.2018 20:22:26
Где? Сравнение прайсов, таблиц — без настроек |
||
yelena321 Пользователь Сообщений: 40 |
Пардон, не то прикрепила. Прикрепленные файлы
|
ocet p Пользователь Сообщений: 438 |
#13 01.07.2018 20:34:34
??? Ну, и где эти скрины ? |
||
yelena321 Пользователь Сообщений: 40 |
Скрины на листе 2, 3 Прикрепленные файлы
|
Ігор Гончаренко Пользователь Сообщений: 13746 |
#15 01.07.2018 21:13:34 yelena321,
а Вы исправляете в А4 С18 с Эс18 на Си18 Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
yelena321 Пользователь Сообщений: 40 |
#16 01.07.2018 21:27:29 ВСЕ ОК.!!!!!!!! Спасибо огромное. |
Не переписывая Ваш код, просто добавил вторую строку
[vba]
Код
r1_ = Workbooks(«Откуда.xlsx»).Worksheets(«Лист1»).Range(«A» & Rows.Count).End(xlUp).Row — 1
Workbooks(«Откуда.xlsx»).Worksheets(«Лист1»).Range(«A2:B» & r1_).Copy
…
[/vba]
Добавлено.
Поправил. Забыл единичку вычесть
А вообще, переписать если, то можно так, например
[vba]
Код
Sub Название_Копи()
Application.ScreenUpdating = 0
Range(Range(«B5»), Range(«B5»).SpecialCells(xlLastCell)).ClearContents
Workbooks.Open Filename:=ThisWorkbook.Path & «Откуда.xlsx»
With Workbooks(«Откуда.xlsx»).Worksheets(«Лист1»)
r1_ = .Range(«A» & .Rows.Count).End(xlUp).Row — 1
ThisWorkbook.Worksheets(«Лист1»).Range(«B5»).Resize(r1_ — 1, 2) = .Range(«A2:B» & r1_).Value
ThisWorkbook.Worksheets(«Лист1»).Range(«D5»).Resize(r1_ — 1) = .Range(«E2:E» & r1_).Value
Workbooks(«Откуда.xlsx»).Close
End With
End Sub
[/vba]
Вырезание, перемещение, копирование и вставка ячеек (диапазонов) в 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») |
Despite many posts I have looked through being of along the same lines as my question, none of the answers satisfy what I am looking for. If you can link me to one I’d gladly read it.
I have a workbook with worksheets. For simplicity, let’s say my workbook has a worksheet. And in my worksheet which is called «Sheet1», there is data in cells A1 to A4.
What I want my VBA code to do is:
- Copy row 1 (or specifically cells A1 to A4) of Workbook ‘A’ into Range variable ‘myRange’
- Create a new workbook, let’s call this one Workbook ‘B’
- Give Workbook ‘B’s default «sheet1» a new name to «Test Name»
- Open Workbook ‘B’ (though I realise that VBA code «Workbooks.Add» opens a new book so this step may be redundant since Workbooks.Add covers half of point 2 and 3)
- Paste ‘myRange’ into first row of ‘Workbook B’
- Save ‘Workbook B’ with name «Test Book» and a timestamp enclosed in square brackets. The file must also be of the file extension «xls»
- Close ‘Workbook B’ and return to ‘Workbook A’
What I have so far is this:
Sub OpenAndSaveNewBook()
'Declarations
Dim MyBook As String
Dim MyRange As Range
Dim newBook As Workbook
'Get name of current wb
MyBook = ThisWorkbook.Name
Set MyRange = MyBook.Sheets("Sheet1").Range("A1,F1")
'Create/Open new wb
newBook = Workbooks.Add
'Save new wb with XLS extension
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "/" & "TEST-BOOK", _
FileFormat:=xlNormal, CreateBackup:=False
'===NOTE: BEFORE THE FOLLOWING RUNS I NEED TO PERFORM ACTIONS ON CELLS VIA VBA ON
'===WORKBOOK 'A'. DOES THE NEWLY CREATE WORKBOOK BECOME THE PRIMARY/ACTIVE WORKBOOK
'===? AND SO THEN DO I NEED TO ACTIVATE WORKBOOK 'A'?
ActiveWorkbook.Close savechanges:=True
'Return focus to workbook 'a'
MyBook.Activate
End Sub
As you can see, I am lacking the code that will handle:
- the pasting of my copied data to the new workbook
- the changing of the new workbook’s sheet1 name to something else
- adding a timestamp to the filename string on save
Lastly, I have included a question in my code as I think I may have a misunderstanding of the ActiveWorkbook method. AFAIK when the code «Workbooks.Add» runs this becomes the Active Workbook, i.e. one with the focus. Does this effect how the VBA code running on Workbook ‘A’? Does this mean that if I wanted to add code to manipulate cells of Workbook ‘A’ then I would need to use «MyBook.Activate» where ‘MyBook’ holds the string of Workbook ‘A’s actual title?
Any help will be greatly appreciated.
Thanks,
QF