Хотя функции Excel локализованы, соответствующих методов в библиотеке объектной модели нет - наличие разных членов для локализации означало бы разные версии сборки для каждой возможной локализации, и тогда поддержка и отладка были бы непостижимо хаотичными. Не говоря уже о том, что в некоторых локалях используются не-ANSI символы, которые VBE может с трудом отображать правильно.
Application.WorksheetFunction
имеет раннюю привязку - это означает, что компилятор знает, на что он смотрит, поэтому, когда вывведите точку в WorksheetFunction.
, вы получите список всех членов этого объекта;Compactar
(или любое другое имя локализованной функции листа) отсутствует в этом списке - следовательно, ошибка компиляции «объект не поддерживает это свойство или метод».
Правило большого пальца, когда вы кодируете противобъект с ранней привязкой, список членов, который вы получаете при вводе оператора разыменования .
, представляет собой список всего, что вы можете легально сделать с этим объектом. В есть случаи, когда иногда элементы скрыты (вы можете сделать их видимыми в Обозревателе объектов; F2 и щелкнуть правой кнопкой мыши в любом месте, выбрать «показать скрытые элементы»), и случаи, когда элементы с поздней привязкой прикреплены -во время выполнения на расширяемом COM-интерфейсе, но, вообще говоря, если его нет в списке участников, вызов не разрешен.
Если вы использовали эквивалент с поздним связыванием, ваш код будет скомпилироваться - и взорваться во время выполнения с ошибкой 438 (поздний предел / эквивалент времени выполнения с ошибкой во время компиляции, которую вы получаете):
cell = Application.Compactar(cell) '<~ error 438 at run-time
Вы ищете функцию Trim
рабочего листа ... но учтите, что VBA имеет свою собственную функцию Trim
, поэтому вам даже не нужно задействовать WorksheetFunction
для этого.
Обратите внимание, чтоВы неявно присваиваете члену по умолчанию класса Range
здесь. Более явный код будет выглядеть следующим образом:
cell.Value = Trim(cell.Value) ' fully-qualified: VBA.Strings.Trim
Но это предполагает, что ошибки на листе нет - если какой-либо cell
содержит, например, #VALUE!
или #REF!
, то это вызовет несоответствие типов ошибка. Всегда проверяйте тип значений ячеек перед обработкой их как String
, как Date
, или любого Double
, или другого числового значения - можно использовать функцию IsError
, чтобы избежать работы со значением Variant/Error
ислучайно вынудив его в String
:
If Not IsError(cell.Value) Then cell.Value = Trim(cell.Value)