Unicode tiếng Việt trong VBA Excel

Liên hệ QC MyVTV Add-ins

phamduylong

-
Thành viên đã mất
Tham gia ngày
30 Tháng mười hai 2006
Bài viết
920
Được thích
2,362
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,656
  • UniVba.zip
    7.7 KB · Đọc: 2,939

Đào Việt Cường

Cu Tí sành điệu
Thành viên danh dự
Tham gia ngày
11 Tháng sáu 2006
Bài viết
527
Được thích
758
Giới tính
Nam
Nghề nghiệp
Kiểm toán nhà nước
Dear phamduylong,
------------------
Em chưa hiểu lắm mục đích ứng dụng của UniVba và ảnh hưởng của nó tới Excel VBA.
Unicode tiếng Việt trong VBA Excel?
Đọc tên chủ đề dễ nhầm tưởng rằng trong môi trường lập trình Excel VBA chúng ta có thể sử dụng UNICODE - giống như môi trường DOT.NET?

Điều nữa là kết quả của hàm vẫn không thể xử lý được vấn đề cốt lõi (core) của VBA (phiên bản tính đến thời điểm này) là nó không được hỗ trợ UNICODE. Hãy quan sát kết quả tại Immediate
Windows:
?Univba(Range("A1"))
?"X" & ChrW(7917) & " l? ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
X? l? ti?ng Vi?t
Cái mà người lập trình VBA mong đợi là
?"X" & ChrW(7917) & " l? ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
Kết quả phải là:
Xử lý tiếng Việt
 
Lần chỉnh sửa cuối:

tedaynui

(*_*)
Thành viên danh dự
Tham gia ngày
12 Tháng tám 2006
Bài viết
1,877
Được thích
2,471
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 !
 

Đào Việt Cường

Cu Tí sành điệu
Thành viên danh dự
Tham gia ngày
11 Tháng sáu 2006
Bài viết
527
Được thích
758
Giới tính
Nam
Nghề nghiệp
Kiểm toán nhà nước
Dear tedaynui,
--------------
Visual Basic for Applications tích hợp trong MS Excel 2007 vẫn là version 6.5 anh ạ!
Nghĩa là các phiên bản cho tới thời điểm này vẫn dùng chung một thư viện:
C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6.DLL

Hi vọng trong tương lai người lập trình có:
C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE7.DLL
và hỗ trợ hoàn toàn UNICODE
Nhưng em nghe nói Microsoft tuyên bố không hỗ trợ Visual Basic 6 nữa, không biết mấy ổng có quan tâm đến đề nghị của anh không!

Lập trình với Excel 2007, chúng ta chỉ quan tâm 2 thư viện cơ bản:
Microsoft Office 12.0 Object Library
trong: C:\Program Files\Common Files\Microsoft Shared\office12\mso.dll

Microsoft Excel 12.0 Object Library
trong: C:\Program Files\Microsoft Office\Office12\EXCEL.EXE
 
Lần chỉnh sửa cuối:

lethanhnhan

Thành viên chính thức
Tham gia ngày
27 Tháng năm 2007
Bài viết
76
Được thích
248
To:Đào Việt Cường

Còn VSTO Tools For Office 2007 thì sao?

Lê Thanh Nhân
 

Đào Việt Cường

Cu Tí sành điệu
Thành viên danh dự
Tham gia ngày
11 Tháng sáu 2006
Bài viết
527
Được thích
758
Giới tính
Nam
Nghề nghiệp
Kiểm toán nhà nước
Oh, Dear lethanhnhan
---------------------
VSTO là một lĩnh vực nâng cao rồi - đó là suy nghĩ của em khi mọi người đề cập vấn đề này trên www.webketoan.com - nơi hội tụ những kiến thức chuyên ngành tài chính - kế toán hơn là nơi để trao đổi những kinh nghiệm phát triển ứng dụng.

Nhưng với www.Giaiphapexcel.com, em tin rằng một ngày nào đó VSTO sẽ trở thành đối tượng nghiên cứu chủ đạo của diễn đàn.

Những điều mà VSTO có thể đem lại (the sự hiểu biết có giới hạn của em):
- Hỗ trợ hoàn toàn UNICODE
- Khai thác tối đa sức mạnh của .NET (Microsoft .NET Framework)
- Tạo ra ứng dụng Office chuyên nghiệp.
Tuy nhiên muốn tiếp cập được với VSTO, người lập trình phải có kiến thức nhất định về Visual Studio .Net. Theo em, một khi đã có những kiến thức nền tảng căn bản về Visual Studio thì lập trình VSTO không khác gì lập trình VBA. Cái khó khăn của người lập trình không chuyên là làm sao lĩnh hội được cái "nền tảng căn bản" đó!
Có vẻ như sắp lạc đề, em xin nhường lời cho hai chuyên gia TuanVNUNI và anh LeVanDuyet trong một chủ đề khác về VSTO.
 

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
6,957
Được thích
23,808
Cám ơn bác Long đã đưa ra các biện pháp xử lý font Unicode.

