VBA copy.range не понимаю, почему не работает - PullRequest
0 голосов
/ 18 ноября 2018

Мне просто нужно скопировать диапазон с одного листа на другой, и я могу сделать это по-другому, но я хочу понять, почему этот код не работает. Пожалуйста, не могли бы вы объяснить?

Sub cioy()    
    Dim wb As Workbook    
    Dim sh1 As Worksheet    
    Dim sh2 As Worksheet   
    Set wb = ActiveWorkbook
    Set sh1 = wb.Sheets("sh1")    
    Set sh2 = wb.Sheets("sh2")  
    sh2.Cells.ClearContents    
    sh1.Range(Cells(1, 1), Cells(12, 8)).Copy Destination:=sh2.Range(Cells(1, 1))    
End Sub

enter image description here

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

это потому, что свойство 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")
0 голосов
/ 18 ноября 2018

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

Public Sub cioy()
    Dim wb As Workbook
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet

    Set wb = ActiveWorkbook
    Set sh1 = wb.Worksheets("sh1")
    Set sh2 = wb.Worksheets("sh2")

    sh2.Cells.ClearContents

    With sh1
        .Range(.Cells(1, 1), .Cells(12, 8)).Copy Destination:=sh2.Cells(1, 1)
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...