TechKnowledge saturs
Jautājums: VBA kods ir rakstīts, kas salīdzina divas valūtas vērtības. Tālāk ir parādīts šī koda piemērs:
If ccur(cost) > ccur(1000) then
Ja tiek izpildīta šī koda rindiņa, tas izraisa nesaderības datu tipu vai tipa neatbilstības tipa kļūdas ziņojumu. Šīs Windows valūtas iestatījumi pašlaik ir definēti kā angļu valodas mārciņas simbols valūtas simbolam. Ja mainīju valūtas simbolu uz "$", kods tiek sekmīgi izpildīts. Kas šeit notiek, un vai ir kāds veids, kā novērst šo problēmu?
Atbilde: VBA gadījumā funkcija Ccur() vienmēr ievēro vadības paneļa valūtas iestatījumus, novērtējot šo lauku. Tā kā Dynamics VBA ieviešana vienmēr nodod tās lauku vērtības kā virknes, šī problēma rodas katru reizi, kad tiek novērtēta valūtas vērtība, kas neatbilst valūtas iestatījumiem Windows. VBA palīdzības failā tas norāda, ka datu tipa konvertēšanas funkcijas ir jāizmanto, nevis Val, lai nodrošinātu starptautisku konvertēšanu no viena datu tipa uz citu. Piemēram, ja izmantojat funkciju CCur(), dažādi decimāldaļu atdalītāji, dažādi tūkstošu atdalītāji un dažādas valūtas opcijas tiek pareizi atpazītas atkarībā no datora lokalizācijas iestatījuma. Ņemiet vērā šo informāciju par darbu ar Microsoft Dynamics GP:-
CCur("œ1000") būs vienāda ar tipa neatbilstību (t.i., šī virkne nav derīga valūta), ja Windows valūtas iestatījums nav iestatīts uz "mārciņa".
-
Ja tas ir iestatīts uz "mārciņa", CCur("œ1000") atgriezīs vērtību 1000, bet pēc tam CCur("$1000") būs vienāda ar tipa neatbilstības kļūdu.
Labākais veids, kā rīkoties ar VBA valūtām, ir rakstīt funkciju, kas konvertēs jebkuru virkni ar simboliem, kas nav skaitliski, par skaitlisku (vai valūtas) vērtību. Piemēram, šādi:
If CurrencyValueFromDynField(cost) > ccur(1000) then
kur funkcija Ar nosaukumu CurrencyValueFromDynField tiek definēta šādi. Šis kods pareizi apstrādā negatīvos skaitļus, kas ir turpināti vai beigu mīnusa zīmes, kas ir iekavās vai kuros ir atstarpes starp valūtas simbolu un skaitli.
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
Šis raksts bija TechKnowledge dokumenta ID:10036