Liệu có cách nào có thể hiện tiếng Việt trong Msgbox và Inputbox không (ngoài cách của anh Tuân) hả bác?
 

phamduylong

-
Thành viên đã mất
Tham gia ngày
30 Tháng mười hai 2006
Bài viết
920
Được thích
2,362
Nghề nghiệp
Giáo viên
Đào Việt Cường đã viết:
Unicode tiếng Việt trong VBA Excel?
Đọc tên chủ đề dễ nhầm tưởng rằng trong môi trường lập trình Excel VBA chúng ta có thể sử dụng UNICODE - giống như môi trường DOT.NET?
Các phiên bản từ Excel 2000 về sau hỗ trợ tương đối tốt UniTV (UNICODE tiếng Việt) chứ không như bạn Cường nhận xét.
Có nhiều ứng dụng hỗ trợ UNI tiếng Việt cho Excel được viết hoàn toàn bằng VBA Excel (chuyển qua lại giữa các bảng mã, đọc số tiếng Việt, sắp xếp tiếng Việt,..) mà khi nó hoạt động, giao diện của nó thể hiện bằng UniTV rất đẹp không khác các ứng dụng của Windows. VNI Windows, ABC thể hiện trên Form không thể sánh bằng UniTV. Các bạn có thể tải TVEXCEL01 về để thấy việc hỗ trợ UniTV của VBA Excel.
Tuy nhiên, không phải 100% là tốt. Các đối tượng trong Form như Lable, TextBox, ListBox, ComboBox, … đều thể hiện tốt UniTV nhưng còn một vài trở ngại như: Caption của Form, không nhập được UniTV. Các thuộc tính trong Properties như Caption (của Lable, CommandButton), Value (của TextBox, ListBox), … không cho nhập trực tiếp UniTV nhưng có thể gán UniTV khi chương trình chạy bằng cách viết lệnh trong Module. Các hộp thoại của InputBox, MsgBox không thể hiện được tiếng Việt (tôi chưa biết cách làm, không biết Excel 2007 có tiến bộ hơn không vì tôi chưa sử dụng).
Một trở ngại lớn nhất là không thể viết UniTV trực tiếp trên module được (nhưng các bảng mã như VNI Windows, ABC thì được). VBA có hàm ChrW dùng để chuyển mã UNICODE sang ký tự, tôi nêu vấn đề nhằm mục đích tìm cách nào nhập UniTV trong VBA Excel thuận lợi và chính xác hơn.
Việc viết UniTV ứng dụng rất nhiều trong Excel vì bây giờ UNICODE được xem như là font chuẩn của VN. Tôi đưa 2 ví dụ nhỏ:

1. Viết thủ tục để ghi vào các ô A1, A2, …, A7 các chuỗi UNICODE “Thứ hai”, “Thứ ba”, …, “Chủ nhật”
Sub ThuVN()
Cells(1, 1) = "Th" & ChrW(7913) & " hai"
Cells(2, 1) = "Th" & ChrW(7913) & " ba"
Cells(3, 1) = "Th" & ChrW(7913) & " t" & ChrW(432)
Cells(4, 1) = "Th" & ChrW(7913) & " n" & ChrW(259) & "m"
Cells(5, 1) = "Th" & ChrW(7913) & " sáu"
Cells(6, 1) = "Th" & ChrW(7913) & " b" & ChrW(7843) & "y"
Cells(7, 1) = "Ch" & ChrW(7911) & " nh" & ChrW(7853) & "t"
End Sub

Thay vì nhập “Chủ nhật”, phải nhập là "Ch" & ChrW(7911) & " nh" & ChrW(7853) & "t" thật rắc rối và chắc chắn phải có sai ! Hàm UniVba sẽ giúp chúng ta viết nhanh những chuỗi đó.

2. Viết hàm NGAYUNI(ngay) để chuyển 1 ngày trong ô thành thứ, ngày, tháng, năm. Ví dụ ô A10 có giá trị là ngày “2/6/2007”, ô D10 nhập công thức =NGAYUNI(A10) sẽ cho kết quả:
“Thứ bảy, ngày 02 tháng 06 năm 2007” bằng UNICODE TIẾNG Việt.

