Поддерживает ли long десятичные дроби?

Я пытался разобраться в ByVal и ByRef и передавать аргументы от long к double с помощью ключевого слова ByVal.

Я заметил, что VBA дал мне неправильный ответ для значения y в квадрате. Это действительно работает, когда y (i в моей подпрограмме) является целым числом.

В приведенном ниже примере у меня было i = 22,5.
Электронная таблица дала мне 506,25.
Моя функция дала мне 484.

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

Sub automation_test()

Dim i As Long
Dim j As Long
Dim x As Long
Dim ans As Long

i = Range("B1")
j = Range("B2")
x = Range("B3")

ans = my_model(i, j, x)

Range("B4").Value = ans

End Sub


Function my_model(ByVal y As Double, ByVal m As Double, ByVal q As Double) As Double

' my_model = (y ^ 2) * (m ^ 3) * (q ^ 1 / 2)

my_model = y ^ 2

End Function

person NeilF    schedule 07.06.2020    source источник
comment
Длинная переменная не принимает десятичные дроби! Поскольку вы не используете переменные, используемые в качестве аргументов, после вызова функции ByVal не имеет никакого значения по сравнению с ByRef... Попробуйте объявить все переменные «As Double, please. And it is good to use i = Range(B1).value». VBA может догадаться, о чем идет речь, но полезно развивать такую ​​привычку, чтобы визуально отличать ее от использования в качестве диапазона.   -  person FaneDuru    schedule 07.06.2020
comment
ByVal и ByRef используются для вызовов API. Для строк ByVal отправляет строку C, а ByRef отправляет строку VB, вызовы API требуют строк C. Для других типов вы всегда используете ByVal для входных параметров (чтобы вызываемая вами функция не связывалась с вашими переменными) и ByRef для выходных параметров.   -  person    schedule 08.06.2020


Ответы (1)


Вы должны объявить все используемые переменные As Double (или As Single, в зависимости от максимального используемого значения).

Long переменные не принимают десятичные дроби.

Разница именно в том, что происходит от округления (вниз):

22.5^2 = 506.25

22^2 = 484

person FaneDuru    schedule 07.06.2020
comment
Ага! В этом была проблема. Отмечено и значение .value. Спасибо за помощь, очень признателен! - person NeilF; 08.06.2020
comment
@NeilF: Рад, что смог помочь! - person FaneDuru; 08.06.2020