Định dạng phần ngàn theo quy định của VN trongeTextBox (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

tvquan41

Thành viên chính thức
Tham gia
8/1/11
Bài viết
62
Được thích
4
Mình tìm thấy trong diễn dàn có kiểu định dạng phần ngàn trong TextBox theo chuẩn quốc tế nhưng không có định dạng theo chuẩn Việt Nam.
Cho mình hỏi có thể chuyển định dạng từ chuẩn quốc tế sang chuẩn VN mà không cần chuyển định dạng trong Control Panel bằng đoạn code này không?
Cảm ơn mọi người!
 

File đính kèm

Mình tìm thấy trong diễn dàn có kiểu định dạng phần ngàn trong TextBox theo chuẩn quốc tế nhưng không có định dạng theo chuẩn Việt Nam.
Cho mình hỏi có thể chuyển định dạng từ chuẩn quốc tế sang chuẩn VN mà không cần chuyển định dạng trong Control Panel bằng đoạn code này không?
Cảm ơn mọi người!
Theo mình không cần hàm FD() gì đó của bạn, chỉ cần đoạn code này là đủ
PHP:
Private Sub TextBox1_Change()

TextBox1.Value = Format(TextBox1.Value, "#,###")

End Sub
 
Upvote 0
Vậy bạn thử phần lẻ chưa VD 1,234.45 chưa?
 
Upvote 0
Vậy bạn thử phần lẻ chưa VD 1,234.45 chưa?

Tôi nghĩ với phần định dạng lẽ, bạn nên để nó trong sự kiện BeforUpdate sẽ tốt hơn, kiểu này nó giống như 1 cell trong sheet, ta muốn gõ gì thì gõ, sau khi enter thì nó mới định dạng lại kiểu mà nó được ta format:

PHP:
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
      TextBox1 = Format(TextBox1, "#,##0.00")
End Sub

--------------------------------------------------------------

Lưu ý, cách hỏi bài của bạn nó giống như bạn hỏi đố người ta chứ không phải bạn đang cần được hướng dẫn!

--------------------------------------------------------------

Phần thêm:

À, vì tôi chưa coi file của bạn nên nghĩ TextBox trên Form, với TextBox này bạn đặt vào thuộc tính sau:

[GPECODE=vb]Private Sub TextBox1_LostFocus()
TextBox1 = Format(TextBox1, "#,##0.00")
End Sub
[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi nghĩ với phần định dạng lẽ, bạn nên để nó trong sự kiện BeforUpdate sẽ tốt hơn, kiểu này nó giống như 1 cell trong sheet, ta muốn gõ gì thì gõ, sau khi enter thì nó mới định dạng lại kiểu mà nó được ta format:

PHP:
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
      TextBox1 = Format(TextBox1, "#,##0.00")
End Sub

--------------------------------------------------------------

Lưu ý, cách hỏi bài của bạn nó giống như bạn hỏi đố người ta chứ không phải bạn đang cần được hướng dẫn!

Chắc là hổng có download file về xem mà chỉ xem câu hỏi thôi
Ẹc...Ẹc... trong file người ta dùng TextBox trên sheet đấy đồng chí à, làm quái gì có sự kiện BeforeUpdate mà dùng
Với lại cái người ta cần là ĐỊNH DẠNG SỐ THEO KIỂU VIỆT NAM
 
Upvote 0
Chắc là hổng có download file về xem mà chỉ xem câu hỏi thôi
Ẹc...Ẹc... trong file người ta dùng TextBox trên sheet đấy đồng chí à, làm quái gì có sự kiện BeforeUpdate mà dùng

Thì em đã sửa lại ở "Phần thêm" đó thôi, hihihi.

Riêng định dạng kiểu Việt kiểu Tây gì thì cũng là dấu phẩy trong code hết, chi có khác chăng người đó chỉnh lại kiểu định dạng hệ thống kiểu VN thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Thế cũng đâu có đúng!
Tóm lại là: CHƯA ĐÚNG YÊU CẦU CỦA TÁC GIẢ

Thầy thử đi sẽ biết mà, trong code mình cứ định dạng như thường đi, còn trong control panel chỉnh theo kiểu của VN thì OK.

Bảo đảm những gì liên quan đến VN thì hầu hết những người làm trên Excel đều chỉnh lại theo kiểu này, chứ không thôi "đầu gà đít vịt" lộn tùng phèo về số hết!
 
Upvote 0
Thầy thử đi sẽ biết mà, trong code mình cứ định dạng như thường đi, còn trong control panel chỉnh theo kiểu của VN thì OK.

Bảo đảm những gì liên quan đến VN thì hầu hết những người làm trên Excel đều chỉnh lại theo kiểu này, chứ không thôi "đầu gà đít vịt" lộn tùng phèo về số hết!
Người ta đã nói rõ ràng thế nay:

Mình tìm thấy trong diễn dàn có kiểu định dạng phần ngàn trong TextBox theo chuẩn quốc tế nhưng không có định dạng theo chuẩn Việt Nam.
Cho mình hỏi có thể chuyển định dạng từ chuẩn quốc tế sang chuẩn VN mà không cần chuyển định dạng trong Control Panel bằng đoạn code này không?
Cảm ơn mọi người!
Không chịu đọc kỹ gì cả
Tức là trong Control Panel đang thiết lập thế nào thây kệ nó, miễn trong textbox hiển thị đúng yêu cầu thì thôi
 
Upvote 0
Mình tìm thấy trong diễn dàn có kiểu định dạng phần ngàn trong TextBox theo chuẩn quốc tế nhưng không có định dạng theo chuẩn Việt Nam.
Cho mình hỏi có thể chuyển định dạng từ chuẩn quốc tế sang chuẩn VN mà không cần chuyển định dạng trong Control Panel bằng đoạn code này không?
Cảm ơn mọi người!

Để làm bài này thử xem:
Mã:
Private Sub TextBox1_LostFocus()
  Dim tmp As String, DigSym As String, DecSym As String
  DecSym = Mid(1 / 2, 2, 1)
  DigSym = IIf(DecSym = ".", ",", ".")
  tmp = Format(TextBox1.Text, "#,###.00")
  tmp = Replace(Replace(Replace(tmp, DigSym, "*"), DecSym, ","), "*", ".")
  TextBox1.Text = tmp
End Sub
Control Panel đang thiết lập gì không quan trọng, kết quả vẫn là #.##0,00
Các bạn khác có ý kiến gì khác mời tiếp tục
 

File đính kèm

Upvote 0
Để làm bài này thử xem:
Mã:
Private Sub TextBox1_LostFocus()
  Dim tmp As String, DigSym As String, DecSym As String
  DecSym = Mid(1 / 2, 2, 1)
  DigSym = IIf(DecSym = ".", ",", ".")
  tmp = Format(TextBox1.Text, "#,###.00")
  tmp = Replace(Replace(Replace(tmp, DigSym, "*"), DecSym, ","), "*", ".")
  TextBox1.Text = tmp
End Sub
Control Panel đang thiết lập gì không quan trọng, kết quả vẫn là #.##0,00
Các bạn khác có ý kiến gì khác mời tiếp tục

Định dạng kiểu như vậy thật sự là "manh mún", người ta vừa gõ xong, thấy sai số, sửa lại, thì ngay lập tức, những cái mình vừa Replace nó lại chuyển lại, nhưng không phải như ban đầu. Kinh lắm!

Vã lại em chỉ cần ngắn gọn tí cũng ra kết quả y như của Thầy mà:

[GPECODE=vb]Private Sub TextBox1_LostFocus()
TextBox1 = Format(TextBox1, "#,##0.00")
TextBox1 = Replace(Replace(Replace(TextBox1, ",", "~"), ".", ","), "~", ".")
End Sub
[/GPECODE]

Nhưng để đảm bảo việc chỉnh sửa mình lại thêm một sự kiện nữa cho nó:

[GPECODE=vb]Private Sub TextBox1_GotFocus()
If Trim(TextBox1) <> "" Then
TextBox1 = Replace(Replace(Replace(TextBox1, ".", "~"), ",", "."), "~", ",")
TextBox1 = Format(TextBox1, "###0.00")
End If
End Sub
[/GPECODE]

Thế là đã tạm ổn. Nhưng cũng nói trước, TextBox này chỉ nhập giá trị là ký số, nếu nhập giá trị là ký tự bị lỗi ráng chịu à.
 
Lần chỉnh sửa cuối:
Upvote 0
Nói chung đây là vấn đề khá phức tạp đấy, yêu cầu đầy đủ phải là:
-Khi gõ các số đã gõ xong phải được định dang ngay để ngươi nhập biết đã nhập đến đâu
-Khi gõ phần thập phân nếu gõ quá số ký tự không nhận.
-Khi gõ đến đâu thì con trỏ luôn ở vị trí tiếp theo chứ không bi văng ra vị trí khác.
-khi cần sửa chữa thì tiến trình bình thường.
Tóm lại là giống trong các phần mềm Việt Nam khác đã làm được. Mình cũng đã để tâm theo dõi nhưng chưa học được chiêu này vì đa số các phần mềm đã được biên dịch.
Trong VB6 có lẽ có mask edit hỗ trợ nên việc sử lý có thể thuận lợi hơn. Còn VBA theo mình chỉ có viết hàm chuyển đổi hoặc sử dụng Class Module áp dụng chung các điều khiển dạng này. Rất mong các cao thủ ra tay để anh em có cơ hội học tập.
 
Upvote 0
Nói chung đây là vấn đề khá phức tạp đấy, yêu cầu đầy đủ phải là:
-Khi gõ các số đã gõ xong phải được định dang ngay để ngươi nhập biết đã nhập đến đâu
-Khi gõ phần thập phân nếu gõ quá số ký tự không nhận.
-Khi gõ đến đâu thì con trỏ luôn ở vị trí tiếp theo chứ không bi văng ra vị trí khác.
-khi cần sửa chữa thì tiến trình bình thường.
Tóm lại là giống trong các phần mềm Việt Nam khác đã làm được. Mình cũng đã để tâm theo dõi nhưng chưa học được chiêu này vì đa số các phần mềm đã được biên dịch.
Trong VB6 có lẽ có mask edit hỗ trợ nên việc sử lý có thể thuận lợi hơn. Còn VBA theo mình chỉ có viết hàm chuyển đổi hoặc sử dụng Class Module áp dụng chung các điều khiển dạng này. Rất mong các cao thủ ra tay để anh em có cơ hội học tập.

Em thấy nó rất khó khăn khi định dạng phần thập phân nếu ta dùng thuộc tính CHANGE, kể cả trong cell của sheet, dù mình có định dạng trước, thì khi gõ nó vẫn là số thô, sau khi thoát khỏi cell đó nó mới định dạng lại. Vì thế làm ngay trong lúc gõ thì không biết sẽ định dạng phần thập phân nó như thế nào nữa, nhưng số nguyên thì được.
 
Upvote 0
Định dạng kiểu như vậy thật sự là "manh mún", người ta vừa gõ xong, thấy sai số, sửa lại, thì ngay lập tức, những cái mình vừa Replace nó lại chuyển lại, nhưng không phải như ban đầu. Kinh lắm!

Vã lại em chỉ cần ngắn gọn tí cũng ra kết quả y như của Thầy mà:

[GPECODE=vb]Private Sub TextBox1_LostFocus()
TextBox1 = Format(TextBox1, "#,##0.00")
TextBox1 = Replace(Replace(Replace(TextBox1, ",", "~"), ".", ","), "~", ".")
End Sub
[/GPECODE]

Nhưng để đảm bảo việc chỉnh sửa mình lại thêm một sự kiện nữa cho nó:

[GPECODE=vb]Private Sub TextBox1_GotFocus()
If Trim(TextBox1) <> "" Then
TextBox1 = Replace(Replace(Replace(TextBox1, ".", "~"), ",", "."), "~", ",")
TextBox1 = Format(TextBox1, "###0.00")
End If
End Sub
[/GPECODE]

Thế là đã tạm ổn. Nhưng cũng nói trước, TextBox này chỉ nhập giá trị là ký số, nếu nhập giá trị là ký tự bị lỗi ráng chịu à.
Như vầy đi nha:
- Chuyển Control Panel sang định dạng dấu phẩy là dấu phân cách ngàn và dấu chấm là dấu thập phân, xong chạy code thử
- Chuyển Control Panel sang định dạng dấu chấm là dấu phân cách ngàn và dấu phẩy là dấu thập phân, xong chạy code thử
-------------
Nếu sau khi thử code mà hoàn toàn chính xác thì hãy bàn tiếp
Bài này Nghĩa suy nghĩ chủ quan quá, cứ máy mình định dạng sao thì bám theo đó làm làm --> Nếu máy người ta có control panel thiết lập khác thì sao? Trước khi chuyển đổi qua lại giữa chấm và phẩy, ít ra cũng phải kiểm tra xem dấu gì đang làm nhiệm vụ gì chứ
 
Lần chỉnh sửa cuối:
Upvote 0
Để làm bài này thử xem:
Mã:
Private Sub TextBox1_LostFocus()
  Dim tmp As String, DigSym As String, DecSym As String
  DecSym = Mid(1 / 2, 2, 1)
  DigSym = IIf(DecSym = ".", ",", ".")
  tmp = Format(TextBox1.Text, "#,###.00")
  tmp = Replace(Replace(Replace(tmp, DigSym, "*"), DecSym, ","), "*", ".")
  TextBox1.Text = tmp
End Sub
Control Panel đang thiết lập gì không quan trọng, kết quả vẫn là #.##0,00
Các bạn khác có ý kiến gì khác mời tiếp tục

Có phụ thuộc vào CP.
Tôi đính kèm ảnh. Để tiện theo dõi các biến hóa của tmp thì tôi viết tường minh các Replace lồng nhau.
Từ đâu tôi có kết quả trên? Vd. các bạn vào CP và chọn thiết lập của Pháp, Thụy Điển, Nga, Ba Lan (kiểm tra vài nước thôi). Với thiết lập của Pháp, Thụy Điển, Nga, Ba Lan thì có định dạng số là
"123 456 789,00"
Và sau khi viết 1234 thì code định dạng thành "1 234,00"
View attachment 94683
 
Upvote 0
Có phụ thuộc vào CP.
Tôi đính kèm ảnh. Để tiện theo dõi các biến hóa của tmp thì tôi viết tường minh các Replace lồng nhau.
Từ đâu tôi có kết quả trên? Vd. các bạn vào CP và chọn thiết lập của Pháp, Thụy Điển, Nga, Ba Lan (kiểm tra vài nước thôi). Với thiết lập của Pháp, Thụy Điển, Nga, Ba Lan thì có định dạng số là
"123 456 789,00"
Và sau khi viết 1234 thì code định dạng thành "1 234,00"

Vâng! Ở đây em chỉ xét 2 trường hợp DẤU CHẤM VÀ DẤU PHẨY (vì nó thường dùng nhất)... Chứ còn xét mọi thiết lập trên các nước thì... mệt lắm (chứ không phải là không có cách)
 
Upvote 0
Vâng! Ở đây em chỉ xét 2 trường hợp DẤU CHẤM VÀ DẤU PHẨY (vì nó thường dùng nhất)... Chứ còn xét mọi thiết lập trên các nước thì... mệt lắm (chứ không phải là không có cách)

Nếu Thầy muốn xét trong 2 trường hợp, em lại thêm 1 dòng nữa.

Chính vì tác giả muốn dù ở định dạng trong Control Panel kiểu gì đi nữa (quốc tế và VN) thì cấu trúc luôn là 1.234,00 nên em đã tính lại như sau:

[GPECODE=vb]Private Sub TextBox1_LostFocus()
If Trim(TextBox1) <> "" Then
TextBox1 = Format(TextBox1, "#,##0.00")
If Mid(1 / 2, 2, 1) = "," Then Exit Sub
TextBox1 = Replace(Replace(Replace(TextBox1, ",", "~"), ".", ","), "~", ".")
End If
End Sub

Private Sub TextBox1_GotFocus()
If Trim(TextBox1) <> "" Then
If Mid(1 / 2, 2, 1) = "." Then
TextBox1 = Replace(Replace(Replace(TextBox1, ".", "~"), ",", "."), "~", ",")
End If
TextBox1 = Format(TextBox1, "###0.00")
End If
End Sub
[/GPECODE]

Đó, nếu người dùng muốn chỉnh sửa gì cũng OK.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nếu Thầy muốn xét trong 2 trường hợp, em lại thêm 1 dòng nữa.

Chính vì tác giả muốn dù ở định dạng trong Control Panel kiểu gì đi nữa (quốc tế và VN) thì cấu trúc luôn là 1.234,00 nên em đã tính lại như sau:

[GPECODE=vb]Private Sub TextBox1_LostFocus()
If Trim(TextBox1) <> "" Then
TextBox1 = Format(TextBox1, "#,##0.00")
If Mid(1 / 2, 2, 1) = "," Then Exit Sub
TextBox1 = Replace(Replace(Replace(TextBox1, ",", "~"), ".", ","), "~", ".")
End If
End Sub

Private Sub TextBox1_GotFocus()
If Trim(TextBox1) <> "" And Mid(1 / 2, 2, 1) = "." Then
TextBox1 = Replace(Replace(Replace(TextBox1, ".", "~"), ",", "."), "~", ",")
TextBox1 = Format(TextBox1, "###0.00")
End If
End Sub
[/GPECODE]

Đó, nếu người dùng muốn chỉnh sửa gì cũng OK.

Thì nói cho cùng, Nghĩa cũng phải xài đến cái mà Nghĩa gọi là "Manh mún" của tôi, đúng không? ---> Mid(1 / 2, 2, 1)
Ẹc... Ẹc...
Tôi thì không quan tâm đến chuyện vặt, chỉ quan tâm GIẢI THUẬT (triển khai giải thuật thế nào là tuỳ mỗi người)
 
Upvote 0
Thì nói cho cùng, Nghĩa cũng phải xài đến cái mà Nghĩa gọi là "Manh mún" của tôi, đúng không? ---> Mid(1 / 2, 2, 1)
Ẹc... Ẹc...
Tôi thì không quan tâm đến chuyện vặt, chỉ quan tâm GIẢI THUẬT (triển khai giải thuật thế nào là tuỳ mỗi người)

Chính xác là "thủ thuật" của Thầy nó tổng quan hơn. Em không nhìn xa trông rộng như Thầy được.

Em nói "manh mún" ở đây là nếu không có thêm sự kiện GotFocus thì sẽ bị đão số sai, chứ không phải nói cách giải thuật của Thầy.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom