Link download dự án: 
	
_____________________________
Đã từ lâu, chúng ta muốn hiện cảnh báo tiếng Việt trong VBA, nhưng thật tiếc là VBA không hỗ trợ điều này.
Sau khi tra cứu internet, thì mình nhận thấy, cách xây dựng hàm riêng để hiển thị tiếng Việt là tối ưu nhất.
Để không dài dòng, mình sẽ đi thẳng vào vấn đề code.
Có hai kiểu gõ thông dụng đó là VNI và Telex, trong đó kiểu gõ Telex là thông dụng hơn cả.
Nguồn:
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Cụ thể code như sau:
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Do có hai cách gõ và người dùng có nhiều khả năng sử dụng cả chữ hoa và chữ thường vì vậy hàm trên đáp ứng được yêu cầu cơ bản.
Để sử dụng tiếng việt chúng ta không dùng hàm msgbox thông thường mà dùng hàm DoAlert như sau:
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Kết quả là chúng ta được:
	
Trước hết về các thông số option ở phía sau gồm 5 số:
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
thì các bạn có thể tự kiểm nghiệm bằng cách tự thay các giá trị khác nhau (khi gõ code sẽ xuất hiện gợi ý), nếu đổi thành
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
thì cảnh báo sẽ ra hai nút OK và CANCEL.
Nếu thay bằng
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
ta có được biểu tượng giống với msgbox thông thường.
	
Tuy nhiên, với code trên ta phải bỏ dấu ngay sau nguyên âm, nếu chúng ta bỏ dấu như sau:
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
ta thu được kết quả không như mong muốn:
	
Vì vậy cần phải xây dựng một hàm riêng để xử lý việc bỏ dấu như cách gõ thông thường, đó là:
Chúng ta thường bỏ dấu trước khi gõ dấu cách để sang một từ khác.
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Và bây giờ ta có được kết quả rất tốt như sau:
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Kết quả là:
	
Video giới thiệu:
	
								
	Bạn cần đăng nhập để thấy link
_____________________________
Đã từ lâu, chúng ta muốn hiện cảnh báo tiếng Việt trong VBA, nhưng thật tiếc là VBA không hỗ trợ điều này.
Sau khi tra cứu internet, thì mình nhận thấy, cách xây dựng hàm riêng để hiển thị tiếng Việt là tối ưu nhất.
Để không dài dòng, mình sẽ đi thẳng vào vấn đề code.
Có hai kiểu gõ thông dụng đó là VNI và Telex, trong đó kiểu gõ Telex là thông dụng hơn cả.
Nguồn:
			
				Mã:
			
		
		
		https://blog.hocexcel.online/go-tieng-viet-trong-vba-su-dung-msgbox-co-ho-tro-unicode-trong-vba.html
			
				Mã:
			
		
		
		Function UniConvert(text As String, InputMethod As String) As String
Dim VNI_Type, Telex_Type, CharCode, temp, i As Long
UniConvert = text
VNI_Type = Array("a81", "a82", "a83", "a84", "a85", "a61", "a62", "a63", "a64", "a65", "e61", _
"e62", "e63", "e64", "e65", "o61", "o62", "o63", "o64", "o65", "o71", "o72", "o73", "o74", _
"o75", "u71", "u72", "u73", "u74", "u75", "a1", "a2", "a3", "a4", "a5", "a8", "a6", "d9", _
"e1", "e2", "e3", "e4", "e5", "e6", "i1", "i2", "i3", "i4", "i5", "o1", "o2", "o3", "o4", _
"o5", "o6", "o7", "u1", "u2", "u3", "u4", "u5", "u7", "y1", "y2", "y3", "y4", "y5")
Telex_Type = Array("aws", "awf", "awr", "awx", "awj", "aas", "aaf", "aar", "aax", "aaj", "ees", _
"eef", "eer", "eex", "eej", "oos", "oof", "oor", "oox", "ooj", "ows", "owf", "owr", "owx", _
"owj", "uws", "uwf", "uwr", "uwx", "uwj", "as", "af", "ar", "ax", "aj", "aw", "aa", "dd", _
"es", "ef", "er", "ex", "ej", "ee", "is", "if", "ir", "ix", "ij", "os", "of", "or", "ox", _
"oj", "oo", "ow", "us", "uf", "ur", "ux", "uj", "uw", "ys", "yf", "yr", "yx", "yj")
CharCode = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), _
ChrW(7849), ChrW(7851), ChrW(7853), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _
ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), ChrW(7899), ChrW(7901), ChrW(7903), _
ChrW(7905), ChrW(7907), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), ChrW(7921), ChrW(225), _
ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), ChrW(259), ChrW(226), ChrW(273), ChrW(233), ChrW(232), _
ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(237), ChrW(236), ChrW(7881), ChrW(297), ChrW(7883), _
ChrW(243), ChrW(242), ChrW(7887), ChrW(245), ChrW(7885), ChrW(244), ChrW(417), ChrW(250), ChrW(249), _
ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), ChrW(253), ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925))
Select Case InputMethod
    Case Is = "VNI": temp = VNI_Type
    Case Is = "Telex": temp = Telex_Type
