Thí nghiệm lỗi của VBA và tìm cách khắc phục (format định dạng số "." & ",")

Liên hệ QC

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Dear các Huynh
Em đang test thử trên nhiều máy, hiện tượng rất chợp chờn (lúc đúng lúc sai). Em xin tường thuật lại lúc sai như sau. Mong các cáo thủ chỉ giúp

Em tạo một form có
Combox (Rate)
Textbox (Q.ty)
Textbox (Amount)

amount = rate * q.ty
Ví dụ: amount = 0.1*5 = 0.5

Nhưng vấn đề sẽ bị sai khi mình chuyển format trong Regional Option sang ###.###,00
Nghĩa là amount = 0,05 *10 --> Kết quả bằng 50

Em tìm trong cửa sổ VBA thấy, mặc dù giá trị combox khi sổ xuống là 0,05 nhưng value tại cửa sổ properties lại hiểu là 0.05
như vậy với format ###.###,00 --> tất nhiên 0.05 sẽ bị hiểu thành 5 và dẫn tới phép tính bị sai

Các Huynh, cao thủ xem file và tìm giúp cách khắc phục

Xin cám ơn
 

File đính kèm

  • test_thinghiem.zip
    119.3 KB · Đọc: 11
Lần chỉnh sửa cuối:
Dear các Huynh
Em đang test thử trên nhiều máy, hiện tượng rất chợp chờn (lúc đúng lúc sai). Em xin tường thuật lại lúc sai như sau. Mong các cáo thủ chỉ giúp

Em tạo một form có
Combox (Rate)
Textbox (Q.ty)
Textbox (Amount)

amount = rate * q.ty
Ví dụ: amount = 0.1*5 = 0.5

Nhưng vấn đề sẽ bị sai khi mình chuyển format trong Regional Option sang ###.###,00
Nghĩa là amount = 0,05 *10 --> Kết quả bằng 50

Em tìm trong cửa sổ VBA thấy, mặc dù giá trị combox khi sổ xuống là 0,05 nhưng value tại cửa sổ properties lại hiểu là 0.05
như vậy với format ###.###,00 --> tất nhiên 0.05 sẽ bị hiểu thành 5 và dẫn tới phép tính bị sai

Các Huynh, cao thủ xem file và tìm giúp cách khắc phục

Xin cám ơn
Em không đưực học VBA mà tự nghiên cứu nên không rõ sâu nguyên nhân. Tự suy luận rằng trong VBA hiểu số thập phân là "." nhưng khi khi trong hệ thống chuyển số thập phân là "," (chỉ là hiển trị) nên ta phải dùng hàm Replace để thay thế số thập phân
Xin các anh chị khác giải thích thêm
 

File đính kèm

  • test_thinghiem.rar
    118.7 KB · Đọc: 11
Upvote 0
Mình đả thử và thấy nó không sai.
Nhiều khi lúc đầu bạn định dạnh thế này, xong vào form chọn giá trị cho Combobox. Chưa có gì xảy ra.
Sau đó bạn lại chuyển sang định dạng khác. Vào lại form. Khi đó giá trị của Combobox vẫn chưa được Update, và giá trị trong Properties cũng như thế mặc dù các phần tử trong list đã được Update khi bạn click vào. Khi bạn lick và thay đổi giá trị, chắc chắn nó sẽ giống nhau thôi.
 
Upvote 0
Anh Danh ơi
Em không chuyển định dạng, do thông tư (hình như là 153/2010) mới yêu cầu format định dạng số phải là ###.###,00
Như vậy trong control panel em đã phải format từ đầu vê định dạng này

