BoldBorderAllCellOfRAnge (r)
Это вызывает BoldBorderAllCellOfRAnge
, но передаваемый аргумент не является объектом.
(r)
в качестве аргумента означает "let-coerce r
в значение, затем передайте это значение к вызываемой процедуре "- не оказывает никакого влияния в данном конкретном случае, но обратите внимание, что это фактически устанавливает значение ByVal
, поскольку вызывающий код не содержит ссылку (локальную переменную) на результат этого выражения.
Обратите внимание на пробел между BoldBorderAllCellOfRAnge
и (r)
: это VBE, сообщающий вам, что скобки являются частью аргумента , а не вызовом процедуры (т.е. они не разделяют запятый список аргументов)
Это будет синтаксическая ошибка времени компиляции:
BoldBorderAllCellOfRAnge (r, 42)
Поскольку выражение (r, 42)
не может быть оценено, оно ничего не значит для VBA.
r
, являющийся Range
объектом, let-принуждение неявно вызывает его скрытый [_Default]
член, который в этом случае возвращает 2D-вариантный массив - BoldBorderAllCellOfRAnge
получает этот 2D-вариантный массив и говорит "чувак, я спросил для объекта reference », следовательно,« объект требуется ».
Итак, чтобы исправить ошибку, просто удалите скобки:
BoldBorderAllCellOfRAnge r
В качестве альтернативы введите ключевое слово Call
(Rubberduck будет пометить его как устаревший и предлагают полностью удалить его ):
Call BoldBorderAllCellOfRAnge(r)
Обратите внимание, что VBE больше не будет принудительно заполнять пробел между именем процедуры и (
открывающая теперь скобка, и это означает, что (...)
теперь разграничивает список аргументов, а не заставляет вычислять выражение.
Об этой функции:
Function RangeTitelsAxisX() As Range
Range("B3").Select
Range(Selection, Selection.End(xlDown)).Select
Set RangeTitelsAxisX = Selection
End Function
Попробуйте по возможности избегать Range.Select
. Это должно быть эквивалентно и гораздо более эффективно - обратите внимание, что функция неявно опубликована c, но должна быть закрытой, если она когда-либо вызывается другими процедурами в том же модуле.
Кроме того, неквалифицированный вызов Range
равен , неявно ссылаясь на ActiveSheet
, если этот код записан где-либо, кроме кода кода модуля рабочего листа:
Private Function RangeTitelsAxisX() As Range
Set RangeTitelsAxisX = ActiveSheet.Range("B3").End(xlDown)
End Function
Если код записанный в модуле рабочего листа, вы захотите это так:
Private Function RangeTitelsAxisX() As Range
Set RangeTitelsAxisX = Me.Range("B3").End(xlDown)
End Function
Всегда квалифицируйте Range
вызовы с правильным Worksheet
объектом: вы избежите множества ошибок.