Когда-то на одном из форумов пытался эту тему развернуть и дал такой ответ:
По умолчанию для всех объектов родительским объектом является текущий объект(если он может быть использован в качестве родителя). Т.е. если для ячейки не указать явно лист, к которому она относится, в качестве родительского листа для неё будет использован текущий(за исключением случаев, когда код записан в модуле листа - тогда в качестве родителя будет использован лист, в котором записан код). В конструкциях типа Range(Cells(,),Cells(,)) Range является контейнером, в котором указываются ссылки на объекты, из которых и будет создана ссылка на непосредственно конечный объект.
Предположим, что активен "Лист1", а код запущен с листа "Итог".
Если запись будет вида
Sheets("Итог").Range(Cells(1,1),Cells(10,1))
это вызовет ошибку(контейнер и объекты внутри него не могут располагаться на разных листах), равно как и
Код |
---|
Sheets("Итог").Range(Cells(1,1),Sheets("Итог").Cells(10,1)) |
и
Код |
---|
Range(Cells(1, 1), Sheets("Итог").Cells(10, 1)) |
т.к. ссылки на объекты внутри контейнера относятся к разным листам.
А вот такие записи будут правильными:
Код |
---|
Sheets("Итог").Range(Sheets("Итог").Cells(1,1),Sheets("Итог").Cells(10,1))
Range(Sheets("Итог").Cells(1,1),Sheets("Итог").Cells(10,1)) |
Вторая запись не содержит ссылки на родителя для Range, но ошибки это не вызовет - т.к. если для контейнера ссылка не указана, а для двух объектов внутри контейнера родитель один - он будет применен и для самого контейнера.
Если запись будет вида Range("A1","A10"), то указывать ссылку на родителя внутри Range не обязательно - достаточно будет указать эту ссылку перед самим Range - Sheets("Итог").Range("A1","A10"), т.к. текстовое представление адреса внутри Range обязывает создать ссылку именно на родителя контейнера.
В примере:
Код |
---|
With Sheets("Итог").Range("E2:E" & Cells(Rows.Count, 1).End(xlUp).Row)
.FormulaR1C1 = "=SUMIF(Лист1!C4,RC1,Лист1!C11)"
End With |
Запись смешанная - и текстовое представление адреса ячейки и ссылка на объект Cells. В данном случае явную ошибку код не вызовет, но и работает не всегда так, как хотелось бы.
Sheets("Итог").Range("E2:E" - создается ссылка на столбец Е листа Итог. Но далее идет вычисление последней строки первого столбца. И вот как раз это вычисление происходит на основе объекта Cells, который не содержит в себе ссылки на родительский объект. А значит он будет вычислять последнюю строку исключительно для текущего листа(если код записан в стандартном модуле). Правильно было бы записать тогда так:
Код |
---|
With Sheets("Итог").Range("E2:E" & Sheets("Итог").Cells(Rows.Count, 1).End(xlUp).Row)
.FormulaR1C1 = "=SUMIF(Лист1!C4,RC1,Лист1!C11)"
End With |
Надеюсь, что мне удалось дать достаточно развернутый и доступный для понимания ответ.