Lỗi font chữ tiếng việt khi dùng hàm Char(number) trong excel (5 người xem)

  • Thread starter Thread starter LEHOC
  • Ngày gửi Ngày gửi
Liên hệ QC

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

LEHOC

Thành viên chính thức
Tham gia
11/1/17
Bài viết
89
Được thích
0
Chào các anh/chị!
Em gặp 1 vấn đề lỗi với font chữ mà không xử lý được, mong anh/chị nào biết chỉ giáo em với ạ.
ví dụ:
Chữ "ê" có code là 1, em dùng hàm Char(1) thì không trả về ê mà lại ra ký tự "?",
em code trong vba dùng ChrW() cũng bị lỗi "?" như trên ạ.
Máy em chạy win 10 home x64, đã cài 284 font tiếng việt, excel thì chạy bản 2016 pro ạ.
Em cảm ơn.
 
1. Để hiển thị, viết unicode tiếng Việt bạn không phải cài bất cứ phông chữ nào. Các phông chữ được cài mặc định trong system như Times New Roman, Arial, Verdana ... đều có chứa các ký tự Việt unicode.
Khi nhập liệu mới thì cứ unicode + Times New Roman thôi. Thời đại nào rồi mà vẫn còn dùng vd. VNI, TCVN3? Và làm việc với đối tác thì bắt đối tác cài phông chữ Việt?

2. "ê" trong tiếng Việt có điểm mã (code point) là &HEA = 234. Vậy thì
Mã:
Sub test()
    Range("A1").Value = ChrW(&HEA)
    Range("B1").Value = ChrW(234)
End Sub

3. Thường thì bạn không nên dùng Char ngoài sheet vì sẽ cho kết quả không mong đợi. Hàm Char nhận tham số từ 1 tới 255 là điểm mã của các ký tự ASCII. Chỉ có các mã tới 127 là giống nhau còn các điểm mã ở "nửa trên" thì tùy vào chuẩn và code page mà chúng sẽ xác định các ký tự khác nhau. Vì thế tuy mã 234 < 255 nhưng dùng với CHAR có thể cho kết quả không mong đợi. Vd. Tiêu Chuẩn Ba Lan qui định dùng chuẩn ISO-8859-2. Trong chuẩn này thì ký tự có điểm mã &HEA là ký tự "ę". Trong code page Windows-1250 thì điểm mã &HEA cũng xác định ký tự "ę". Trong khi đó trong vd. Windows-1258 (Vietnamese) thì điểm mã &HEA lại xác định ký tự "ê". Nếu bạn gửi tập tin cho đối tác là tôi với công thức cho A1
Mã:
=CHAR(234)
Thì tôi sẽ nhận được kết quả không như bạn và tôi mong đợi. Do tôi có system Windows phiên bản Ba Lan nên điểm mã &HEA = 234 sẽ xác định ký tự "ę" chứ không phải là ký tự khác. Đấy là nói tới "ê" có điểm mã là 234 < 255. Còn với các ký tự Việt unicode khác có điểm mã > 255 thì dĩ nhiên là không dùng được với CHAR rồi. Không phải chuyện "kết quả không như mong đợi" nữa mà là không dùng được CHAR - #VALUE!.

Nói chung để làm việc với các đối tác trên toàn thế giới thì chỉ nên dùng Char với điểm mã <= 127

Trong VBA thì cứ ChrW mà chiến thôi. Mỗi một điểm mã xác định một ký tự duy nhất trong bảng mã unicode.

Cũng nên nhớ là với văn bản nhận từ ngưừi khác thì nhiều khi cái mình nhìn thấy không như mình nghĩ đâu nhé. Vd. cùng 2 đoạn văn nhìn "y hệt nhau" nhưng một là unicode dựng sẵn còn cái kia là unicode tổ hợp.
 
1. Để hiển thị, viết unicode tiếng Việt bạn không phải cài bất cứ phông chữ nào. Các phông chữ được cài mặc định trong system như Times New Roman, Arial, Verdana ... đều có chứa các ký tự Việt unicode.
Khi nhập liệu mới thì cứ unicode + Times New Roman thôi. Thời đại nào rồi mà vẫn còn dùng vd. VNI, TCVN3? Và làm việc với đối tác thì bắt đối tác cài phông chữ Việt?

