VBA отбрасывает десятичную точку при умножении десятичной дроби на целое число - PullRequest
1 голос
/ 20 июня 2019

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

Типичный пример:

  • Price = 10.45
  • Quantity = 1

Логически, то, что я хочу, это Tot = 10.45*1 = 10.45,Но VBA дает мне 1045 без десятичной точки.

Я прокрутил форум и увидел несколько предложений (преобразование в десятичные дроби, использование модуля, объявление double, single, float, ...), но результатне меняется.

Код, который я использую, выглядит следующим образом:

Me.lblPU = (rs!price - (rs!price  * (5 / 100)))
Me.lblPriceTot = (CDec(Me.lblPU) * CDec(Me.Qty))

Поле lblPU дает правильный номер: 10.45 Но поле lblPriceTot дает 1045в результате.

Я не объявлял ни одной переменной относительно этих полей, потому что они фактически извлекаются из Access и, следовательно, не кодируются пользователем.

Заранее спасибо за любую помощь!

Ответы [ 3 ]

0 голосов
/ 20 июня 2019

Во-первых, очень странно, что поля называются метками.

Затем используйте переменную , чтобы сократить его:

Dim TruePrice As Currency

TruePrice = price * (1 - 5 / 100)
Me!lblPU.Value = TruePrice
Me!lblPriceTot.Value = TruePrice * Me!Qty.Value
0 голосов
/ 20 июня 2019

Запись этого в комментариях будет беспорядком.Вместо разбора строки на десятичное число, непосредственно используйте десятичное значение:

Me.lblPU = (rs!price - (rs!price  * (5 / 100)))
Me.lblPriceTot = ((rs!price - (rs!price  * (5 / 100))) * CDec(Me.Qty))

Или:

dim price as decimal = (rs!price - (rs!price  * (5 / 100)))
Me.lblPU = price
Me.lblPriceTot = (price * CDec(Me.Qty))
0 голосов
/ 20 июня 2019

Если Me.lblPU возвращает строковое представление числового значения, в котором десятичная точка представлена ​​запятой (возможно, из-за региональных настроек), тогда CDec вернет 1045 вместо 10.45, соблюдайте:

?CDec("10.45")
 10.45 
?CDec("10,45")
 1045 

Я бы рекомендовал избегать любого возможного преобразования строки и работать с числовым значением напрямую, например:

Me.lblPriceTot = 0.95 * rs!price * CDec(Me.Qty)

Аналогично полю количества, используйте rs!quantity (если оносуществует).

...