Louie77 Пользователь Сообщений: 17 |
#1 12.12.2016 12:23:51 Добрый день! ‘активируем книгу куда копируем
|
||
Sanja Пользователь Сообщений: 14838 |
#2 12.12.2016 12:31:40
Согласие есть продукт при полном непротивлении сторон. |
||
Louie77 Пользователь Сообщений: 17 |
Спасибо большое за помощь. Только я хочу спросить — если мне заранее неизвестно имя листа куда копируем, тогда как быть? Я могу узнать имя этого листа только открыв тот файл. |
Sanja Пользователь Сообщений: 14838 |
#4 12.12.2016 12:53:45 Можно имя заменить номером
Изменено: Sanja — 12.12.2016 12:53:54 Согласие есть продукт при полном непротивлении сторон. |
||
Louie77 Пользователь Сообщений: 17 |
Выдает ошибку Изменено: Louie77 — 12.12.2016 13:07:15 |
Louie77 Пользователь Сообщений: 17 |
Workbooks(«копирование столбцов.xlsx»).Worksheets(1).Columns(«A:A»).Copy На этой строке выходит Run-time error ‘9’: |
Sanja Пользователь Сообщений: 14838 |
#7 12.12.2016 14:03:47
Потому что в коде имя книги копирование столбцов.xlsx, а реально он называется копирование столбцов.xlsm Согласие есть продукт при полном непротивлении сторон. |
||
Louie77 Пользователь Сообщений: 17 |
Поменяла, теперь ругается этими же словами на вторую строчку, куда копируем. Там-то что ему не так? |
Louie77 Пользователь Сообщений: 17 |
Я может ошибаюсь, но Application.GetOpenFilename не возвращает ли нам весь путь к файлу? А нам ведь надо вынуть оттуда только имя с расширением? |
Sanja Пользователь Сообщений: 14838 |
#10 12.12.2016 14:26:08
Согласие есть продукт при полном непротивлении сторон. |
||||
Louie77 Пользователь Сообщений: 17 |
#11 12.12.2016 14:30:19 спасибо большое вам за помощь. У меня благодаря вам тоже получилось нечто. Не так красиво, как у вас, но тоже работает:
Спасибо еще раз огромное за вашу помощь. Изменено: Louie77 — 12.12.2016 14:31:49 |
||
Sanja Пользователь Сообщений: 14838 |
#12 12.12.2016 14:32:41
Согласие есть продукт при полном непротивлении сторон. |
||
Louie77 Пользователь Сообщений: 17 |
Это будет совсем хорошо, тогда макрос становится универсальным для меня |
Louie77 Пользователь Сообщений: 17 |
Пойду допишу в макрос еще сотню столбцов, это ведь был, так сказать , пробный. |
Kuzmich Пользователь Сообщений: 7998 |
#15 12.12.2016 14:56:23
Так она у вас и так активна ( при открытии книги) |
||
Louie77 Пользователь Сообщений: 17 |
Я знаю . Просто я ворона, убрала в комментарии и скопировала все до кучи. Спасибо за замечание, буду внимательнее. |
Louie77 Пользователь Сообщений: 17 |
#17 12.12.2016 15:12:52 Выложу сюда то, что получилось, вдруг кому пригодится
Изменено: Louie77 — 12.12.2016 15:17:19 |
||
Kuzmich Пользователь Сообщений: 7998 |
#18 12.12.2016 15:39:53
На мой взгляд
|
||||
Sub copy()
Dim x As Workbook
Dim y As Workbook
Set x = Workbooks.Open("C:UsersSaurabhDesktopBook2.xls")
Set y = Workbooks.Open("C:UsersSaurabhDesktopBook1.xls")
x.Sheets("sheet1").Range("G2").Value = x.Sheets("sheet1").Range("A2").Value
y.Sheets("sheet1").Range("H2").Value = x.Sheets("sheet1").Range("B2").Value
End Sub
shA.t
16.4k5 gold badges53 silver badges111 bronze badges
asked May 19, 2015 at 5:03
5
works fine in my machine, try it
Sub copy()
Dim x As Workbook
Dim y As Workbook
Set x = Workbooks.Open("C:UsersSaurabhDesktopBook2.xls")
Set y = Workbooks.Open("C:UsersSaurabhDesktopBook1.xls")
x.Sheets("sheet1").[A:A].copy x.Sheets("sheet1").[G:G] 'copy column from x [A:A] to x [G:G]
x.Sheets("sheet1").[B:B].copy y.Sheets("sheet1").[H:H] 'copy column from x [B:B] to y [H:H]
End Sub
answered May 19, 2015 at 5:58
VasilyVasily
5,7073 gold badges20 silver badges34 bronze badges
Below code copies the cells fine
Sub copy()
Dim x As Workbook
Dim y As Workbook
Set x = Workbooks.Open("C:UsersuserDesktopBook2.xlsx")
Set y = Workbooks.Open("C:UsersuserDesktopBook1.xlsx")
x.Sheets("sheet1").Range("G2").Value = y.Sheets("sheet1").Range("A2").Value
x.Sheets("sheet1").Range("H2").Value = y.Sheets("sheet1").Range("B2").Value
End Sub
answered May 19, 2015 at 5:57
S.KrishnaS.Krishna
85812 silver badges26 bronze badges
3
just fix that
From
x.Sheets("sheet1").Range("G2").Value = x.Sheets("sheet1").Range("A2").Value
y.Sheets("sheet1").Range("H2").Value = x.Sheets("sheet1").Range("B2").Value
To
x.Sheets("sheet1").Range("G2").Value = y.Sheets("sheet1").Range("A2").Value
x.Sheets("sheet1").Range("H2").Value = x.Sheets("sheet1").Range("B2").Value
answered May 19, 2015 at 5:13
0m3r0m3r
12.2k15 gold badges33 silver badges70 bronze badges
2
I’m pretty sure you need to capitalize your «s» in «sheet1», so it’s properly «Sheet1″. I believe it’s case-sensitive.
answered May 19, 2015 at 5:12
1
In this Article
- Rows & Columns – Paste vs. Insert
- Copy & Paste Over Existing Row / Column
- Copy & Insert Row / Column
- Copy Entire Row
- Cut and Paste Rows
- Copy Multiple Rows
- Copy Entire Column
- Cut and Paste Columns
- Copy Multiple Columns
- Copy Rows or Columns to Another Sheet
- Cut Rows or Columns to Another Sheet
This tutorial will teach you how to copy (or cut) entire Rows or Columns using VBA. We cover copying and pasting ranges of cells in another article.
First we will show you how to paste or insert copied rows/columns and discuss the differences. Then we will show you all of the different ways to references rows and columns when copying or cutting.
Rows & Columns – Paste vs. Insert
When pasting rows and columns you have two options: You can paste over the existing row (or column) or you can insert a new row (or column).
Let’s look at the difference…
Copy & Paste Over Existing Row / Column
This will copy row 1 and paste it into the existing row 5:
Range("1:1").Copy Range("5:5")
This will copy column C and paste it into column E:
Range("C:C").Copy Range("E:E")
Copy & Insert Row / Column
Instead you can insert the copied row or column and shift the existing rows or columns to make room.
This will copy row 1 and insert it into row 5, shifting the existing rows down:
Range("1:1").Copy
Range("5:5").Insert
This will copy column C and insert it into column E, shifting the existing columns to the right:
Range("C:C").Copy
Range("E:E").Insert
Copy Entire Row
Below we will show you several ways to copy row 1 and paste into row 5.
Range("1:1").Copy Range("5:5")
Range("A1").EntireRow.Copy Range("A5")
Rows(1).Copy Rows(5)
Cut and Paste Rows
Simply use Cut instead of Copy to cut and paste rows:
Rows(1).Cut Rows(5)
Copy Multiple Rows
Here are examples of copying multiple rows at once:
Range("5:7").Copy Range("10:13")
Range("A5:A7").EntireRow.Copy Range("A10:A13")
Rows("5:7").Copy Rows("10:13")
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More
Copy Entire Column
You can copy entire columns similarily to copying entire rows:
Range("C:C").Copy Range("E:E")
Range("C1").EntireColumn.Copy Range("C1").EntireColumn
Columns(3).Copy Range(5)
Cut and Paste Columns
Simply use Cut instead of Copy to cut and paste columns:
Range("C:C").Cut Range("E:E")
Copy Multiple Columns
Here are examples of copying multiple columns at once:
Range("C:E").Copy Range("G:I")
Range("C1:E1").EntireColumn.Copy Range("G1:I1")
Columns("3:5").Copy Columns("7:9")
VBA Programming | Code Generator does work for you!
Copy Rows or Columns to Another Sheet
To copy to another sheet, simply use the Sheet Object:
Sheets("sheet1").Range("C:E").Copy Sheets("sheet2").Range("G:I")
Cut Rows or Columns to Another Sheet
You can use the exact same technique to cut and paste rows or columns to another sheet.
Sheets("sheet1").Range("C:E").Cut Sheets("sheet2").Range("G:I")
I’m trying to write a macro that copies the content of column 1 from sheet 1 to column 2 on sheet 2. This is how the module looks like but, when I run it, I get
Run time error 9, Subscript out of range.
Sub OneCell()
Sheets("Sheet1").Select
'select column 1 A1'
Range("A1:A3").Select
Selection.Copy
Range("B1:B3").Select
ActiveSheet.Paste
Sheets("Sheet2").Select
Application.CutCopyMode = False
End Sub
ZygD
21k39 gold badges77 silver badges98 bronze badges
asked Jan 2, 2010 at 4:38
The following works fine for me in Excel 2007.
It is simple, and performs a full copy (retains all formatting, etc.):
Sheets("Sheet1").Columns(1).Copy Destination:=Sheets("Sheet2").Columns(2)
«Columns» returns a Range object, and so this is utilizing the «Range.Copy» method. «Destination» is an option to this method — if not provided the default is to copy to the paste buffer. But when provided, it is an easy way to copy.
As when manually copying items in Excel, the size and geometry of the destination must support the range being copied.
answered Dec 18, 2012 at 1:19
DavidDavid
5455 silver badges13 bronze badges
Selecting is often unnecessary. Try this
Sub OneCell()
Sheets("Sheet2").range("B1:B3").value = Sheets("Sheet1").range("A1:A3").value
End Sub
answered Jan 2, 2010 at 21:12
guitarthrowerguitarthrower
5,6043 gold badges28 silver badges37 bronze badges
4
If you have merged cells,
Sub OneCell()
Sheets("Sheet2").range("B1:B3").value = Sheets("Sheet1").range("A1:A3").value
End Sub
that doesn’t copy cells as they are, where previous code does copy exactly as they look like (merged).
Basic
26.1k24 gold badges112 silver badges197 bronze badges
answered Feb 9, 2012 at 14:38
LucyLucy
212 bronze badges
I’m not sure why you’d be getting subscript out of range unless your sheets weren’t actually called Sheet1
or Sheet2
. When I rename my Sheet2
to Sheet_2
, I get that same problem.
In addition, some of your code seems the wrong way about (you paste before selecting the second sheet). This code works fine for me.
Sub OneCell()
Sheets("Sheet1").Select
Range("A1:A3").Copy
Sheets("Sheet2").Select
Range("b1:b3").Select
ActiveSheet.Paste
End Sub
If you don’t want to know about what the sheets are called, you can use integer indexes as follows:
Sub OneCell()
Sheets(1).Select
Range("A1:A3").Copy
Sheets(2).Select
Range("b1:b3").Select
ActiveSheet.Paste
End Sub
answered Jan 2, 2010 at 4:46
paxdiablopaxdiablo
844k233 gold badges1565 silver badges1937 bronze badges
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, r As Range
Set rng = Intersect(Target, Range("a2:a" & Rows.Count))
If rng Is Nothing Then Exit Sub
For Each r In rng
If Not IsEmpty(r.Value) Then
r.Copy Destination:=Sheets("sheet2").Range("a2")
End If
Next
Set rng = Nothing
End Sub
Juan Mellado
15k5 gold badges47 silver badges54 bronze badges
answered Mar 17, 2012 at 16:58
1
Задача состоит в том, чтобы скопировать определенный диапазон текущего листа, открыть другую книгу, и вставить эти скопированные данные в определенную ячейку, сохранить этот файл и закрыть. Ниже приведен код 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
Если статья была вам полезна, то буду благодарен, если вы поделитесь ей со своими друзьями с помощью кнопок расположенных ниже.
Спасибо за внимание.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub asdf() Dim x As Integer, z As Integer, y As Integer, WB1 As Workbook, Wb2 As Workbook Dim Sh1 As Worksheet, Sh2 As Worksheet Set WB1 = Workbooks("тест1.xlsm") Set Wb2 = Workbooks("тест2.xlsm") WB1.Activate x = Cells(Rows.Count, 1).End(xlUp).Row Wb2.Activate y = Cells(Rows.Count, 1).End(xlUp).Row z = Rows("1:1").Find(What:="раз", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Column WB1.Activate WB1.Sheets(1).Range(Cells(x + 1, 1), Cells(x + y - 1, 1)).Value = Wb2.Sheets(1).Range(Cells(2, z), Cells(y, z)).Value ' первый вариант копирования Wb2.Activate Wb2.Sheets(1).Range(Cells(2, z), Cells(y, z)).Copy WB1.Sheets(1).Range(Cells(x + 1, 1), Cells(x + y - 1, 1)) 'второй вариант копирования End Sub |
Вырезание, перемещение, копирование и вставка ячеек (диапазонов) в 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») |