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

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

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

 

yelena321

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

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

#1

01.07.2018 13:12:15

Здравствуйте! Подсмотрела подходящий код для своей ситуации. Значения указанного диапазона ячеек копируются в книгу, где прописан макрос.

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

C:Данные.xlsx указано в ячейке A1.  Название листа в ячейке A2. Диапазон копируемых ячеек указано в ячейке A3. Место копирования A4.

Код
Workbooks.Open Filename:="C:Данные.xlsx"
Workbooks("Данные.xlsx").Worksheets("Лист1").Range("A16:E16").Copy
Workbooks("Книга1.xlsm").Activate
ActiveWorkbook.Worksheets("Лист1").Range("A1").Select
ActiveSheet.Paste 
Workbooks("Данные.xlsx").Close

Спасибо!!!!!

 

ocet p

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

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

#2

01.07.2018 16:04:39

Вы можете, например, таким образом:

Код
Option Explicit
Option Private Module

Sub otkroy_kopiruy_zakroy()
Dim kngDostup As String, kngList As String, kngDiapazon As String, kngMestoKop As String
Dim tbl() As Variant
Dim istdann As Object

Const bazList As String = "List2"       'Nastroyki

    Application.ScreenUpdating = False
    
    With ThisWorkbook
        With .Sheets(bazList)
            kngDostup = .Range("A1").Value
            kngList = .Range("A2").Value
            kngDiapazon = .Range("A3").Value
            kngMestoKop = .Range("A4").Value
        End With
        
        Set istdann = GetObject(kngDostup)
        'Windows(istdann.Name).Visible = True
        tbl = istdann.Sheets(kngList).Range(kngDiapazon).Value
        istdann.Close SaveChanges:=False
        Set istdann = Nothing
        
        With .Sheets(kngMestoKop)
            With .Range("A1")
                .Resize(UBound(tbl, 1), UBound(tbl, 2)).Value = tbl
                .CurrentRegion.EntireColumn.AutoFit
            End With
            Erase tbl
            .Activate
        End With
    End With
    
    Application.ScreenUpdating = True
End Sub

Прикрепленные файлы

  • Kniga.zip (7.71 КБ)

 

yelena321

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

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

Ооооой, как-то сложно надо разобраться.Спасибо.

 

Hugo

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

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

#4

01.07.2018 16:55:04

Есть вариант попроще:

Код
Sub tt()

    Dim wb As Object, s As String
    s = [A2]
    Set wb = Workbooks.Open([A1])
    wb.Worksheets(s).Range("A16:E16").Copy Workbooks("Книга1.xlsm").Sheets("Лист1").Range("A1")
    wb.Close 0

End Sub

Изменено: Hugo01.07.2018 16:55:55
(раскладка ёлы палы…)

 

yelena321

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

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

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

 

yelena321

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

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

ocet p, макрос дает ошибку. Скрины в файле.

 

Ігор Гончаренко

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

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

#7

01.07.2018 19:01:42

так?

Код
Sub CoptSameData()
  Workbooks([a1]).Worksheets([a2]).Range([a3]).Copy Range([a4])
End Sub

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Inexsu

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

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

#8

01.07.2018 19:06:28

Привет!

Цитата
yelena321 написал:
Скрины в файле.

Пожалуйста, приложите оба Ваших файла с образцом данных. В сообщении 1 видны нестыковки …

Сравнение прайсов, таблиц — без настроек

 

Ігор Гончаренко

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

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

#9

01.07.2018 19:07:34

или так:

Код
Sub CoptSameData2()
  Workbooks.Open [a1]
  Worksheets([a2]).Range([a3]).Copy ThisWorkbook.Worksheets(1).Range([a4])
  ActiveWorkbook.Close False
End Sub

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

yelena321

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

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

 

Inexsu

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

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

#11

01.07.2018 20:22:26

Цитата
yelena321 написал:
C:Данные.xlsx указано в ячейке A1.  Название листа в ячейке A2. Диапазон копируемых ячеек указано в ячейке A3. Место копирования A4.

Где?

Сравнение прайсов, таблиц — без настроек

 

yelena321

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

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

Пардон, не то прикрепила.

Прикрепленные файлы

  • Проба.xlsm (15.19 КБ)

 

ocet p

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

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

#13

01.07.2018 20:34:34

Цитата
yelena321 написал:
макрос дает ошибку. Скрины в файле

???

Ну, и где эти скрины ?
Там только какие-то … «gfdgddfgdfg» … как бы будто кто-то пытался проглотить горячую цветную капусту … ?
Какая там ошибка ?

 

yelena321

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

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

Скрины на листе 2, 3

Прикрепленные файлы

  • Проба.xlsm (276.77 КБ)

 

Ігор Гончаренко

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

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

#15

01.07.2018 21:13:34

yelena321,
хорошо, убедили! давайте договоримся так:
я исправляю свой макрос:

Код
Sub CoptSameData2()
  Dim ws0: Set ws0 = ActiveSheet
  Workbooks.Open [a1]
  Worksheets(ws0.[a2].Value).Range(ws0.[a3]).Copy ws0.Range(ws0.[a4])
  ActiveWorkbook.Close False
End Sub

а Вы исправляете в А4 С18 с Эс18 на Си18

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

yelena321

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

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

#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:

  1. Copy row 1 (or specifically cells A1 to A4) of Workbook ‘A’ into Range variable ‘myRange’
  2. Create a new workbook, let’s call this one Workbook ‘B’
  3. Give Workbook ‘B’s default «sheet1» a new name to «Test Name»
  4. 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)
  5. Paste ‘myRange’ into first row of ‘Workbook B’
  6. Save ‘Workbook B’ with name «Test Book» and a timestamp enclosed in square brackets. The file must also be of the file extension «xls»
  7. 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

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