Function NGAYUNI(ngay)
dd = Day(ngay)
mm = Month(ngay)
yy = Year(ngay)
thu = Weekday(ngay)
Select Case thu
Case 1
thu = "Ch" & ChrW(7911) & " nh" & ChrW(7853) & "t"
Case 2
thu = "Th" & ChrW(7913) & " hai"
Case 3
thu = "Th" & ChrW(7913) & " ba"
Case 4
thu = "Th" & ChrW(7913) & " t" & ChrW(432)
Case 5
thu = "Th" & ChrW(7913) & " n" & ChrW(259) & "m"
Case 6
thu = "Th" & ChrW(7913) & " sáu"
Case 7
thu = "Th" & ChrW(7913) & " b" & ChrW(7843) & "y"
End Select
NGAYUNI = thu & ", ngày " & Format(dd, "00") & " tháng " & Format(mm, "00") & " n" & ChrW(259) & "m " & yy
End Function
‘================

Dưới đây là hàm NGAYVNI, NGAYABC cũng tương tự như NGAYUNI nhưng viết cho VNI Windows và ABC, cách viết đơn giản hơn nhiều.
‘==============
Function NGAYVNI(ngay)
dd = Day(ngay)
mm = Month(ngay)
yy = Year(ngay)
thu = Weekday(ngay)
Select Case thu
Case 1
thu = "Chuû nhaät"
Case 2
thu = "Thöù hai"
Case 3
thu = "Thöù ba"
Case 4
thu = "Thöù tö"
Case 5
thu = "Thöù naêm"
Case 6
thu = "Thöù saùu"
Case 7
thu = "Thöù baûy"
End Select
NgayVni = thu & ", ngaøy " & Format(dd, "00") & " thaùng " & Format(mm, "00") & " naêm " & yy
End Function

‘====================
Function NGAYABC(ngay)
dd = Day(ngay)
mm = Month(ngay)
yy = Year(ngay)
thu = Weekday(ngay)
Select Case thu
Case 1
thu = "Chñ nhËt"
Case 2
thu = "Thø hai"
Case 3
thu = "Thø ba"
Case 4
thu = "Thø t&shy;"
Case 5
thu = "Thø n¨m"
Case 6
thu = "Thø s¸u"
Case 7
thu = "Thø b¶y"
End Select
NGAYABC = thu & ", ngµy " & Format(dd, "00") & " th¸ng " & Format(mm, "00") & " n¨m " & yy
End Function
‘=============

Theo tôi biết, hiện nay dân Excel vẫn còn sử dụng Vni Windows, ABC nhiều. Các bài Excel tải lên Giai phapExcel cũng vậy. Qua tìm hiểu, nguyên nhân họ không muốn chuyển qua UNICODE là vì:
- Các dữ liệu cũ còn đó, phải nhập tiếp thôi. Qua UNICODE lại rối với 2 bảng mã.
- Công cụ hỗ trợ cho UNICODE trên Excel còn quá ít, chưa tạo được động cơ để họ chuyển qua UNICODE.
Qua diễn đàn này, chúng ta cùng nhau tạo những công cụ tốt hơn cho UNICODE tiếng Việt để cư dân Excel sử dụng thống nhất UNICODE cho các bảng tính Excel.
 

File đính kèm

  • UniVba.zip
    13.9 KB · Đọc: 1,149
Lần chỉnh sửa cuối:

Mr Okebab

Ngon Ngất Ngây
Thành viên đã mất
Tham gia ngày
6 Tháng tám 2006
Bài viết
3,262
Được thích
3,776
Có hàm nào dùng cho Msgbox mà gõ Unicode không bác ?? Khi hiển thị ra cũng là TV luôn.
Cảm ơn nhiều!

Thân!
 

chibi

Thành viên tích cực
Thành viên danh dự
Tham gia ngày
10 Tháng một 2007
Bài viết
1,123
Được thích
625
Có đoạn
Mã:
Dim lenh1 As CommandBarButton
Dim cb As CommandBar
Application.CommandBars.Add(Name:="vidu_toolbar").Visible = True
With Application.CommandBars("vidu_toolbar")
    .Position = msoBarTop
    .Protection = msoBarNoCustomize
End With
Set lenh1 = Application.CommandBars("vidu_toolbar").Controls.Add(Type:=msoControlButton)
With lenh1
    .style = msoButtonIconAndCaption
    .FaceId = 293 
    .Caption = "   Xoá dòng"
    .OnAction = "sheet1.xoa"
