Unicode tiếng Việt trong VBA Excel

Liên hệ QC

phamduylong

-
Thành viên đã mất
Tham gia
30/12/06
Bài viết
918
Được thích
2,368
Nghề nghiệp
Giáo viên
Unicode bây giờ phải xác định là font chính khi nhập dữ liệu. Khổ nổi có một số ứng dụng chưa hỗ trợ tốt font này, trong đó có VBA Excel. Muốn VBA gởi vào ô B1 chuỗi "Lập trình với Excel" không đơn giản chút nào vì khi nhập Cells(1,2)="Lập trình với Excel" nó lại trở thành Cells(1,2)="L?p trình v?i Excel". Những dấu ? đó là những ký tự mà mã của nó vượt ngưỡng 255.
Vấn đề này nhiều bạn đã đưa lên diễn đàn nhưng ở nhiều bài khác nhau, tôi mở chuyên mục này để chúng ta cùng tham gia để có thể sử dụng Unicode đễ dàng hơn.
Qua học hỏi từ diễn đàn và vận dụng vào lập trình VBA Excel, tôi viết Unicode tiếng Việt bằng 3 cách. Xin nêu lên và các bạn bổ sung thêm:
1. Nhập chuỗi vào 1 ô trên vào bảng tính, viết lệnh truy xuất nó. Ví dụ nhập vào ô A1 của sheet2 câu trên. Câu lệnh viết:
Cells(1, 2) = Sheets("Sheet2").Cells(1,1)
Cách này đơn giản, nhưng bảng tính phải có 1 sheet chứa các chuỗi này. Nếu có ai đó chỉnh, xóa dữ liệu thì hỏng.
2. Dùng phép nối chuỗi và hàm ChrW để viết:
Câu trên viết thành:
Cells(1,2)= L" & ChrW(7853) & "p trình v" & ChrW(7899) & "i Excel"
Cách này rắc rối vì phải biết mã ậ=7953, ớ=7899, nhưng nó được viết ngay trong module, người sử dụng khó thay đổi được (bạn tham khảo bảng mã trong tập tin CodeUnicode.xls).
3. Dùng 1 hàm tự viết để hỗ trợ cách 2 (hàm UniVba). Cách sử dụng như sau:
- Nhập chuỗi cần viết vào 1 ô trong bàng tính. Ví dụ nhập vào ô A1 chuỗi “Xử lý tiếng Việt”.
- Ô B1 nhập công thức =univba(A1), hàm sẽ cho kết quả:
"X" & ChrW(7917) & " lý ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
Hàm UniVba dò tìm từng ký tự trong chuỗi, nếu ký tự nào có mã > 255 sẽ chuyển thành ChrW(mã) và ghép chúng bằng phép &.
Bạn copy ô B1 và dán vào module, rất nhanh và chính xác.
Mã:
‘===========
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
‘========
Các bạn tải tập tin CodeUnicode và UniVba về tham khảo.
 

File đính kèm

  • CodeUnicode.zip
    7.8 KB · Đọc: 3,964
  • UniVba.zip
    7.7 KB · Đọc: 3,235
Mình chưa dùng Office 2007 nên không biết. Bạn nào dùng rồi làm ơn cho biết Office 2007 trong VBA có hỗ trợ UniCode không vậy ?
ThankS !
Private Sub UserForm_Initialize()

Dim s1 As String

Dim s2 As String

s1 = UniConvert("Tooi vaaxn cofn yeeu ", "Telex")

s2 = UniConvert("Tooi giaf khoong ddieefu", "Telex")

UForm1.CoBox6.List = Array(s1, s2)

End Sub
Bài đã được tự động gộp:

Chuyển tiếng việt từ VBA listBox ra tiếng việt có dấu
Private Sub UserForm_Initialize()

Dim s1 As String

Dim s2 As String

s1 = UniConvert("Tooi vaaxn cofn yeeu ", "Telex")

s2 = UniConvert("Tooi giaf khoong ddieefu", "Telex")

UForm1.CoBox6.List = Array(s1, s2)

End Sub
 
Upvote 0
Chữ này sẽ ra chữ gì? Tôi chịu thua.

"ddieefu"
 
Upvote 0
Em có dùng file UniVba để chuyển 1 cụm từ sau đó đưa vào code, nhưng tới dòng lệnh là lấy 1 giá trị trong 1 ô của excel thì nó lại bị lỗi font.

Mã:
                ch2 = "//span[text()='" & "S" & ChrW(7889) & " " & ChrW(273) & "i" & ChrW(7879) & "n tho" & ChrW(7841) & "i: " & "']"
                Driver1.FindElementByXPath(ch2).Click

                Driver1.Wait 1500
           
                Driver1.FindElementById("input_line_0").SendKeys Keys.Control, "v"

                Driver1.FindElementById("input_line_0").SendKeys ATHANG01.Cells(i, "c").Value
 
Upvote 0
Web KT
Back
Top Bottom