Копирование определенных столбцов с одного листа на другой с использованием ссылки на первую ячейку столбца

#vba #excel

#vba #excel

Вопрос:

Я пытаюсь скопировать столбцы листа ws12 в лист ws22 на основе заголовков столбцов на листе ws22.

 Sub secondprogram()

     Dim i As Integer
     Dim j As Integer
     For i = 1 To 3
         MsgBox i
         For j = 1 To 3
                     If Worksheets("ws22").Cells(1, i).Value = Worksheets("ws12").Cells(1, j).Value Then
                    'Worksheets("ws12").Range(Cells(2, j), Cells(10000, j)).Copy Destination:=Worksheets("ws22").Range(Cells(2, i), Cells(10000, i))
                     Worksheets("ws22").Range(Cells(2, i), Cells(10000, i)).Value = Worksheets("ws12").Range(Cells(2, j), Cells(10000, j)).Value
              End If
         Next j
     Next i
End Sub
  

Когда я использую msgbox, приходят правильные значения. но код показывает ошибку ошибка времени выполнения ‘1004’, определенная приложением или объектом ошибка, определенная в обеих строках

  Worksheets("ws12").Range(Cells(2, j), Cells(10000, j)).Copy _
     Destination:=Worksheets("ws22").Range(Cells(2, i), Cells(10000, i))

 Worksheets("ws22").Range(Cells(2, i), Cells(10000, i)).Value = _
     Worksheets("ws12").Range(Cells(2, j), Cells(10000, j)).Value
  

Ответ №1:

В обычном модуле или в этой рабочей книге каждое использование Range() or Cells() , которое не указано на рабочем листе, по умолчанию будет соответствовать ActiveSheet, поэтому рекомендуется всегда указывать их.

Так, в строке ниже, хотя вы имеете право Range() , прилагаемый Cells() каждый, обратитесь к параметру activesheet.

 Worksheets("ws22").Range(Cells(2, i), Cells(10000, i)).Value = _
     Worksheets("ws12").Range(Cells(2, j), Cells(10000, j)).Value
  

Чтобы устранить проблему, вам нужно быть более явным:

 Dim ws22 As WorkSheet
Dim ws12 As worksheet

Set ws22 = Worksheets("ws22")
Set ws12 = Worksheets("ws12")

'....

ws22.Range(ws22.Cells(2, i), ws22.Cells(10000, i)).Value = _
     ws12.Range(ws12.Cells(2, j), ws12.Cells(10000, j)).Value
  

Ответ №2:

При таком виде ссылки на объект range вам нужно повторить ссылку на лист. Попробуйте с этим:

  Worksheets("ws12").Range(Worksheets("ws12").Cells(2, j), Worksheets("ws12").Cells(10000, j)).Copy _
     Destination:=Worksheets("ws22").Range(Worksheets("ws22").Cells(2, i), Worksheets("ws22").Cells(10000, i))
  

или немного короче:

 With  Worksheets("ws12")
.Range(.Cells(2, j), .Cells(10000, j)).Copy _
     Destination:=Worksheets("ws22").Range(Worksheets("ws22").Cells(2, i), Worksheets("ws22").Cells(10000, i))
End with
  

Комментарии:

1. Большое вам спасибо, для понимания, есть ли особая причина для повторения ссылки на лист?