Как копировать столбцы с одного листа на другой с помощью VBA в Excel?
Я пытаюсь написать макрос, который копирует содержимое столбца 1 из листа 1 в столбец 2 на листе 2. Вот как выглядит модуль, но когда я его запускаю, я получаю
Ошибка времени выполнения 9, подзаголовок вне диапазона.
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
Ответы
Ответ 1
Следующее работает отлично для меня в Excel 2007.
Он прост и выполняет полную копию (сохраняет все форматирование и т.д.):
Sheets("Sheet1").Columns(1).Copy Destination:=Sheets("Sheet2").Columns(2)
"Столбцы" возвращают объект Range, поэтому используется метод Range.Copy. "Назначение" - это опция для этого метода - если не указано, что по умолчанию используется копирование в буфер пасты. Но при условии, это простой способ для копирования.
Как и при копировании вручную в Excel, размер и геометрия адресата должны поддерживать скопированный диапазон.
Ответ 2
Выбор часто не нужен. Попробуйте это
Sub OneCell()
Sheets("Sheet2").range("B1:B3").value = Sheets("Sheet1").range("A1:A3").value
End Sub
Ответ 3
Я не уверен, почему вы будете получать индексы вне диапазона, если ваши листы фактически не называются Sheet1
или Sheet2
. Когда я переименую свой Sheet2
в Sheet_2
, я получаю ту же самую проблему.
Кроме того, некоторые из вашего кода выглядят неправильно (вы вставляете перед выбором второго листа). Этот код отлично подходит для меня.
Sub OneCell()
Sheets("Sheet1").Select
Range("A1:A3").Copy
Sheets("Sheet2").Select
Range("b1:b3").Select
ActiveSheet.Paste
End Sub
Если вы не хотите знать, что вызывают листы, вы можете использовать целые индексы следующим образом:
Sub OneCell()
Sheets(1).Select
Range("A1:A3").Copy
Sheets(2).Select
Range("b1:b3").Select
ActiveSheet.Paste
End Sub
Ответ 4
Если вы объединили ячейки,
Sub OneCell()
Sheets("Sheet2").range("B1:B3").value = Sheets("Sheet1").range("A1:A3").value
End Sub
который не копирует ячейки так, как они есть, где предыдущий код копирует точно так, как они выглядят (объединены).
Ответ 5
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