TechKnowledge Content
Hỏi: Mã VBA đã được viết để so sánh hai giá trị tiền tệ. Dưới đây là một ví dụ về mã này:
If ccur(cost) > ccur(1000) then
Khi dòng mã này thực thi, nó gây ra thông báo lỗi kiểu dữ liệu không tương thích hoặc loại lỗi không khớp. Cài Windows tiền tệ hiện được xác định là ký hiệu "cân Anh" tiếng Anh cho ký hiệu tiền tệ. Nếu tôi thay đổi ký hiệu tiền tệ thành "$", mã sẽ chạy thành công. Điều gì đang xảy ra ở đây và có cách nào để giải quyết vấn đề này không?
Đáp: Trong VBA, hàm Ccur() luôn tôn trọng thiết đặt tiền tệ của Panel Điều khiển khi đánh giá trường này. Vì VBA của Dynamics sẽ luôn thông qua giá trị trường của mình dưới dạng chuỗi nên bạn sẽ gặp sự cố này bất cứ khi nào giá trị tiền tệ được đánh giá không khớp với cài đặt tiền tệ trong Windows. Trong tệp trợ giúp VBA, nó cho biết rằng các hàm chuyển đổi kiểu dữ liệu nên được sử dụng thay cho Val để cung cấp các chuyển đổi nhận thức quốc tế từ kiểu dữ liệu này sang kiểu dữ liệu khác. Ví dụ: khi bạn dùng hàm CCur(), dấu tách thập phân khác nhau, dấu tách hàng nghìn khác nhau và nhiều tùy chọn tiền tệ khác nhau được nhận diện đúng cách tùy thuộc vào thiết đặt bản địa của máy tính. Để hiểu rõ hơn, hãy lưu ý điều này về cách làm việc với Microsoft Dynamics GP:-
CCur("œ1000") sẽ bằng một loại không khớp (ví dụ: chuỗi này không phải là tiền tệ hợp lệ) nếu cài đặt tiền tệ Windows không được đặt là "pound".
-
Nếu được đặt là "pound" thì CCur("œ1000") sẽ trả về giá trị 1000 nhưng khi đó CCur("$1000") sẽ bằng với một lỗi không khớp loại.
Cách tốt nhất để xử lý tiền tệ từ VBA là viết một hàm sẽ chuyển đổi bất kỳ chuỗi nào có ký hiệu không phải số ở trước thành giá trị số (hoặc tiền tệ). Ví dụ, như thế này:
If CurrencyValueFromDynField(cost) > ccur(1000) then
trong đó hàm có tên là CurrencyValueFromDynField được xác định như sau. Mã này xử lý chính xác các số âm có dấu trừ tiến hành hoặc ở sau, nằm trong dấu ngoặc vuông hoặc có khoảng trắng giữa ký hiệu tiền tệ và số.
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
Bài viết này đã được TechKnowledge Document ID:10036