2. "ê" trong tiếng Việt có điểm mã (code point) là &HEA = 234. Vậy thì
Mã:
Sub test()
    Range("A1").Value = ChrW(&HEA)
    Range("B1").Value = ChrW(234)
End Sub

3. Thường thì bạn không nên dùng Char ngoài sheet vì sẽ cho kết quả không mong đợi. Hàm Char nhận tham số từ 1 tới 255 là điểm mã của các ký tự ASCII. Chỉ có các mã tới 127 là giống nhau còn các điểm mã ở "nửa trên" thì tùy vào chuẩn và code page mà chúng sẽ xác định các ký tự khác nhau. Vì thế tuy mã 234 < 255 nhưng dùng với CHAR có thể cho kết quả không mong đợi. Vd. Tiêu Chuẩn Ba Lan qui định dùng chuẩn ISO-8859-2. Trong chuẩn này thì ký tự có điểm mã &HEA là ký tự "ę". Trong code page Windows-1250 thì điểm mã &HEA cũng xác định ký tự "ę". Trong khi đó trong vd. Windows-1258 (Vietnamese) thì điểm mã &HEA lại xác định ký tự "ê". Nếu bạn gửi tập tin cho đối tác là tôi với công thức cho A1
Mã:
=CHAR(234)
Thì tôi sẽ nhận được kết quả không như bạn và tôi mong đợi. Do tôi có system Windows phiên bản Ba Lan nên điểm mã &HEA = 234 sẽ xác định ký tự "ę" chứ không phải là ký tự khác. Đấy là nói tới "ê" có điểm mã là 234 < 255. Còn với các ký tự Việt unicode khác có điểm mã > 255 thì dĩ nhiên là không dùng được với CHAR rồi. Không phải chuyện "kết quả không như mong đợi" nữa mà là không dùng được CHAR - #VALUE!.

Nói chung để làm việc với các đối tác trên toàn thế giới thì chỉ nên dùng Char với điểm mã <= 127

Trong VBA thì cứ ChrW mà chiến thôi. Mỗi một điểm mã xác định một ký tự duy nhất trong bảng mã unicode.

Cũng nên nhớ là với văn bản nhận từ ngưừi khác thì nhiều khi cái mình nhìn thấy không như mình nghĩ đâu nhé. Vd. cùng 2 đoạn văn nhìn "y hệt nhau" nhưng một là unicode dựng sẵn còn cái kia là unicode tổ hợp.
Em cảm ơn bác nhiều ạ!
Nhưng vấn đề của em còn oái ăm ở chỗ userform viết tiếng việt thì khi show lên các ký tự là tiếng việt thì hiển thị thành dấu chấm hỏi ạ.
Em chỉ bị lỗi với con laptop win 10 home x64 này thôi ạ.
 
Em cảm ơn bác nhiều ạ!
Nhưng vấn đề của em còn oái ăm ở chỗ userform viết tiếng việt thì khi show lên các ký tự là tiếng việt thì hiển thị thành dấu chấm hỏi ạ.
Em chỉ bị lỗi với con laptop win 10 home x64 này thôi ạ.
Nhưng bạn show lên ở đâu, thế nào? Nói mà không có tập tin thì ai giúp được?
 
Nhưng bạn show lên ở đâu, thế nào? Nói mà không có tập tin thì ai giúp được?
Em xin gửi bác file ạ.
Em xin mô tả lại lỗi:
Label trên (không lỗi font): được nhập Caption trên máy tính windows 10 Home x64, Office 2016 Pro (Máy 1)
Label dưới (bị lỗi font): được nhập trên windows 10 Pro x64, Office 2016 Pro (Máy 2)
Nếu form có combobox và additem là giá trị tiếng việt (mã code bé hơn 255) thì máy 2 hiển thị bị lỗi thành dấu ?, còn máy 1 không bị.
ví dụ: combobox.AddItem ="Mã" ~~> Máy 1 show form lên không bị lỗi, máy 2 bị.
Cả 2 máy tính đều dùng ngôn ngữ US, kiểu gõ US và dùng cùng 1 bộ gõ thứ 3 là EVKey ạ.
Em xin cảm ơn!
Link file
 