End Select
For i = 0 To UBound(CharCode)
UniConvert = Replace(UniConvert, temp(i), CharCode(i))
UniConvert = Replace(UniConvert, UCase(temp(i)), UCase(CharCode(i)))
Next i
End FunctionĐể sử dụng tiếng việt chúng ta không dùng hàm msgbox thông thường mà dùng hàm DoAlert như sau:
			
				Mã:
			
		
		
		Sub test()
    Application.Assistant.DoAlert "Thong bao", UniConvert("Chuyeejn chawrng cos gif", "Telex"), 0, 4, 0, 0, 0
End sub
	Bạn cần đăng nhập để thấy hình ảnh
Trước hết về các thông số option ở phía sau gồm 5 số:
			
				Mã:
			
		
		
		0,4,0,0,0
			
				Mã:
			
		
		
		1,4,0,0,0Nếu thay bằng
			
				Mã:
			
		
		
		 0,0,0,0,0
	Bạn cần đăng nhập để thấy hình ảnh
Tuy nhiên, với code trên ta phải bỏ dấu ngay sau nguyên âm, nếu chúng ta bỏ dấu như sau:
			
				Mã:
			
		
		
		 chuyeenj daays thif ai chawngr bieets
	Bạn cần đăng nhập để thấy hình ảnh
Vì vậy cần phải xây dựng một hàm riêng để xử lý việc bỏ dấu như cách gõ thông thường, đó là:
Chúng ta thường bỏ dấu trước khi gõ dấu cách để sang một từ khác.
			
				Mã:
			
		
		
		Function sapxepdautruocnguyenam(ByVal text As String) As String
's f r x j
'Nguyen am: a e o u i y
    Dim temp    As String
    Dim i       As Integer
    Dim j       As Integer
  
    Dim c       As String
    Dim c2      As String
    Dim out     As String
  
    Dim d1      As String
    Dim d2      As String
    Dim dau     As String
    Dim cuoi    As String
  
  
  
    Const na    As String = "aeouiywAEOUIYW" 'Nguyen am
    Const da   As String = "sfrjxSFRJX"  'Dau
  
    temp = text & " "
    out = ""
    For i = 1 To Len(temp) - 1 Step 1
        c = Mid(temp, i, 1)
        out = out & c
        c2 = Mid(temp, i + 1, 1)
        If InStr(1, na, c) > 0 And InStr(1, na, c2) = 0 Then 'Phat hien nguyen am va dang sau la phu am
            'Tim dau
            For j = i + 1 To Len(temp) - 1
                d1 = Mid(temp, j, 1)
                d2 = Mid(temp, j + 1, 1)
                If d1 = " " Then Exit For
                If InStr(1, da, d1) > 0 And d2 = " " Then
                    out = out & d1
                    dau = Mid(temp, 1, j - 1)
                    cuoi = Mid(temp, j + 1, Len(temp) - j)
                    temp = dau & cuoi
                    Exit For
                End If
            Next j
          
        End If
    Next i
    sapxepdautruocnguyenam = out
End Function
			
				Mã:
			
		
		
		Sub tuhocvba_net()
    Dim l   As String
    l = sapxepdautruocnguyenam("chuyeenj daays thif ai chawngr bieets")
    Application.Assistant.DoAlert "Thong bao", UniConvert(l, "Telex"), 0, 0, 0, 0, 0
End Sub
	Bạn cần đăng nhập để thấy hình ảnh
Video giới thiệu:
	Bạn cần đăng nhập để thấy đa phương tiện
 
				 
 
		