это потому, что свойство Range()
объекта Worksheet
будет принимать два параметра Range
(начальный и конечный ссылки на диапазон требуемого диапазона), в то время как вы задаете только один (Range(Cells(1, 1)
) ).
так что вы бы код:
sh1.Range(Cells(1, 1), Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)
или
sh1.Range(Cells(1, 1), Cells(12, 8)).Copy Destination:=sh2.Range("A1")
что выше должно исправить ошибку
также помните, что без явной ссылки Sheet
объект Range
будет неявно принимать его как ActiveSheet
, поэтому ваш код будет таким же, как:
sh1.Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)
, что может быть не тем, что вам нужно, если sh1
не является текущим Активным sheet
.
следовательно, вы бы правильно написали:
sh1.Range(sh1.Cells(1, 1), sh1.Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)
или
Range(sh1.Cells(1, 1), sh1.Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)
, где вы можете заметить, вы можете опустить ссылку на внешний лист, поскольку использование квалифицированных ссылок Range
в качестве параметров свойства Range
приводит к тому, что возвращенная ссылка Range
ссылается на тот же лист, что и у двух параметров
наконец, вы можете избежать всей этой нагрузки, используя Range(string address, string address)
запись свойства Range и просто код:
sh1.Range("A1:H12").Copy Destination:=sh2.Cells(1, 1)
или
sh1.Range("A1:H12").Copy Destination:=sh2.Range("A1")