Сбой функции Excel VBA, но формула работает в листе - PullRequest
0 голосов
/ 08 марта 2019

Странная математическая ошибка в VBA для Excel

Привет всем, хотел бы получить отзыв о необычной ошибке, которую я получаю.

Очень странно. У меня есть простая формула, которая отлично работает, если я используйте его только в обычной ячейке листа и копируйте по столбцам, но если я пытаюсь выполнить простую итерацию в коде vba для выполнения той же функции, я получаю неправильные значения.

Описание: число возводится в квадрат, а затем делится на другое значение от 0,99 до 1,99, затем берется модуль, а затем число снова возводится в квадрат, и вся формула повторяется.
Если я скопирую оператор формулы вниз по столбцу, то получится нормально, включая разумную десятичную точность.

Есть четыре входа; базовое значение (inputx) decx = делитель мод значение

Первая формула, помещенная в (E2), выглядит следующим образом; = MOD (((В2 ^ 2) / $ B $ 3), $ B $ 4)

В (E3) это утверждение помещено; = MOD (((Е2 ^ 2) / $ B $ 3), $ B $ 4)

Затем это точно такое же утверждение копируется по столбцам в следующие 98 ячеек.

Все отлично, без проблем. Кажется, точное значение мудрое, с точностью до десятичного с точностью до десятичной точки во всех ячейках столбца.

Некоторые образцы входных значений для тестирования;

INPUTX -> 231
DECX 1.010101
MOD 400
LOOPTIMES 100

Но когда я пытаюсь реализовать это, это код Excel VBA (Excel 2007) Я часто получаю неправильные значения и абсолютно никаких значений после десятичной запятой никогда не показывают.

пытались использовать всевозможные типы данных; одиночный, двойной, вариант и т. д. ... но все значения, возвращаемые созданной мной функцией VBA, всегда возвращаются целые числа, и часто неправильно и, конечно, не согласен с значения, возвращаемые простыми операторами на основе столбцов.

Попробовал найти способ обойти это или исправить это, наткнулся на "CDEC", пробовал это и ничего не изменилось. Полностью озадачен и хотел бы немного понять если это можно исправить так, чтобы цикл функции возвращал те же значения с тот же тип десятичной точности, что и операторы на основе столбцов и Буду очень признателен за отзыв о том, как это можно сделать.

Включаю мой пример кода ниже;

Public Function SQRD(inputx As Variant, looptime As Variant, decx As Variant) As Variant

Application.Volatile

Dim Count As Integer

SQRD = CDec(inputx)

'Dim decx As variant

Count = 1

For Count = 1 To looptime
    SQRD = CDec(SQRD ^ 2)  '+ looptime
    SQRD = CDec(SQRD Mod 400 / decx)
Next Count

End Function

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Я расскажу только об использовании вами оператора VBA Mod.Это НЕ эквивалентно функции Excel MOD.В частности, оператор VBA Mod округляет числа с плавающей запятой до целых чисел перед выполнением операции.

Чтобы использовать функцию VBA, которая имитирует функцию Excel MOD, используйте что-то вроде:

Function xlMOD(a As Double, b As Double) As Double
    xlMOD = a - (b * (a \ b))
End Function

РЕДАКТИРОВАТЬ Кажется, есть ошибка в VBA (или ошибка документации).В приведенной выше формуле оператор \ должен быть оператором целочисленного деления.Он возвращает целочисленный результат.Однако, это не усекает, скорее это округляет.На самом деле, то, что он может делать, выполняет округление типа VBA по числу и делителю перед возвратом результата.

Следовательно, правильная функция vba для имитации функции Excel MOD будет выглядеть так:

Function xlMOD(a As Double, b As Double) As Double   
    xlMOD = a - Int(a / b) * b
End Function
0 голосов
/ 08 марта 2019

С вашим кодом все в порядке.Насколько я вижу, нет необходимости в цикле, и вы делитесь после мода, а не до

Похоже, это делает трюк

Public Function NuFunc(InputX As Variant, DecX As Variant) As Variant
  NuFunc = ((InputX ^ 2) / DecX) Mod 400
End Function
...