End With
Hiện tượng xảy ra như sau: 2 máy cùng sử dụng VietKey (cài đặt từ cùng 1 bộ setup) nhưng "Xoá dòng" ở 2 máy hiển thị khác nhau.
Xin các bạn giải thích và cho cách khắc phục.
(Cho biết: UniVba("Xoá dòng")="Xoá dòng")
 

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,419
Được thích
9,837
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
chibi đã viết:
Có đoạn
Mã:
Dim lenh1 As CommandBarButton
Dim cb As CommandBar
Application.CommandBars.Add(Name:="vidu_toolbar").Visible = True
With Application.CommandBars("vidu_toolbar")
    .Position = msoBarTop
    .Protection = msoBarNoCustomize
End With
Set lenh1 = Application.CommandBars("vidu_toolbar").Controls.Add(Type:=msoControlButton)
With lenh1
    .style = msoButtonIconAndCaption
    .FaceId = 293 
    .Caption = "   Xoá dòng"
    .OnAction = "sheet1.xoa"
End With
Hiện tượng xảy ra như sau: 2 máy cùng sử dụng VietKey (cài đặt từ cùng 1 bộ setup) nhưng "Xoá dòng" ở 2 máy hiển thị khác nhau.
Xin các bạn giải thích và cho cách khắc phục.
(Cho biết: UniVba("Xoá dòng")="Xoá dòng")

Bạn hãy vào Control Panel->Display->Appearance->Advanced chỉnh CAPTION thống nhất cả hai máy.
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,722
Được thích
53,639
Tôi thấy bạn Đào Việt Cường có làm 1 file về PicForm... trong file này nếu ta bấm vào dấu X thì 1 MsgBox tiếng Việt hiện ra...
Hình như là dùng các hàm Macro 4 thì phải
Tuy nhiên tôi xem hoài mà vẩn chưa am tường được điểm mấu chốt trong đó
Các bạn xem thử
Nếu có thể được nhờ bạn Đào Việt Cường hướng dẩn giúp 1 file ví dụ đơn giãn nhất về MsgBox tiếng Việt này
Cảm ơn!
 

File đính kèm

  • PicForm.rar
    676.6 KB · Đọc: 688

Đào Việt Cường

Cu Tí sành điệu
Thành viên danh dự
Tham gia ngày
11 Tháng sáu 2006
Bài viết
527
Được thích
758
Giới tính
Nam
Nghề nghiệp
Kiểm toán nhà nước
Dear ndu96081631,
-------------------
Sẽ là lạc đề nếu như thảo luận vấn đề anh nêu trong chủ đề này. Tuy nhiên xét thấy vấn đề cũng có liên quan một chút đến "Unicode tiếng Việt trong VBA" nên em trả lời luôn ở đây vậy:

Mấu chốt là ở đây ạ:

PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address <> "$G$1" Then Exit Sub
If ALERT(Evaluate(Application.Names("MsgExit").RefersToR1C1), 1) = False Then Exit Sub
txbPassword.Value = Null
ThisWorkbook.Close True
End Sub

Anh lưu ý ALERT là một hàm tự tạo trong Module1. Và đúng như theo dự đoán của anh, thủ tục có sử dụng lệnh ExecuteExcel4Macro để thi hành lệnh (hàm) macro4 có tên là "ALERT". Đây là hàm macro4 tương tự như hàm MsgBox trong VBA, khác là nó có hỗ trợ UNICODE. Tham số quan trọng của hàm này là sPrompt. Đây là chuỗi thông điệp UNICODE. Trong thủ tục sự kiện trên, tham số này được lấy từ name MsgExit (ấn Ctrl+F3 để xem name này).

Như vậy qua ví dụ minh họa này chúng ta cũng có thể biết thêm về cách thực thi một lệnh Macro4 thông qua VBA như thế nào, có phải không ạ!
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,722
Được thích
53,639
Dear ndu96081631,
-------------------
Sẽ là lạc đề nếu như thảo luận vấn đề anh nêu trong chủ đề này. Tuy nhiên xét thấy vấn đề cũng có liên quan một chút đến "Unicode tiếng Việt trong VBA" nên em trả lời luôn ở đây vậy:

Mấu chốt là ở đây ạ:

PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address <> "$G$1" Then Exit Sub
If ALERT(Evaluate(Application.Names("MsgExit").RefersToR1C1), 1) = False Then Exit Sub
txbPassword.Value = Null
ThisWorkbook.Close True
End Sub
Anh lưu ý ALERT là một hàm tự tạo trong Module1. Và đúng như theo dự đoán của anh, thủ tục có sử dụng lệnh ExecuteExcel4Macro để thi hành lệnh (hàm) macro4 có tên là "ALERT". Đây là hàm macro4 tương tự như hàm MsgBox trong VBA, khác là nó có hỗ trợ UNICODE. Tham số quan trọng của hàm này là sPrompt. Đây là chuỗi thông điệp UNICODE. Trong thủ tục sự kiện trên, tham số này được lấy từ name MsgExit (ấn Ctrl+F3 để xem name này).