Lần chỉnh sửa cuối:
Em xin gửi bác file ạ.
Em xin mô tả lại lỗi:
Label trên (không lỗi font): được nhập Caption trên máy tính windows 10 Home x64, Office 2016 Pro (Máy 1)
Label dưới (bị lỗi font): được nhập trên windows 10 Pro x64, Office 2016 Pro (Máy 2)
Nếu form có combobox và additem là giá trị tiếng việt (mã code bé hơn 255) thì máy 2 hiển thị bị lỗi thành dấu ?, còn máy 1 không bị.
ví dụ: combobox.AddItem ="Mã" ~~> Máy 1 show form lên không bị lỗi, máy 2 bị.
Cả 2 máy tính đều dùng ngôn ngữ US, kiểu gõ US và dùng cùng 1 bộ gõ thứ 3 là EVKey ạ.
Em xin cảm ơn!
Link file
Bạn đã nhập Label2 như thế nào?
Bạn không thể nhập trực tiếp trong cửa sổ Properties cho thuộc tính Caption. Hãy vào VBE -> click Label2 để chọn nó -> click vào Label2 lần nữa để có chế độ Edit cho Label2 -> xóa dữ liệu cũ -> gõ những gì bạn muốn, vd. bằng Unikey *** -> click ngoài Label2 để hoàn tất.

Hãy luôn luôn dùng như sau nếu muốn gửi cho mọi đối tác (tức mở trên mọi máy) mà không bị lỗi
Mã:
ComboBox1.AddItem "M" & ChrW(227)
Tức mọi ký tự Việt (unicode nói chung) đều thay bằng ChrW(<mã ký tự>).
Nhiều người dịch "nửa vời", tức một số ký tự thay bằng ChrW(...) nhưng một số ký tự thì để nguyên. Kết quả là mở trên máy mình thì nhìn đẹp nhưng mở trên máy khác thì "đầu trâu mặt ngựa".

***: Tôi không dùng Unikey bao giờ nhưng tôi biết là gõ được. Còn EVKey thì không bao giờ dùng, không bao giờ nhìn thấy mặt. Tôi từ thời xưa tới giờ toàn dùng bàn phím của Windows để gõ văn bản tiếng Việt.
 
Bạn đã nhập Label2 như thế nào?
Bạn không thể nhập trực tiếp trong cửa sổ Properties cho thuộc tính Caption. Hãy vào VBE -> click Label2 để chọn nó -> click vào Label2 lần nữa để có chế độ Edit cho Label2 -> xóa dữ liệu cũ -> gõ những gì bạn muốn, vd. bằng Unikey *** -> click ngoài Label2 để hoàn tất.

Hãy luôn luôn dùng như sau nếu muốn gửi cho mọi đối tác (tức mở trên mọi máy) mà không bị lỗi
Mã:
ComboBox1.AddItem "M" & ChrW(227)
Tức mọi ký tự Việt (unicode nói chung) đều thay bằng ChrW(<mã ký tự>).
Nhiều người dịch "nửa vời", tức một số ký tự thay bằng ChrW(...) nhưng một số ký tự thì để nguyên. Kết quả là mở trên máy mình thì nhìn đẹp nhưng mở trên máy khác thì "đầu trâu mặt ngựa".

***: Tôi không dùng Unikey bao giờ nhưng tôi biết là gõ được. Còn EVKey thì không bao giờ dùng, không bao giờ nhìn thấy mặt. Tôi từ thời xưa tới giờ toàn dùng bàn phím của Windows để gõ văn bản tiếng Việt.
Em cảm ơn anh.
Anh cho em hỏi vấn đề như sau ạ: em dùng MsgBox ChrW() thì có mày hiển thị đúng và có máy bị lỗi thành dấu ?, anh biết lỗi này do đâu không ạ?
Do phiên bản win hay office hay gì ạ?
 
Lần chỉnh sửa cuối:
Em cảm ơn anh.
Anh cho em hỏi vấn đề như sau ạ: em dùng MsgBox ChrW() thì có mày hiển thị đúng và có máy bị lỗi thành dấu ?, anh biết lỗi này do đâu không ạ?
Do phiên bản win hay office hay gì ạ?
Cám ơn nhưng tôi đã, đang và sẽ không dùng. :D
Để viết tiếng Việt trên mạng, Word, Excel, notepad, tóm lại ở mọi nơi tôi không phải cài đặt Unikey hay bất cứ bộ gõ nào cả. Tôi dùng bàn phím của Windows có sẵn trong system thôi.
 
