Я пытаюсь вызвать 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))
Есть ли у кого-нибудь предложения? Спасибо за вашу помощь.
Я получаю, что объект не поддерживает это свойство или метод.
Не все функции листа Excel доступны через WorksheetFunction. Похоже, что Exact является одним из таких примеров. Вот список функций, доступных через WorksheetFunction Learn.microsoft.com/en-us/office/vba/api/…
Спасибо. Я только что это заметил.
Поскольку 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.
Пожалуйста. посмотри постскриптум.
Используйте метод «Оценить», чтобы использовать функцию «Точная» в VBA;
MsgBox Evaluate("Exact(A1, B1)")
Exact
предназначен для сравнения строк с учетом регистра.
Вы пытаетесь сравнить значения с плавающей запятой. Значит Exact
— это не то, что вам нужно.
Чтобы сравнить значения с плавающей запятой, просто используйте =
.
Однако вы столкнетесь с проблемой точности с плавающей запятой. Решение для вас будет зависеть от деталей того, чего вы пытаетесь достичь. (Обычно подразумевает некоторую терпимость)
(Для тех, кто найдет это и хочет сравнить строки, используйте StrComp
с vbBinaryCompare
, чтобы обеспечить сравнение с учетом регистра)
Есть ли разница между StrComp(vbBinaryCompare)
и оператором равенства?
Есть разница? Абсолютно да. ̀StrComp ̀ специально сравнивает строки и может учитывать регистр или нет. ̀= ̀ сравнивает любые типы данных (это усложняется, если вы сравниваете разные типы. Если вы хотите сравнить числа, преобразование их в строки — всегда плохая идея. Сравнение значений с плавающей запятой на равенство также является плохой идеей из-за проблем с точностью). Я связал.
Очевидно, я спрашиваю про StrComp(string1, string2, vbBinaryCompare)
и string1 = string2
.
Что происходит, когда вы это делаете? В чем ошибка?