Như vậy qua ví dụ minh họa này chúng ta cũng có thể biết thêm về cách thực thi một lệnh Macro4 thông qua VBA như thế nào, có phải không ạ!
Hơi bị cao siêu đây!
Hy vọng khi tôi bứt cở vài chục ngàn cọng tóc thì sẽ hiểu được vấn đề... +-+-+-+
Còn nữa: Có lẽ cũng hơi lạc đề khi đề cập vào topic này, nhưng hy vọng nhân tiện bạn giãi đáp luôn (hoặc chỉ tôi tài liệu có liên quan cũng được)
Đó là tôi thấy trong phần khai báo biến:
Cái dấu $ này mang ý nghĩa gì vậy?
Mong bạn giúp!
Chân thành cảm ơn!
 

hoangvuluan

Thành viên tích cực
Tham gia ngày
2 Tháng mười một 2008
Bài viết
983
Được thích
2,719
Nghề nghiệp
Chuyên viên Phòng Đào tạo ĐH
The codes for String characters range from 0–255. The first 128 characters (0–127) of the character set correspond to the letters and symbols on a standard U.S. keyboard. These first 128 characters are the same as those defined by the ASCII character set. The second 128 characters (128–255) represent special characters, such as letters in international alphabets, accents, currency symbols, and fractions. The type-declaration character for String is the dollar sign ($).
 

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,419
Được thích
9,837
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Unicode trong VBA giờ đây không còn là vấn đề gì to tát cả các bác ạ, có chăng là việc không gõ chuỗi Unicode trực tiếp trong VBE mà thôi, but chúng ta đã có worksheet, dùng nó để lưu chuỗi Unicode cơ mà!
Nếu các bác chịu đọc những cái em viết thì sẽ thấy Unicode hay những thứ được gọi là khó cũng bình thường thôi mà.
http://www.giaiphapexcel.com/forum/showthread.php?t=16802
From ThachNQ:
Thanks các bác
Thêm một kinh nghiệm về Uni
 
Chỉnh sửa lần cuối bởi điều hành viên:

hoangdanh282vn

Nguyễn Cảnh Hoàng Danh
Thành viên danh dự
Tham gia ngày
21 Tháng mười hai 2007
Bài viết
1,891
Được thích
5,231
Nghề nghiệp
Kinh doanh các mặt hàng văn phòng phẩm
Unicode trong VBA giờ đây không còn là vấn đề gì to tát cả các bác ạ, có chăng là việc không gõ chuỗi Unicode trực tiếp trong VBE mà thôi, but chúng ta đã có worksheet, dùng nó để lưu chuỗi Unicode cơ mà!
Nếu các bác chịu đọc những cái em viết thì sẽ thấy Unicode hay những thứ được gọi là khó cũng bình thường thôi mà.
http://www.giaiphapexcel.com/forum/showthread.php?t=16802

Với hàm UniVBA và UniVBAT thì việc gõ chuỗi trực tiếp trên VBA cũng không còn là vấn đề khó khăn nữa. Các bạn xem UniVBA và MsgUni tại đây :
http://www.giaiphapexcel.com/forum/showthread.php?t=17469
 

lmn15042002

Thành viên mới
Tham gia ngày
24 Tháng năm 2011
Bài viết
1
Được thích
0
Cần giúp đỡ chuyển đổi sang Unicode

Mình có 1 file .xla đã được ai đó viết sẵn. Hiện mình có nhu cầu chuyển sang Unicode nhưng đọc hết bài trên mà vẫn không làm được. Vì vậy mình xin đính kèm file lên mong được mọi người chuyển sang Unicode giúp. Chương trình này là chương trình đọc số. Ví dụ nhập công thức: =vnd(2011) thì sẽ đọc thành Hai ngàn không trăm mười một.

Cám ơn mọi người trước. Do đính kèm file .xla không được nên mình ZIP lại.
 

File đính kèm

  • DoiSousd.zip
    12.4 KB · Đọc: 105

triangles

Thành viên mới
Tham gia ngày
24 Tháng mười hai 2009
Bài viết
2
Được thích
1
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.

Cho mình hỏi, có cách nào đọc ngược lai không, xin giúp đỡ
VD: ngày tháng n" & ChrW(259) & "m ===> ngày tháng năm
 

langtu020690

Thành viên mới
Tham gia ngày
4 Tháng mười hai 2009
Bài viết
49
Được thích
8
Top Bottom