Anh có biết lỗi hiển thị tiếng việt khi em dùng ChrW() cho MsgBox không ạ, Với mày 1 em dùng bình thường, còn máy 2 thì bị lỗi (lỗi cả khi gõ trực tiếp trong Properties caption label)
Em cảm ơn anh!
 
Nhưng em muốn hiểu được vấn đề là có máy vẫn show được, có máy không thì do đâu ạ?
Em cảm ơn!
Bạn muốn nói là trên máy 1 MsgBox hiển thị đúng TẤT CẢ các ký tự sau?

à, ả, ã, á, ạ, ă, ằ, ẳ, ẵ, ắ, ặ, â, ầ, ẩ, ẫ, ấ, ậ, đ, è, ẻ, ẽ, é, ẹ, ê, ề, ể, ễ, ế, ệ, ì, ỉ, ĩ, í, ị, ò, ỏ, õ, ó, ọ, ô, ồ, ổ, ỗ, ố, ộ, ơ, ờ, ở, ỡ, ớ, ợ, ù, ủ, ũ, ú, ụ, ư, ừ, ử, ữ, ứ, ự, ỳ, ỷ, ỹ, ý, ỵ

Bạn đã kiểm tra chưa?

Nếu bạn đã kiểm tra rồi và MsgBox hiển thị đúng TẤT CẢ các ký tự ở trên, với giả thiết là bạn thay tất cả các ký tự tiếng Việt bằng ChrW(...) thì tôi chịu vì tôi không ngồi ở máy bạn nên không "nghiên cứu" được.

Nói trắng ra thì tôi không tin là trên máy 1 hiển thị đẹp đẽ vd.
Mã:
Sub test()
Dim s As String
    s = "Th" & ChrW(224) & "nh c" & ChrW(244) & "ng r" & ChrW(7921) & "c r" & ChrW(7905) & " r" & ChrW(7891) & _
            "i. S" & ChrW(432) & ChrW(7899) & "ng " & ChrW(417) & "i l" & ChrW(224) & " s" & ChrW(432) & ChrW(7899) & "ng." & vbCrLf & _
            ChrW(224) & ", " & ChrW(7843) & ", " & ChrW(227) & ", " & ChrW(225) & ", " & ChrW(7841) & ", " & ChrW(259) & _
            ", " & ChrW(7857) & ", " & ChrW(7859) & ", " & ChrW(7861) & ", " & ChrW(7855) & ", " & ChrW(7863) & ", " & _
            ChrW(226) & ", " & ChrW(7847) & ", " & ChrW(7849) & ", " & ChrW(7851) & ", " & ChrW(7845) & ", " & ChrW(7853) & _
            ", " & ChrW(273) & ", " & ChrW(232) & ", " & ChrW(7867) & ", " & ChrW(7869) & ", " & ChrW(233) & ", " & _
            ChrW(7865) & ", " & ChrW(234) & ", " & ChrW(7873) & ", " & ChrW(7875) & ", " & ChrW(7877) & ", " & ChrW(7871) & _
            ", " & ChrW(7879) & vbCrLf & _
            ChrW(236) & ", " & ChrW(7881) & ", " & ChrW(297) & ", " & ChrW(237) & ", " & ChrW(7883) & ", " & ChrW(242) & _
            ", " & ChrW(7887) & ", " & ChrW(245) & ", " & ChrW(243) & ", " & ChrW(7885) & ", " & ChrW(244) & ", " & _
            ChrW(7891) & ", " & ChrW(7893) & ", " & ChrW(7895) & ", " & ChrW(7889) & ", " & ChrW(7897) & ", " & ChrW(417) & _
            ", " & ChrW(7901) & ", " & ChrW(7903) & ", " & ChrW(7905) & ", " & ChrW(7899) & ", " & ChrW(7907) & ", " & _
            ChrW(249) & ", " & ChrW(7911) & ", " & ChrW(361) & ", " & ChrW(250) & ", " & ChrW(7909) & vbCrLf & _
            ChrW(432) & ", " & ChrW(7915) & ", " & ChrW(7917) & ", " & ChrW(7919) & ", " & ChrW(7913) & ", " & _
            ChrW(7921) & ", " & ChrW(7923) & ", " & ChrW(7927) & ", " & ChrW(7929) & ", " & ChrW(253) & _
            ", " & ChrW(7925)
    Range("A1").Value = s
    MsgBox s
