Подтвердить что ты не робот

Это. in. Изменить, если это определено .Cells?

Принято считать, что это не "лучшая практика".

dim rng as range
with thisworkbook    '<~~ possibly set an external workbook 
    with .worksheets("sheet1")
        set rng = .range(cells(2, 1), cells(rows.count, 1).end(xlup))
    end with
end with

Два свойства Range.Cells, которые определяют область действия объекта Range, по умолчанию будут иметь свойство ActiveSheet. Если это не Sheet1 (определяется как .Parent в операторе With... End With), назначение не будет выполнено,

Run-tim error '1004': Application-defined or object-defined error

Решение: используйте .Cells не Cells. Дело закрыто.

Но...

Это . необходимо в этом определении объекта Range, когда оба свойства Range.Cells наследуют свойство рабочего листа .Parent, определенное в операторе With... End With?

Как это может,

dim rng as range
with thisworkbook    '<~~ possibly set an external workbook 
    with .worksheets("sheet1")
        ' define rng as Sheet1!A2 to the last populated cell in Sheet1!A:A
        set rng = .range(.cells(2, 1), .cells(rows.count, 1).end(xlup))  '<~~ .range
    end with
end with
debug.print rng.address(0, 0, external:=true)

... отличаться от этого,

dim rng as range
with thisworkbook    '<~~ possibly set an external workbook 
    with .worksheets("sheet1")
        ' define rng as Sheet1!A2 to the last populated cell in Sheet1!A:A
        set rng = range(.cells(2, 1), .cells(rows.count, 1).end(xlup))  '<~~ range not .range
    end with
end with
debug.print rng.address(0, 0, external:=true)

Мы используем .range когда параметры, определяющие область действия диапазона, неоднозначны; например .range([A1]) Ячейка A1 может быть из любого рабочего листа и по умолчанию будет иметь свойство ActiveSheet без . , Но почему мы должны ссылаться на родителя объекта диапазона, когда определяющая его область правильно ссылается на родительский лист?

4b9b3361

Ответ 1

Мое мнение здесь немного другое.

ДА требуется. Вы не можете всегда контролировать, где пользователь может запустить код.

Пожалуйста, рассмотрите эти несколько тестовых случаев

СЦЕНАРИЙ

В книге есть 2 листа. Sheet1 и Sheet2


ИСПЫТАНИЕ 1 (Работа с модулем)

Оба кода дают одинаковый результат

ИСПЫТАНИЕ 2 (Выполняется из области кода листа Sheet1)

Оба кода дают одинаковый результат

ИСПЫТАНИЕ 3 (Выполняется из области кода листа Sheet2)

'~~> This code fails
set rng = range(.cells(2, 1), .cells(rows.count, 1).end(xlup))

Вы получите ошибку Application Defined or Object defined

введите описание изображения здесь

И поэтому всегда желательно правильно квалифицировать ваши объекты, чтобы код мог работать из любого места

Ответ 2

Нет, . не требуется, если ссылки на ячейку внутри скобок квалифицированы, если код не находится в модуле Worksheet. Тем не менее, он быстрее запускает set rng = .range(.cells(...), .cells(...)), чем запускает set rng = range(.cells(...), .cells(...)), поэтому включение . делает что-то хорошее.

Для модуля Worksheet требуется ..

Ответ 3

Ответ выглядит так: только если код находится в объекте Worksheet. Я сильно подозреваю, что это связано с тем, что объекты Worksheet являются единственными, которые являются расширяемыми и имеют функцию Range. Когда Range вызывается из рабочего листа, функция объекта Range имеет область видимости. Когда код находится в ThisWorkbook или пользовательском модуле или классе, функция Range с ближайшей доступной областью - это глобальный объект Range (предполагая, конечно, что функция Range не определена пользователем). Этот привязан к Application, который должен разрешить его на основе переданных параметров и перенаправить вызов на правильный рабочий лист.