#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. Большое вам спасибо, для понимания, есть ли особая причина для повторения ссылки на лист?