End Sub

Tất nhiên trong A1 có:

Thành công rực rỡ rồi. Sướng ơi là sướng.
à, ả, ã, á, ạ, ă, ằ, ẳ, ẵ, ắ, ặ, â, ầ, ẩ, ẫ, ấ, ậ, đ, è, ẻ, ẽ, é, ẹ, ê, ề, ể, ễ, ế, ệ
ì, ỉ, ĩ, í, ị, ò, ỏ, õ, ó, ọ, ô, ồ, ổ, ỗ, ố, ộ, ơ, ờ, ở, ỡ, ớ, ợ, ù, ủ, ũ, ú, ụ
ư, ừ, ử, ữ, ứ, ự, ỳ, ỷ, ỹ, ý, ỵ

Nhưng tôi không tin là với code như thế trong MsgBox bạn cũng nhìn thấy y như trong A1.

Nhưng nói cho cùng thì tôi không biết hết mọi cái trên đời. Có rất nhiều cái tôi cũng chả biết. Con người chả ai biết hết mọi cái cả. Biết đâu trên máy bạn nó thế vì những lý do mà tôi chịu không biết được.
 
Bạn muốn nói là trên máy 1 MsgBox hiển thị đúng TẤT CẢ các ký tự sau?

à, ả, ã, á, ạ, ă, ằ, ẳ, ẵ, ắ, ặ, â, ầ, ẩ, ẫ, ấ, ậ, đ, è, ẻ, ẽ, é, ẹ, ê, ề, ể, ễ, ế, ệ, ì, ỉ, ĩ, í, ị, ò, ỏ, õ, ó, ọ, ô, ồ, ổ, ỗ, ố, ộ, ơ, ờ, ở, ỡ, ớ, ợ, ù, ủ, ũ, ú, ụ, ư, ừ, ử, ữ, ứ, ự, ỳ, ỷ, ỹ, ý, ỵ

Bạn đã kiểm tra chưa?

Nếu bạn đã kiểm tra rồi và MsgBox hiển thị đúng TẤT CẢ các ký tự ở trên, với giả thiết là bạn thay tất cả các ký tự tiếng Việt bằng ChrW(...) thì tôi chịu vì tôi không ngồi ở máy bạn nên không "nghiên cứu" được.

Nói trắng ra thì tôi không tin là trên máy 1 hiển thị đẹp đẽ vd.
Mã:
Sub test()
Dim s As String
    s = "Th" & ChrW(224) & "nh c" & ChrW(244) & "ng r" & ChrW(7921) & "c r" & ChrW(7905) & " r" & ChrW(7891) & _
            "i. S" & ChrW(432) & ChrW(7899) & "ng " & ChrW(417) & "i l" & ChrW(224) & " s" & ChrW(432) & ChrW(7899) & "ng." & vbCrLf & _
            ChrW(224) & ", " & ChrW(7843) & ", " & ChrW(227) & ", " & ChrW(225) & ", " & ChrW(7841) & ", " & ChrW(259) & _
            ", " & ChrW(7857) & ", " & ChrW(7859) & ", " & ChrW(7861) & ", " & ChrW(7855) & ", " & ChrW(7863) & ", " & _
            ChrW(226) & ", " & ChrW(7847) & ", " & ChrW(7849) & ", " & ChrW(7851) & ", " & ChrW(7845) & ", " & ChrW(7853) & _
            ", " & ChrW(273) & ", " & ChrW(232) & ", " & ChrW(7867) & ", " & ChrW(7869) & ", " & ChrW(233) & ", " & _
            ChrW(7865) & ", " & ChrW(234) & ", " & ChrW(7873) & ", " & ChrW(7875) & ", " & ChrW(7877) & ", " & ChrW(7871) & _
            ", " & ChrW(7879) & vbCrLf & _
            ChrW(236) & ", " & ChrW(7881) & ", " & ChrW(297) & ", " & ChrW(237) & ", " & ChrW(7883) & ", " & ChrW(242) & _
            ", " & ChrW(7887) & ", " & ChrW(245) & ", " & ChrW(243) & ", " & ChrW(7885) & ", " & ChrW(244) & ", " & _
            ChrW(7891) & ", " & ChrW(7893) & ", " & ChrW(7895) & ", " & ChrW(7889) & ", " & ChrW(7897) & ", " & ChrW(417) & _
            ", " & ChrW(7901) & ", " & ChrW(7903) & ", " & ChrW(7905) & ", " & ChrW(7899) & ", " & ChrW(7907) & ", " & _
            ChrW(249) & ", " & ChrW(7911) & ", " & ChrW(361) & ", " & ChrW(250) & ", " & ChrW(7909) & vbCrLf & _
            ChrW(432) & ", " & ChrW(7915) & ", " & ChrW(7917) & ", " & ChrW(7919) & ", " & ChrW(7913) & ", " & _
            ChrW(7921) & ", " & ChrW(7923) & ", " & ChrW(7927) & ", " & ChrW(7929) & ", " & ChrW(253) & _
            ", " & ChrW(7925)
    Range("A1").Value = s
    MsgBox s
