Как копировать столбцы с одного листа на другой с помощью 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