неверный расчет texbox - PullRequest
       2

неверный расчет texbox

0 голосов
/ 30 сентября 2018

Я использую этот код, который должен суммировать значения двух текстовых полей, которые он делает правильно, до 999, если число исчисляется тысячами, результат возвращается как 2,00. Это мой код:

Private Sub Txtunitcost_Exit(ByVal Cancel As MSForms.ReturnBoolean)

Me.TxtTotal.Value = Val(Me.TxtQty.Value) * Val(Me.TxtUnitCost.Value)
   TxtTotal.Value = Format(TxtTotal.Value, ("#,##0.00;-#,##0.00"))
   TxtUnitCost.Value = Format(TxtUnitCost.Value, ("#,##0.00;-#,##0.00"))

End Sub

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

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

Private Sub Txtunitcost_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    txtUnitCost = Replace(txtUnitCost, Application.ThousandsSeparator, "")

    Me.txtTotal.Value = Val(Me.txtQty.Value) * Val(Me.txtUnitCost.Value)
    txtTotal.Value = Format(txtTotal.Value, ("#,##0.00;-#,##0.00"))
    txtUnitCost.Value = Format(txtUnitCost.Value, ("#,##0.00;-#,##0.00"))

End Sub

Для дальнейшего ознакомления взгляните на вывод следующего кода

Sub Test()
    Debug.Print Val("1000,00"), Val("1.000,00")
End Sub
 1000          1 

Строки представляют для меня тысячи (немецкая версия, в зависимости от разделителя тысяч), но результат преобразования отличается из-за разделителя тысяч.

И быстрое исправление -

    Sub Test()
        Dim s1 As String
        Dim s2 As String

        s1 = "1000,00"
        s2 = "1.000,00"

        Debug.Print Val(s1), Val(s2), Val(Replace(s2, _ 
                                     Application.ThousandsSeparator, ""))

   End Sub

        1000          1             1000 

Еще лучше было бы использовать CLng или CDbl вместо Val , потому что

Функция Val прекращает чтение строки с первого символа, который она не может распознать как частьчисло.

Таким образом, лучшее исправление будет

Private Sub Txtunitcost_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    Me.txtTotal.Value = CDbl(Me.txtQty.Value) * CDbl(Me.txtUnitCost.Value)
    txtTotal.Value = Format(txtTotal.Value, ("#,##0.00;-#,##0.00"))
    txtUnitCost.Value = Format(txtUnitCost.Value, ("#,##0.00;-#,##0.00"))

End Sub

Это также указано в документации выше

Примечание: единственный действительный десятичный разделительФункция Val () распознает точку (.).Если вы используете другой десятичный разделитель, как это делают некоторые международные приложения, используйте вместо этого функцию CDbl.

0 голосов
/ 30 сентября 2018

Как насчет:

Private Sub Txtunitcost_Exit(ByVal Cancel As MSForms.ReturnBoolean)

Dim TxtQty, TxtUnitCost, TxtTotat as Long

TxtQty = Format(Me.TxtQty.Value, ("#,##0.00;-#,##0.00"))
TxtUnitCost = Format(Me.TxtQty.Value, ("#,##0.00;-#,##0.00"))
TxtTotat = Format(TxtQty * TxtUnitCost, ("#,##0.00;-#,##0.00"))

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...