TechKnowledge-inhoud
Vraag: VBA-code is geschreven die twee valutawaarden vergelijkt. Hieronder wordt een voorbeeld van deze code weergegeven:
If ccur(cost) > ccur(1000) then
Wanneer deze coderegel wordt uitgevoerd, veroorzaakt dit een foutbericht van een gegevenstype dat niet incompatibiliteit bevat of een foutbericht typt dat niet overeenkomend is. De Windows valuta-instellingen worden momenteel gedefinieerd als Engelse 'ponden'-symbool voor het valutasymbool. Als ik het valutasymbool wijzig in $, wordt de code uitgevoerd. Wat gebeurt er hier en is er een manier om dit probleem te voorkomen?
Antwoord: In VBA respecteert de functie Ccur() altijd de valuta-instellingen van het Configuratiescherm bij het evalueren van dit veld. Aangezien de Dynamics VBA-implementatie altijd de veldwaarden als tekenreeksen zal doorgeven, heeft u dit probleem wanneer een valutawaarde wordt geëvalueerd die niet overeenkomen met de valuta-instellingen in Windows. In het VBA Help-bestand wordt aangegeven dat de conversiefuncties voor gegevenstype moeten worden gebruikt in plaats van Val om internationaal bekende conversies van het ene gegevenstype naar het andere te leveren. Als u bijvoorbeeld de functie CCur() gebruikt, worden verschillende scheidingstekens voor decimalen, verschillende duizend scheidingstekens en verschillende valutaopties correct herkend, afhankelijk van de locale instelling van uw computer. Houd er onder dit begrip rekening mee dat u werkt met Microsoft Dynamics GP:-
CCur("œ1000") is gelijk aan een typefout (dat wil zeggen dat deze tekenreeks geen geldige valuta is) als de instelling Windows Valuta niet is ingesteld op 'pond'.
-
Als deze waarde is ingesteld op 'pond', geeft CCur("œ1000") een waarde van 1000 als resultaat, maar dan is CCur("$1000") gelijk aan een fout van het type mismatch.
De beste manier om met valuta's van VBA om te gaan, is door een functie te schrijven die elke tekenreeks met niet-numerieke symbolen voor een numerieke waarde (of valutawaarde) converteert. Bijvoorbeeld:
If CurrencyValueFromDynField(cost) > ccur(1000) then
waarbij de functie CurrencyValueFromDynField als volgt is gedefinieerd. Met deze code worden negatieve getallen verwerkt die doorgaande of achtereen mintekens hebben, die tussen vierkante haken staan of die spaties tussen het valutasymbool en het getal hebben.
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
Dit artikel was TechKnowledge Document ID:10036