End Sub

Tất nhiên trong A1 có:

Thành công rực rỡ rồi. Sướng ơi là sướng.
à, ả, ã, á, ạ, ă, ằ, ẳ, ẵ, ắ, ặ, â, ầ, ẩ, ẫ, ấ, ậ, đ, è, ẻ, ẽ, é, ẹ, ê, ề, ể, ễ, ế, ệ
ì, ỉ, ĩ, í, ị, ò, ỏ, õ, ó, ọ, ô, ồ, ổ, ỗ, ố, ộ, ơ, ờ, ở, ỡ, ớ, ợ, ù, ủ, ũ, ú, ụ
ư, ừ, ử, ữ, ứ, ự, ỳ, ỷ, ỹ, ý, ỵ

Nhưng tôi không tin là với code như thế trong MsgBox bạn cũng nhìn thấy y như trong A1.

Nhưng nói cho cùng thì tôi không biết hết mọi cái trên đời. Có rất nhiều cái tôi cũng chả biết. Con người chả ai biết hết mọi cái cả. Biết đâu trên máy bạn nó thế vì những lý do mà tôi chịu không biết được.
Ở máy 1 thì show lên bình thường anh ơi.
Code ạ
PHP:
Sub tst()
MsgBox "à , " & ChrW(7843) & ", ã, á, " & ChrW(7841) & ", " & ChrW(259) & ", " & ChrW(7857) & ", " & ChrW(7859) & ", " & ChrW(7861) & ", " & ChrW(7855) & ", " & ChrW(7863) & ", â, " & ChrW(7847) & ", " & ChrW(7849) & ", " & ChrW(7851) & ", " & ChrW(7845) & ", " & ChrW(7853) & ", " & ChrW(273) & ","
MsgBox "è, " & ChrW(7867) & ", " & ChrW(7869) & ", é, " & ChrW(7865) & ", ê, " & ChrW(7873) & ", " & ChrW(7875) & ", " & ChrW(7877) & ", " & ChrW(7871) & ", " & ChrW(7879) & ", ì, " & ChrW(7881) & ", " & ChrW(297) & ", Ã, " & ChrW(7883) & ","
MsgBox "ò, " & ChrW(7887) & ", õ, ó, " & ChrW(7885) & ", ô, " & ChrW(7891) & ", " & ChrW(7893) & ", " & ChrW(7895) & ", " & ChrW(7889) & ", " & ChrW(7897) & ", " & ChrW(417) & ", " & ChrW(7901) & ", " & ChrW(7903) & ", " & ChrW(7905) & ", " & ChrW(7899) & ", " & ChrW(7907) & ","
MsgBox "ù, " & ChrW(7911) & ", " & ChrW(361) & ", ú, " & ChrW(7909) & ", " & ChrW(432) & ", " & ChrW(7915) & ", " & ChrW(7917) & ", " & ChrW(7919) & ", " & ChrW(7913) & ", " & ChrW(7921) & ", " & ChrW(7923) & ", " & ChrW(7927) & ", " & ChrW(7929) & ", ý, " & ChrW(7925)
End Sub
Function UniVba(TxtUni As String) As String
If TxtUni = "" Then
    UniVba = ""
