Почему Excel 2007 pt-PT Trim все ячейки приводит к ошибке? - PullRequest
0 голосов
/ 03 октября 2019

Я использую Excel 2007 - PT-PT, и я пытаюсь обрезать все ячейки (компактные) в моем листе, используя скрипт VBA. Следующий скрипт возвращает эту ошибку - «Объект не поддерживает это свойство или метод» , и я не понимаю, почему.

Sub TrimAllCells()
    Dim cell As Range
    For Each cell In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants)
    cell = WorksheetFunction.Compactar(cell)
    Next cell
End Sub

Что я делаю не так?

1 Ответ

3 голосов
/ 03 октября 2019

Хотя функции 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)
...