Для вашего кода быстрое решение может состоять в том, чтобы убрать разделитель тысяч во время вычисления следующим образом:
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.