Else
    TxtUni = TxtUni & " "
    If AscW(Left(TxtUni, 1)) < 256 Then UniVba = """"
    For n = 1 To Len(TxtUni) - 1
        uni1 = Mid(TxtUni, n, 1)
        uni2 = AscW(Mid(TxtUni, n + 1, 1))
        If AscW(uni1) > 255 And uni2 > 255 Then
            UniVba = UniVba & "ChrW(" & AscW(uni1) & ") & "
        ElseIf AscW(uni1) > 255 And uni2 < 256 Then
            UniVba = UniVba & "ChrW(" & AscW(uni1) & ") & """
        ElseIf AscW(uni1) < 256 And uni2 > 255 Then
            UniVba = UniVba & uni1 & """ & "
        Else
            UniVba = UniVba & uni1
        End If
    Next
    If Right(UniVba, 4) = " & """ Then
        UniVba = Mid(UniVba, 1, Len(UniVba) - 4)
    Else
        UniVba = UniVba & """"
    End If
End If
End Function
Trong đoạn mã trên em dùng hàm UniVba trong diễn đàn để chuyển đổi ký tự sang mã ChrW() trong giao diện excel, sau đó em copy vào code, nhưng có vài ký tự có code number <255 thì được giữ nguyên, sau khi em copy và dán vào VBA thì tự động chuyển thành ký tự VNI và show MsgBox lên thì hiển thị đúng. Nếu em chuyển cả các mã <255 thành ChrW() thì vẫn đúng.
Còn đối với máy 2 lại bị lỗi nếu dùng ChrW() thì các mã >255 sẽ thành ?, còn các mã <255 hiển thị đúng, nếu dùng hoàn toàn VNI để tương thích với máy 1 thì máy 2 lại hiển thị nguyên mã VNI mà không phải là Unicode (trên máy 2 em copy mã được chuyển đổi trong excel bằng Function UniVba thì copy sang code không tự chuyển các mã <255 sang VNI)
 

File đính kèm

  • tst1.JPG
    tst1.JPG
    15.8 KB · Đọc: 10
  • tst2.JPG
    tst2.JPG
    14.8 KB · Đọc: 9
  • tst3.JPG
    tst3.JPG
    16.2 KB · Đọc: 8
  • tst4.JPG
    tst4.JPG
    15.4 KB · Đọc: 8
Lần chỉnh sửa cuối:
Ở máy 1 thì show lên bình thường anh ơi.
Code ạ
PHP:
Sub tst()
MsgBox "à , " & ChrW(7843) & ", ã, á, " & ChrW(7841) & ", " & ChrW(259) & ", " & ChrW(7857) & ", " & ChrW(7859) & ", " & ChrW(7861) & ", " & ChrW(7855) & ", " & ChrW(7863) & ", â, " & ChrW(7847) & ", " & ChrW(7849) & ", " & ChrW(7851) & ", " & ChrW(7845) & ", " & ChrW(7853) & ", " & ChrW(273) & ","
MsgBox "è, " & ChrW(7867) & ", " & ChrW(7869) & ", é, " & ChrW(7865) & ", ê, " & ChrW(7873) & ", " & ChrW(7875) & ", " & ChrW(7877) & ", " & ChrW(7871) & ", " & ChrW(7879) & ", ì, " & ChrW(7881) & ", " & ChrW(297) & ", Ã, " & ChrW(7883) & ","
MsgBox "ò, " & ChrW(7887) & ", õ, ó, " & ChrW(7885) & ", ô, " & ChrW(7891) & ", " & ChrW(7893) & ", " & ChrW(7895) & ", " & ChrW(7889) & ", " & ChrW(7897) & ", " & ChrW(417) & ", " & ChrW(7901) & ", " & ChrW(7903) & ", " & ChrW(7905) & ", " & ChrW(7899) & ", " & ChrW(7907) & ","
MsgBox "ù, " & ChrW(7911) & ", " & ChrW(361) & ", ú, " & ChrW(7909) & ", " & ChrW(432) & ", " & ChrW(7915) & ", " & ChrW(7917) & ", " & ChrW(7919) & ", " & ChrW(7913) & ", " & ChrW(7921) & ", " & ChrW(7923) & ", " & ChrW(7927) & ", " & ChrW(7929) & ", ý, " & ChrW(7925)
End Sub
Function UniVba(TxtUni As String) As String
If TxtUni = "" Then
    UniVba = ""
Else
    TxtUni = TxtUni & " "
    If AscW(Left(TxtUni, 1)) < 256 Then UniVba = """"
    For n = 1 To Len(TxtUni) - 1
        uni1 = Mid(TxtUni, n, 1)
        uni2 = AscW(Mid(TxtUni, n + 1, 1))
        If AscW(uni1) > 255 And uni2 > 255 Then
            UniVba = UniVba & "ChrW(" & AscW(uni1) & ") & "
        ElseIf AscW(uni1) > 255 And uni2 < 256 Then
            UniVba = UniVba & "ChrW(" & AscW(uni1) & ") & """
        ElseIf AscW(uni1) < 256 And uni2 > 255 Then
            UniVba = UniVba & uni1 & """ & "
        Else
            UniVba = UniVba & uni1
        End If
    Next
    If Right(UniVba, 4) = " & """ Then
        UniVba = Mid(UniVba, 1, Len(UniVba) - 4)
    Else
        UniVba = UniVba & """"
    End If
End If
End Function
Trong đoạn mã trên em dùng hàm UniVba trong diễn đàn để chuyển đổi ký tự sang mã ChrW() trong giao diện excel, sau đó em copy vào code, nhưng có vài ký tự có code number <255 thì được giữ nguyên, sau khi em copy và dán vào VBA thì tự động chuyển thành ký tự VNI và show MsgBox lên thì hiển thị đúng. Nếu em chuyển cả các mã <255 thành ChrW() thì vẫn đúng.
Còn đối với máy 2 lại bị lỗi nếu dùng ChrW() thì các mã >255 sẽ thành ?, còn các mã <255 hiển thị đúng, nếu dùng hoàn toàn VNI để tương thích với máy 1 thì máy 2 lại hiển thị nguyên mã VNI mà không phải là Unicode (trên máy 2 em copy mã được chuyển đổi trong excel bằng Function UniVba thì copy sang code không tự chuyển các mã <255 sang VNI)
1. Thực ra tôi muốn kiểm tra code của tôi chứ không phải code của bạn. Chuỗi s của tôi chắc chắn là unicode, vì thế tôi muốn kiểm nghiệm nó trong MsgBox của bạn vì bạn khẳng định là MsgBox của bạn hiển thị được tiếng Việt. Tôi quan tâm tới chuỗi s của tôi thôi. Tức chạy code của tôi.

2. Về code của bạn thì tôi chạy trên XP Home 32 bit + Excel 2010 32 bit, Windows 8 32 bit + Excel 2013 32 bit, Windows 10 64 bit + Excel 2007 32 bit. Trên cả 3 tôi có như hình

msgbox1.JPG
 
1. Thực ra tôi muốn kiểm tra code của tôi chứ không phải code của bạn. Chuỗi s của tôi chắc chắn là unicode, vì thế tôi muốn kiểm nghiệm nó trong MsgBox của bạn vì bạn khẳng định là MsgBox của bạn hiển thị được tiếng Việt. Tôi quan tâm tới chuỗi s của tôi thôi. Tức chạy code của tôi.
Em đã test code của anh trên máy 1 (Windows 10 Home x64, Office Pro Plus 2016 x64.
Và đây là KQ:
223678
Bài đã được tự động gộp:

2. Về code của bạn thì tôi chạy trên XP Home 32 bit + Excel 2010 32 bit, Windows 8 32 bit + Excel 2013 32 bit, Windows 10 64 bit + Excel 2007 32 bit. Trên cả 3 tôi có như hình

View attachment 223676

Như trong hình anh test code của em, em nhìn thấy 1 vấn đề mà trên máy 2 của em cũng bị và cũng show Msg lỗi: đó là các mã <255 sẽ tự động hiên thị thành dấu chấm hỏi mà không còn là ký tự VNI như code nguyên thuỷ ==> những máy bị như thế tức sẽ lỗi khi dùng Msg, kể cả dùng hết ChrW() như code của anh.
Em đang thắc mắc là với máy 1 thì có điều gì mới làm cho nó hỗ trợ show Msg Unicode!!!!!!!!===\.===\.
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom