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
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")
Дмитрий Астахов Пользователь Сообщений: 11 |
#1 13.03.2023 21:04:50 Доброго времени суток.
Цель: Найти на Листе1 столбец, у которого в заголовке будет название «Date», например, и скопировать его в Лист2 в столбец, где будет такой же заголовок «Date» (заголовки могут гулять по столбцам, поэтому нужен их поиск).
Подскажите как выйти (и можно ли) из данной ситуации, буду благодарен за подсказки. |
||||
Пытливый Пользователь Сообщений: 4587 |
#2 13.03.2023 21:19:00 Доброго. Найти что-либо в диапазоне (например, строку «Date» можно, например, методом Range.Find. Например, если у нас заголовки на активном столбце содержатся в диапазоне А1:D1, то найти значение Date можно как-то так:
Далее, отталкиваясь от найденного значения, можно выделять столбцы (зачем целые столбцы? Можно же определенный диапазон, ячейки таблицы из этого столбца, зачем миллион с лишним ячеек выделять?), копировать, вставлять на новый лист и т.д. Т.е. примерно так — на одном листе нашли откуда копировать, на другом листе куда. Ну и скопировали. Кому решение нужно — тот пример и рисует. |
||
MikeVol Пользователь Сообщений: 229 Ученик |
#3 15.03.2023 01:12:08 Дмитрий Астахов, Здравствуйте. Может так вам надо?
Изменено: MikeVol — 15.03.2023 01:22:00 |
||
MikeVol
, Доброго времени суток. Макрос супер, правда не хотел через перечисление искать столбцы, искал только первый в списке, в данном примере «Date». Пытался заменить Split на что-то другое — эксель ругается, мол «не лезь дурак, оставь как есть». Поэтому я просто скопировал кусок начиная с «ArryHeader1…» вплоть до «Next», и уже там вписал другой столбец, и всё отлично заработало. Единственно момент, можно ли как-то найденные столбцы копировать полностью кроме первой строки? (имею в виду что он со второй строки (что кстати супер) копирует до последнего найденного символа, а если в столбце будет пробел, то всё после него он не увидит). Просто таблица, ИЗ которой я хочу копировать столбцы, ведётся не мной, а мало ли что там человек может напутать, намешать. И чтобы была защита от дурака, я хочу копировать либо весь столбец, либо для меньше загруженности Range задать. Но сам я как дурак с этим Range.EntireColumn попытался втиснуться, но пока безуспешно. Буду пробовать дальше, вдруг нащупаю «правильное направление мысли» Изменено: Дмитрий Астахов — 15.03.2023 09:59:50 |
|
Ігор Гончаренко Пользователь Сообщений: 13746 |
#5 15.03.2023 10:50:08 пробуйте этот
Изменено: Ігор Гончаренко — 15.03.2023 10:50:40 Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
MikeVol Пользователь Сообщений: 229 Ученик |
#6 15.03.2023 11:48:15 Дмитрий Астахов, Здравствуйте! А так точно то что вам нужно?
Обратите внимание как правильно надо было вписать заголовки в ArryHeader1 и ArryHeader2 а не лепить горбатого! В комментариях для этих строк я же написал что и как! |
||
Ігор Гончаренко
, шо-то он мне выдал ошибку 400, и усё, вроде даже перепроверил, может недокопировал чего, а он всё равно не хочет |
|
MikeVol
, теперь всё супер, спасибо за Ваше терпение и труд )) Эти кавычки в экселе меня периодически ставят в тупик, и частенько я их пихаю уже куда не следовало бы. Ошибка новичка, так сказать |
|
в файле из сообщния 4 с такой строкой: Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
MikeVol Пользователь Сообщений: 229 Ученик |
#10 15.03.2023 13:01:27 Дмитрий Астахов, А, так вам надо было копировать столбцы со второго листа в первый лист? Тогда мой код не будет работать! Код Ігор Гончаренко из его #5 тогда то что вам надо! Обновление!
Изменено: MikeVol — 15.03.2023 13:16:52 |
||
Вырезание, перемещение, копирование и вставка ячеек (диапазонов) в 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») |
how to use VBA’s End(xlRight) to copy one column’s value to another one?
like I want to always copy columnZ’s range(«Z4:Z203») value to another column’s range(«i5:i204»),how can i use End(xlright) check if the column was pasted and it will paste on next column ?
asked Jan 13, 2015 at 8:54
Why not simply copy always the needed range?
Sub test()
Range("Z4:Z203").Select
Selection.Copy
Range("I5:I204").Select
ActiveSheet.Paste
End Sub
answered Jan 14, 2015 at 9:08
KᴀτᴢKᴀτᴢ
2,1266 gold badges28 silver badges57 bronze badges
Working Environment: Excel 2013
Target: Copy C1:C9 to B11:B19. D1:D9 to B21:B29. E1:E9 to B31:B39…..
After copying all the range to column B, copy A1:A9 to A11:A19(A21:A29….)
My idea is that:
1. select a range by using something like
range.end()
because in some of my sheets, there are only 4 test steps. so I need a syntax which can self inspect the used cells in a column.
- do a range copy to column B.
- leave 1 row in between considering about the page layout.
My piece of code is:
Worksheets("Master").Columns(3).UsedRange.Copy
Worksheets("Master").Range("B11").PasteSpecial
but seems like the Columns(i).UsedRange.Copy doesn’t work. the pastespecial works.
My question is:
How to select the used range in columns? The number of columns are not fixed which means some of the sheets have 40 columns, but some of the other have maybe 30.
Thanks!
I attached one screenshot of the sheet for your reference.
asked May 15, 2017 at 1:03
2
Assuming you do not have more data in the columns to be copied, this should work
Sub copyToOneColumn()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Master")
Dim startCol As Integer
startCol = 3
Dim endCol As Integer
endCol = 10
Dim startRange As Range
Dim ra As Range
For i = startCol To endCol
Set startRange = ws.Range("A1").Offset(0, i - 1)
Set ra = ws.Range(startRange, ws.Cells(Rows.Count, startRange.Column).End(xlUp))
ra.Copy Destination:=ws.Range("B" & Rows.Count).End(xlUp).Offset(2, 0)
Next i
End Sub
answered May 15, 2017 at 3:15
nightcrawler23nightcrawler23
2,0461 gold badge14 silver badges22 bronze badges
You can do a copy (not technically a copy as it doesn’t use the clipboard) directly like so:
Range("B1").Resize(Range("A1:A" & range("A" & Rows.Count).End(xlUp).Row).Rows.Count,1) = Range("A1:A" & range("A" & Rows.Count).End(xlUp).Row).Value
Effectively you are looking at B1 then resizing that to a range to be the number of columns in column A that are used with this: Range("A1:A" & range("A" & Rows.Count).End(xlUp).Row).Rows.Count
Then you are making this new range in column B = to the values of the same range in column A.
Note, this can be shortened if you are always starting at row 1 but the code I have given you will suffice if you start at a different row.
answered May 15, 2017 at 3:37
Dan DonoghueDan Donoghue
5,9662 gold badges18 silver badges36 bronze badges
You may try something like this…
Sub CopyData()
Dim wsMaster As Worksheet
Dim lr As Long, lc As Long, r As Long, c As Long
Application.ScreenUpdating = False
Set wsMaster = Sheets("Master")
lr = wsMaster.Cells(Rows.Count, 1).End(xlUp).Row
lc = wsMaster.Cells(1, Columns.Count).End(xlToLeft).Column
r = lr + 2
If lr <= 9 Then
For c = 3 To lc
wsMaster.Range(wsMaster.Cells(1, c), wsMaster.Cells(lr, c)).Copy wsMaster.Range("B" & r)
wsMaster.Range("A1:A" & lr).Copy wsMaster.Range("A" & r)
r = wsMaster.Cells(Rows.Count, 2).End(xlUp).Row + 2
Next c
End If
Application.ScreenUpdating = True
End Sub
answered May 15, 2017 at 4:40
Sub Макрос()
Dim c As Long
‘ Отключение монитора и пересчёта формул.
‘ Необходимости в этом нет, сделано просто так.
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
‘ Пересчёт формул на активном листе.
ActiveSheet.Calculate
‘ Копирование столбца F в первый пустой столбец.
‘ Формулы заменяются на значения.
c = Cells(1, Columns.Count).End(xlToLeft).Column + 1
Columns(«F»).Copy
Cells(1, c).PasteSpecial xlPasteColumnWidths
Cells(1, c).PasteSpecial xlPasteFormats
Cells(1, c).PasteSpecial xlPasteValues
Application.CutCopyMode = False
‘ Включение пересчёта формул.
Application.Calculation = xlCalculationAutomatic
End Sub
[свернуть]