Приложение Excel VBA. Метод Find () - PullRequest
0 голосов
/ 05 декабря 2018

Основываясь на документах Microsoft VBA, я знаю, что есть Range.Find(What, After, LookIn, Lookat, SearchOrder....), но нет метода Application.Find().И если я захожу в Object Browser в VBE для проверки объекта Application , я все равно не вижу никакого Find метода, прикрепленного к Приложение объект.И имеет смысл, что нет смысла intellisense, когда я набираю «Application.Find (»

Однако метод Application.Find () просто работает.

txt = "EEZ || EZE 123"
pos = Application.Find(" ", txt, 1)

Позиция будет иметь значение 4Почему? ... нет документов, нет метода в браузере объектов, метод все еще может работать?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Application.Find является расширенным членом интерфейса Excel.Application. Он в значительной степени привязан во время выполнения, поэтому нигде не отображается.Тип COM для Excel.Application является расширяемым и расширен за счет того, что представляется членами интерфейса WorksheetFunction, но с помощью механизма вычислений Excel (или, по крайней мере, в соответствии с тем, как Excel будет оценивать его)а не через среду выполнения VBA.

Другими словами это:

Debug.Print Application.Find("4", "12345", 1)

В значительной степени это:

Debug.Print Application.WorksheetFunction.Find("4", "12345", 1)

Разница становится более очевидной, когда вы даете имнедопустимые параметры:

Debug.Print TypeName(Application.Find("4", "12345", 10))
Debug.Print TypeName(Application.WorksheetFunction.Find("4", "12345", 10))

Первый выводит Error, второй генерирует ошибку времени выполнения 1004, что позволяет более идиоматически обрабатывать ошибки (т. е. срабатывает оператор On Error).Тип Error нельзя преобразовать в любой другой тип VBA, поэтому ожидайте ошибку времени выполнения 13 «несоответствие типов», если вы попытаетесь присвоить его String или чему-либо другому, чем Variant.Функция IsError возвращает True с учетом Variant/Error переменной / выражения.

Если вам нужно определить положение подстроки внутри String, используйте функцию VBA.Strings.InStr:

Debug.Print InStr(1, "12345", "4", vbTextCompare)

Обратите внимание на порядок параметров и дополнительный параметр VbCompareMethod, который выполняет поиск без учета регистра с vbTextCompare, поиск с учетом регистра с vbBinaryCompare, и если вы находитесь в Access,vbDatabaseCompare соответствует методу сравнения текущей базы данных.Если опущено, Option Compare, указанное на уровне модуля, определяет значение параметра;Option Compare Binary по умолчанию.

При вызове функций стандартной библиотеки VBA с ранним связыванием должно быть меньше времени выполнения, чем при запросе IDispatch в Object для определения функции Find ... и затемполучите Excel для оценки результата.

Другие примеры расширенных интерфейсов включают ADODB.Connection, с которыми вы можете (если вы должны - другой вопрос!) вызватьхранимой процедуры, как если бы вы были участником вызова - обратите внимание, что и здесь intellisense не может помочь, и Option Explicit закроет глаза, поскольку эти вызовы всегда связаны с запозданием (то есть разрешаются при выполнениивремя).

0 голосов
/ 05 декабря 2018

Это действительно очень интересно.Похоже, что это ярлык для Application.WorksheetFunction.Find.Используемый вами метод Find - это не то же самое, что метод Find VBA для Range.Find, это то же самое, что и функция Find для рабочего листа.

Я также протестировал другие функции рабочего листа, и все они также работают: Application.Sum, Application.Count.Но другие уже имеют определенный метод Application (например, Application.Left не имеет ярлыка для функции Worksheet).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...