TechKnowledge 内容
问题:已编写比较两个货币值的 VBA 代码。 下面是此代码的示例:
If ccur(cost) > ccur(1000) then
执行此代码行时,会导致数据类型不兼容或类型不匹配类型错误消息。当前Windows货币设置定义为货币符号的英语"磅"符号。 如果将货币符号更改为"$",代码将成功运行。 此处发生的情况是什么,是否有解决此问题的方法?
解答:在 VBA 中,Ccur () 函数在评估此字段时始终遵守控制面板货币设置。 由于 Dynamics VBA 实现始终以字符串传递其字段值,因此,只要计算的货币值与字段中的货币设置不匹配,就会Windows。 在 VBA 帮助文件中,它指示应该使用数据类型转换函数而不是 Val 来提供从一个服务到另一个数据类型国际感知转换。 例如,使用 CCur () 函数时,将根据计算机区域设置正确识别不同的小数分隔符、不同的千位分隔符和各种货币选项。 根据此了解,请注意有关使用 Microsoft Dynamics GP 的注意事项:-
CCur ("1000") 将等于类型不匹配 (即,如果"Windows 货币"设置未设置为"井号",则此字符串不是有效的货币) 。
-
如果设置为"井号",则 CCur ("1000") 将返回值 1000,但 CCur ("$1000") 将等于类型不匹配错误。
处理来自 VBA 的货币的最佳方法就是编写一个函数,将前面带非数字符号的任何字符串转换为数字 (或货币) 值。 例如,如下所示:
If CurrencyValueFromDynField(cost) > ccur(1000) then
其中,名为 CurrencyValueFromDynField 的函数定义如下。 此代码正确处理具有继续或尾随减号、用方括号括起或货币符号和数字之间具有空格的负数。
Public Function CurrencyValueFromDynField(FieldString As String) As Currency
Dim i As Integer Dim TempChar, TempString As String ' Strip off all non-numeric characters TempString = "" For i = 1 To Len(FieldString) TempChar = Mid(FieldString, i, 1) If InStr("1234567890.,-()", TempChar) > 0 Then TempString = TempString & TempChar End If Next FieldString = TempString ' Return the numeric value of the string (as a currency data type ) CurrencyValueFromDynField = CCur(FieldString) End Function
本文为 TechKnowledge 文档 ID:10036