如何对FormatCurrency()函数格式化后的货币值进行求和?
问题原因说明
Val函数的解析逻辑为从字符串首字符开始读取数字,遇到第一个非数字字符就直接停止解析,因此FormatCurrency输出的带前置货币符号、千位分隔符的字符串会被Val直接判定为非数字开头,返回结果为0。
解决方案
方案1:使用原始数值计算(最推荐)
你在给控件Caption赋值时本身就持有firstSales、secondSales两个原始数值,直接用原始值计算即可,完全不需要读取格式化后的控件内容做转换,从根源避免转换错误。
代码示例:
' 原始数值直接求和后,格式化显示为总销售额 Me.totalSales.Caption = FormatCurrency(Val(firstSales) + Val(secondSales))
方案2:格式化字符串转数值(仅当无法获取原始数值时使用)
如果确实只能拿到已经格式化好的货币字符串,可以用两种方法转换:
- 使用VBA内置的
CCur(转货币类型)或CDbl(转双精度数值类型)函数,这两个函数可识别系统区域设置对应的货币符号、千位分隔符,兼容性远高于Val:
Me.totalSales.Caption = FormatCurrency(CCur(Me.firstDaySales.Caption) + CCur(Me.secondDaySales.Caption))
- 如果遇到区域不匹配的特殊场景,可以先清理字符串内的非数值字符再转换:
Function 货币字符串转数值(货币Str As String) As Double Dim 清理后Str As String Dim i As Integer For i = 1 To Len(货币Str) Dim 字符 As String 字符 = Mid(货币Str, i, 1) If IsNumeric(字符) Or 字符 = "." Or 字符 = "-" Then 清理后Str = 清理后Str & 字符 End If Next 货币字符串转数值 = Val(清理后Str) End Function ' 调用示例 Me.totalSales.Caption = FormatCurrency(货币字符串转数值(Me.firstDaySales.Caption) + 货币字符串转数值(Me.secondDaySales.Caption))
内容的提问来源于stack exchange,提问作者Ambet
相关产品推荐
相关产品推荐