Từ khi chuyển sang định dạng này, tất cả các tính toán trong form của em bị sai
(vi dụ: tại rowsoure = range("A1:A2") = (0,1; 0,05) nhưng khi tính toán nó lại hiểu là (1 & 5)

Em đã thử tạo lại form trong file Test_thinghiem & kết quả lúc đúng, lúc sai (không hiểu nguyên nhân tại sao)

Anh Danh thử test lại giúp em với, tại công ty em máy nào cũng bị như này
(nếu muốn không bị phải chuyển format về (###,###.00)

Em cám ơn các Sư Huynh
 
Upvote 0
Dear Anh VieHoai
Ngay tại bài test của anh, nếu em bỏ đoạn code
rate = Replace(Me.rate, ".", ",")

Thì kết quả sẽ bị sai ngay

Không hiểu chỉnh trong win như nào để được như Anh Danh nhỉ?
 
Upvote 0
Anh Danh ơi
Em không chuyển định dạng, do thông tư (hình như là 153/2010) mới yêu cầu format định dạng số phải là ###.###,00
Như vậy trong control panel em đã phải format từ đầu vê định dạng này

Từ khi chuyển sang định dạng này, tất cả các tính toán trong form của em bị sai
(vi dụ: tại rowsoure = range("A1:A2") = (0,1; 0,05) nhưng khi tính toán nó lại hiểu là (1 & 5)

Em đã thử tạo lại form trong file Test_thinghiem & kết quả lúc đúng, lúc sai (không hiểu nguyên nhân tại sao)

Anh Danh thử test lại giúp em với, tại công ty em máy nào cũng bị như này
(nếu muốn không bị phải chuyển format về (###,###.00)

Em cám ơn các Sư Huynh
Mình làm 1 file VD cho bạn thấy, máy mình vẫn chạy tốt mỗi khi set lại Format.
Bạn tạo 1 Form với 2 combobox và 1 textbox. BẠn sử dung code sau để test nha.
PHP:
Private Sub ComboBox1_Change()
TextBox1.Value = ComboBox1 * ComboBox2
End Sub

Private Sub ComboBox2_Change()
TextBox1.Value = ComboBox1 * ComboBox2
End Sub

Private Sub UserForm_Activate()
ComboBox1.Value = ComboBox1.List(1, 0)
ComboBox2.Value = ComboBox2.List(1, 0)
End Sub
 

File đính kèm

  • VD.xls
    28 KB · Đọc: 10
Upvote 0
Cám ơn Anh Danh
Không hiểu sao máy em & một số máy khác rất "củ chuối" vẫn phải áp dụng 02 phương pháp sau thì mới ok

1. Thêm đoạn code replace (..., ".", ",") vào đầu dòng
2. Chỉnh lại mesurement system trong control panel (chuyển đổi giữa Metric & U.S)

thì mới ok

Em xin cám ơn Anh Danh & Anh VieHoai nhiều ạh
 
Upvote 0
Mình làm 1 file VD cho bạn thấy, máy mình vẫn chạy tốt mỗi khi set lại Format.
Bạn tạo 1 Form với 2 combobox và 1 textbox. BẠn sử dung code sau để test nha.
PHP:
Private Sub ComboBox1_Change()
TextBox1.Value = ComboBox1 * ComboBox2
End Sub
Private Sub ComboBox2_Change()
TextBox1.Value = ComboBox1 * ComboBox2
End Sub

Private Sub UserForm_Activate()
ComboBox1.Value = ComboBox1.List(1, 0)
ComboBox2.Value = ComboBox2.List(1, 0)
End Sub

Máy em định dạng theo ###.###,00 không cho kết quả đúng anh ơi, cho kết quả là các số nguyên nhân với nhau
 
Upvote 0
Máy em định dạng theo ###.###,00 không cho kết quả đúng anh ơi, cho kết quả là các số nguyên nhân với nhau

Bạn thử cho VD xem bạn đã set như thế nào, các số có giá trị bao nhiêu để mình test lại. Làm trên file mình gửi càng tốt rồi gửi lên đây nha.
 
Upvote 0
Để xác định định dạng thập phân, em dùng:

?Application.DecimalSeparator

từ đó có thể sử dụng điều kiện if để chọn định dạng phù hợp.
----------------------------------------------
Nên thay:

Private Sub ComboBox2_Change()
TextBox1.Value = ComboBox1 * ComboBox2
End Sub

thành:

Private Sub ComboBox2_Change()
TextBox1.Value = Val(ComboBox1.Value) * Val(ComboBox2.Value)
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Máy em định dạng theo ###.###,00 không cho kết quả đúng anh ơi, cho kết quả là các số nguyên nhân với nhau

Anh VieHoai ơi
Anh thử thay đổi giá trị trong Control panel/ regional / Mesurement System xem (chuyển đổi giữa Metric & U.S)

Em không thể hiểu nổi quy luật như nào nữa?
 
Upvote 0
Anh VieHoai ơi
Anh thử thay đổi giá trị trong Control panel/ regional / Mesurement System xem (chuyển đổi giữa Metric & U.S)

Em không thể hiểu nổi quy luật như nào nữa?
Em cũng không rõ qui luật. Nhưng file em thử chuyển theo yêu cầu của anh cho kết quả luôn đúng (Metric hoặc U.S)
 
Upvote 0
Web KT
Back
Top Bottom