Как вызвать формулу ТОЧНО из VBA

Я пытаюсь вызвать Application.WorksheetFunction.Exact. Я сделал поиск, пытаясь найти решение (пока) безрезультатно. Вот что я попытался:

Set deltaCell = ActiveWorkbook.Sheets("qry_invalid_deltas").Range("z4")
Set outCell = deltaCell.Offset(0, -1)
Set inCell = outCell.Offset(0, -1)
debug.print(CDbl(deltaCell.Value) <> CDbl(outCell.Value) - CDbl(inCell.Value))
Debug.Print (Application.WorksheetFunction.exact(deltaCell, outCell - inCell))

Есть ли у кого-нибудь предложения? Спасибо за вашу помощь.

Что происходит, когда вы это делаете? В чем ошибка?

Tim Roberts 21.08.2024 08:26

Я получаю, что объект не поддерживает это свойство или метод.

Z T Minhas 21.08.2024 08:33

Не все функции листа Excel доступны через WorksheetFunction. Похоже, что Exact является одним из таких примеров. Вот список функций, доступных через WorksheetFunction Learn.microsoft.com/en-us/office/vba/api/…

Andrew Gould 21.08.2024 08:40

Спасибо. Я только что это заметил.

Z T Minhas 21.08.2024 08:46
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
4
51
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Поскольку Exact не поддерживается функцией WorksheetFunction, используйте оператор равенства для сравнения строк точно так же, как функция Exact:

CStr(deltaCell) = CStr(outCell - inCell)

P.S. Метод сравнения нецелых чисел предполагает допуск сравнения:

Abs(deltaCell - (outCell - inCell)) < tolerance

причина, по которой я искал функцию Exact, заключается в том, что я столкнулся с проблемой CDbl(deltaCell.Value) = CDbl(outCell.Value - CDblinCell.Value), возвращающей FALSE, несмотря на то, что каждый расчет, который я проверял, показывал такие значения как TRUE, и я даже вижу, что значения верны в отладчике. Я воспользуюсь вашим методом, но меня все еще озадачивает загадка, почему он возвращается как FALSE.

Z T Minhas 21.08.2024 08:47

Пожалуйста. посмотри постскриптум.

rotabor 21.08.2024 09:27

Используйте метод «Оценить», чтобы использовать функцию «Точная» в VBA;

    MsgBox Evaluate("Exact(A1, B1)")

Exact предназначен для сравнения строк с учетом регистра.

Вы пытаетесь сравнить значения с плавающей запятой. Значит Exact — это не то, что вам нужно.

Чтобы сравнить значения с плавающей запятой, просто используйте =.

Однако вы столкнетесь с проблемой точности с плавающей запятой. Решение для вас будет зависеть от деталей того, чего вы пытаетесь достичь. (Обычно подразумевает некоторую терпимость)

(Для тех, кто найдет это и хочет сравнить строки, используйте StrComp с vbBinaryCompare, чтобы обеспечить сравнение с учетом регистра)

Есть ли разница между StrComp(vbBinaryCompare) и оператором равенства?

rotabor 21.08.2024 09:30

Есть разница? Абсолютно да. ̀StrComp ̀ специально сравнивает строки и может учитывать регистр или нет. ̀= ̀ сравнивает любые типы данных (это усложняется, если вы сравниваете разные типы. Если вы хотите сравнить числа, преобразование их в строки — всегда плохая идея. Сравнение значений с плавающей запятой на равенство также является плохой идеей из-за проблем с точностью). Я связал.

chris neilsen 21.08.2024 11:01

Очевидно, я спрашиваю про StrComp(string1, string2, vbBinaryCompare) и string1 = string2.

rotabor 21.08.2024 11:06

Другие вопросы по теме