Vào VBA, bấm Ctrl + G mở cửa số Immediate, gõ vào dòng lệnh:tại em thấy chữ á với chữ Á có 2 mã chrw khác nhau ấy thầy. hay là có mã cho từng dấu vậy thầy.
?UCase("á") = "Á"
Nếu mình làm được cái vụ "thoải mái" này thì mình ngon lành "gần bằng" với Phạm Kim Long rồi đó hen!nếu người dùng nhập kiểu Telex: Chuyeenr max thì sao? Unikey cho phép gỏ tương đối thoải mái
khà khà, Thầy nghiên cứu xemVào VBA, bấm Ctrl + G mở cửa số Immediate, gõ vào dòng lệnh:
Enter phát, xem kết quả và tự rút ra kết luậnMã:?UCase("á") = "Á"
--------------------------------------------
Nếu mình làm được cái vụ "thoải mái" này thì mình ngon lành "gần bằng" với Phạm Kim Long rồi đó hen!
nhưng mã "á" = 7854 còn "Á" =7855 là sao thầy?. không khác nhau sao? vẫn chưa hiểu chỗ đó.Vào VBA, bấm Ctrl + G mở cửa số Immediate, gõ vào dòng lệnh:
Enter phát, xem kết quả và tự rút ra kết luậnMã:?UCase("á") = "Á"
--------------------------------------------
Nếu mình làm được cái vụ "thoải mái" này thì mình ngon lành "gần bằng" với Phạm Kim Long rồi đó hen!
bỏ bớt phần chữ in và thêm 1 dòng lệnh với Ucase xem saonhưng mã "á" = 7854 còn "Á" =7855 là sao thầy?. không khác nhau sao? vẫn chưa hiểu chỗ đó.
đúng là ucase sẽ bằng nhau nhưng sau khi chuyển lại chuyển luôn sang chữ thường hay chữ hoa hết sao thầy?
Function TU(ByVal mTex As String, Optional Bo As Byte = 1) As String
Dim Nguon As Variant, KetQua As Variant, a, b
Dim i As Long
Nguon = Split(sTelex, "-"): KetQua = Split(sChrW, "-")
For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
mTex = Replace(mTex, Nguon(i), ChrW$(KetQua(i)))
mTex = Replace(mTex, UCase(Nguon(i)), UCase(ChrW$(KetQua(i))))
Next i
TU = mTex
End Function
mãi mới thấy bác ghé thămbỏ bớt phần chữ in và thêm 1 dòng lệnh với Ucase xem saoMã:Function TU(ByVal mTex As String, Optional Bo As Byte = 1) As String Dim Nguon As Variant, KetQua As Variant, a, b Dim i As Long Nguon = Split(sTelex, "-"): KetQua = Split(sChrW, "-") For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo mTex = Replace(mTex, Nguon(i), ChrW$(KetQua(i))) mTex = Replace(mTex, UCase(Nguon(i)), UCase(ChrW$(KetQua(i)))) Next i TU = mTex End Function
Bài 24 chính là điều tôi muốn nóinhưng mã "á" = 7854 còn "Á" =7855 là sao thầy?. không khác nhau sao? vẫn chưa hiểu chỗ đó.
đúng là ucase sẽ bằng nhau nhưng sau khi chuyển lại thì nó chuyển thành chữ thường, chữ hoa, hay thành toàn bộ chữ thường, hay toàn bộ chữ hoa vậy thầy.
Hình như cái hàm UNItoVBA là của tôi thì phảibạn thông cảm, lấy code cũ hồi xưa viết chưa khai báo
bạn xem file đính kèm nhé
Cũng trong topic trên có bài sắp xếp lại chuỗi nhập cho đúng chuẩn Telex trước khi chuyển.nếu người dùng nhập kiểu Telex: Chuyeenr max thì sao? Unikey cho phép gỏ tương đối thoải mái
xin lỗi thầy nhé, e nhớ nhầm với hàm UniConvert của thầy ndu :vHình như cái hàm UNItoVBA là của tôi thì phải)
http://www.giaiphapexcel.com/diendan/threads/tập-hợp-hÀm-tỰ-tẠo-để-làm-thư-viện-hàm.50873/page-3#post-325712
Cũng trong topic trên có bài sắp xếp lại chuỗi nhập cho đúng chuẩn Telex trước khi chuyển.
chắc thế này được rồi thầy nhỉ, không biết có chạy nhanh hay không :VBài 24 chính là điều tôi muốn nói
Ngoài ra có 2 góp ý nhỏ:
- Với hằng số bạn nên viết hoa toàn bộ các ký tự nhé
- Với tên biến: Hoặc là tiếng Việt, hoặc là tiếng Anh toàn bộ. Đừng lộn xộn khi tiếng Việt lúc lại tiếng Anh, nhìn kỳ cục lắm!
Option Explicit
Const mUNICODE = "7845-7847-7849-7851-7853-7855-7857-7859-7861-7863-7871-7873-7875-7877-7879-7889-7891-7893-7895-7897-7899-7901-7903-7905-7907-7913-7915-7917-7919-7921-224-225-7843-227-7841-226-259-273-233-232-7867-7869-7865-234-237-236-7881-297-7883-243-242-7887-245-7885-244-417-250-249-7911-361-7909-432-253-7923-7927-7929-7925"
Const mTELEX = "aas-aaf-aar-aax-aaj-aws-awf-awr-awx-awj-ees-eef-eer-eex-eej-oos-oof-oor-oox-ooj-ows-owf-owr-owx-owj-uws-uwf-uwr-uwx-uwj-af-as-ar-ax-aj-aa-aw-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"
Const mVNI = "a61-a62-a63-a64-a65-a81-a82-a83-a84-a85-e61-e62-e63-e64-e65-o61-o62-o63-o64-o65-o71-o72-o73-o74-o75-u71-u72-u73-u74-u75-a2-a1-a3-a4-a5-a6-a8-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"
Const mXOADAU = "a-a-a-a-a-a-a-a-a-a-e-e-e-e-e-o-o-o-o-o-o-o-o-o-o-u-u-u-u-u-a-a-a-a-a-a-a-d-e-e-e-e-e-e-i-i-i-i-i-o-o-o-o-o-o-o-u-u-u-u-u-u-y-y-y-y-y"
Function ChuyenMaTiengViet(ByVal txt As String, ByVal MaNguon As String, Optional ByVal MaDich As String = "") As String
Dim Nguon As Variant, Dich As Variant, i As Byte
If InStr(UCase(MaNguon), "T") > 0 Then
Nguon = Split(mTELEX, "-")
ElseIf InStr(UCase(MaNguon), "U") > 0 Then
Nguon = Split(mUNICODE, "-")
ElseIf InStr(UCase(MaNguon), "V") > 0 Then
Nguon = Split(mVNI, "-")
End If
If InStr(UCase(MaDich), "T") > 0 Then
Dich = Split(mTELEX, "-")
ElseIf InStr(UCase(MaDich), "U") > 0 Then
Dich = Split(mUNICODE, "-")
ElseIf InStr(UCase(MaDich), "V") > 0 Then
Dich = Split(mVNI, "-")
Else
Dich = Split(mXOADAU, "-")
End If
If InStr(UCase(MaNguon), "U") > 0 Then
For i = 0 To UBound(Nguon)
txt = Replace(txt, ChrW(Nguon(i)), Dich(i))
txt = Replace(txt, UCase(ChrW(Nguon(i))), UCase(Dich(i)))
Next i
ElseIf InStr(UCase(MaDich), "U") > 0 Then
For i = 0 To UBound(Nguon)
txt = Replace(txt, Nguon(i), ChrW$(Dich(i)))
txt = Replace(txt, UCase(Nguon(i)), UCase(ChrW$(Dich(i))))
Next i
Else
For i = 0 To UBound(Nguon)
txt = Replace(txt, Nguon(i), Dich(i))
txt = Replace(txt, UCase(Nguon(i)), UCase(Dich(i)))
Next i
End If
ChuyenMaTiengViet = txt
End Function
Nhanh chậm chưa bàn đến. Vấn đề là tôi thấy bạn thường viết các tools để phục vụ cho công việc nào đó. Đã là tools thì sẽ có nhiều người dùng đến nên ngoài việc trau chuốt thuật toán thì bạn cũng nên hướng đến sự chuyên nghiệp trong cách trình bày!chắc thế này được rồi thầy nhỉ, không biết có chạy nhanh hay không :V
Mã:Option Explicit Const mUNICODE = "7845-7847-7849-7851-7853-7855-7857-7859-7861-7863-7871-7873-7875-7877-7879-7889-7891-7893-7895-7897-7899-7901-7903-7905-7907-7913-7915-7917-7919-7921-224-225-7843-227-7841-226-259-273-233-232-7867-7869-7865-234-237-236-7881-297-7883-243-242-7887-245-7885-244-417-250-249-7911-361-7909-432-253-7923-7927-7929-7925" Const mTELEX = "aas-aaf-aar-aax-aaj-aws-awf-awr-awx-awj-ees-eef-eer-eex-eej-oos-oof-oor-oox-ooj-ows-owf-owr-owx-owj-uws-uwf-uwr-uwx-uwj-af-as-ar-ax-aj-aa-aw-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" Const mVNI = "a61-a62-a63-a64-a65-a81-a82-a83-a84-a85-e61-e62-e63-e64-e65-o61-o62-o63-o64-o65-o71-o72-o73-o74-o75-u71-u72-u73-u74-u75-a2-a1-a3-a4-a5-a6-a8-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" Const mXOADAU = "a-a-a-a-a-a-a-a-a-a-e-e-e-e-e-o-o-o-o-o-o-o-o-o-o-u-u-u-u-u-a-a-a-a-a-a-a-d-e-e-e-e-e-e-i-i-i-i-i-o-o-o-o-o-o-o-u-u-u-u-u-u-y-y-y-y-y" Function ChuyenMaTiengViet(ByVal txt As String, ByVal MaNguon As String, Optional ByVal MaDich As String = "") As String Dim Nguon As Variant, Dich As Variant, i As Byte If InStr(UCase(MaNguon), "T") > 0 Then Nguon = Split(mTELEX, "-") ElseIf InStr(UCase(MaNguon), "U") > 0 Then Nguon = Split(mUNICODE, "-") ElseIf InStr(UCase(MaNguon), "V") > 0 Then Nguon = Split(mVNI, "-") End If If InStr(UCase(MaDich), "T") > 0 Then Dich = Split(mTELEX, "-") ElseIf InStr(UCase(MaDich), "U") > 0 Then Dich = Split(mUNICODE, "-") ElseIf InStr(UCase(MaDich), "V") > 0 Then Dich = Split(mVNI, "-") Else Dich = Split(mXOADAU, "-") End If If InStr(UCase(MaNguon), "U") > 0 Then For i = 0 To UBound(Nguon) txt = Replace(txt, ChrW(Nguon(i)), Dich(i)) txt = Replace(txt, UCase(ChrW(Nguon(i))), UCase(Dich(i))) Next i ElseIf InStr(UCase(MaDich), "U") > 0 Then For i = 0 To UBound(Nguon) txt = Replace(txt, Nguon(i), ChrW$(Dich(i))) txt = Replace(txt, UCase(Nguon(i)), UCase(ChrW$(Dich(i)))) Next i Else For i = 0 To UBound(Nguon) txt = Replace(txt, Nguon(i), Dich(i)) txt = Replace(txt, UCase(Nguon(i)), UCase(Dich(i))) Next i End If ChuyenMaTiengViet = txt End Function
đọc bài của bác làm em nghĩ đến cái phát hiện ngôn ngữ của google, vậy mình tạo hàm phát kiểu kiểu gõ rồi tự in raNhanh chậm chưa bàn đến. Vấn đề là tôi thấy bạn thường viết các tools để phục vụ cho công việc nào đó. Đã là tools thì sẽ có nhiều người dùng đến nên ngoài việc trau chuốt thuật toán thì bạn cũng nên hướng đến sự chuyên nghiệp trong cách trình bày!
Cũng không dễ ăn vậy đâu! Nếu mình làm được, chắc google nó "hốt" rồiđọc bài của bác làm em nghĩ đến cái phát hiện ngôn ngữ của google, vậy mình tạo hàm phát kiểu kiểu gõ rồi tự in ra![]()
Giờ ngồi trên cầu gió mát quá thông não thầy ạ. Nhìn kỹ lại. Có 1 hàm thì mắc gì khai báo biến const bên ngoài cho nó chiếm bộ nhớ. "Lôi cổ" nó vào trong hàm luôn cho gọn hơn thầy nhỉ.Nhanh chậm chưa bàn đến. Vấn đề là tôi thấy bạn thường viết các tools để phục vụ cho công việc nào đó. Đã là tools thì sẽ có nhiều người dùng đến nên ngoài việc trau chuốt thuật toán thì bạn cũng nên hướng đến sự chuyên nghiệp trong cách trình bày!
Nói thật có đôi lúc tôi nghĩ ra thuật toán chỉ trong vài phút nhưng cứ ngồi sửa đi sửa lại hàng chục lần về cách trình bày, đặt tên biến mà vẫn cảm thấy chưa vừa ý. Hiện tại lúc rảnh rỗi, tôi lục lại những code viết hàng chục năm trước ra xem rồi chỉnh sửa lại (chủ yếu về cách trình bày)
Luôn luôn cảm thấy không hài lòng với những gì mình làm được là điều giúp ta phát triển bản thân
Dùng hàm tự tạo trong bảng tính Excel, khi thao tác trên bảng tính thì code chạy lại và vẫn phải sử dụng bộ nhớ, nếu đưa vào Function sẽ tạo vùng nhớ cho các biến rất nhiều lần, không hiểu máy tính xử lý ra sao, có lần mình bị thiếu bộ nhớ và chạy rất chậm, đưa ra ngoài thì chạy rất nhẹGiờ ngồi trên cầu gió mát quá thông não thầy ạ. Nhìn kỹ lại. Có 1 hàm thì mắc gì khai báo biến const bên ngoài cho nó chiếm bộ nhớ. "Lôi cổ" nó vào trong hàm luôn cho gọn hơn thầy nhỉ.
Dùng hàm tự tạo trong bảng tính Excel, khi thao tác trên bảng tính thì code chạy lại và vẫn phải sử dụng bộ nhớ, nếu đưa vào Function sẽ tạo vùng nhớ cho các biến rất nhiều lần, không hiểu máy tính xử lý ra sao, có lần mình bị thiếu bộ nhớ và chạy rất chậm, đưa ra ngoài thì chạy rất nhẹ
Tại bạn ôm đồm nhiều thứ trong hàm nên "cảm thấy" vậy! Nếu là tôi thì:Giờ ngồi trên cầu gió mát quá thông não thầy ạ. Nhìn kỹ lại. Có 1 hàm thì mắc gì khai báo biến const bên ngoài cho nó chiếm bộ nhớ. "Lôi cổ" nó vào trong hàm luôn cho gọn hơn thầy nhỉ.
.
Anh ơi em muốn từ:chắc thế này được rồi thầy nhỉ, không biết có chạy nhanh hay không :V
Mã:Option Explicit Const mUNICODE = "7845-7847-7849-7851-7853-7855-7857-7859-7861-7863-7871-7873-7875-7877-7879-7889-7891-7893-7895-7897-7899-7901-7903-7905-7907-7913-7915-7917-7919-7921-224-225-7843-227-7841-226-259-273-233-232-7867-7869-7865-234-237-236-7881-297-7883-243-242-7887-245-7885-244-417-250-249-7911-361-7909-432-253-7923-7927-7929-7925" Const mTELEX = "aas-aaf-aar-aax-aaj-aws-awf-awr-awx-awj-ees-eef-eer-eex-eej-oos-oof-oor-oox-ooj-ows-owf-owr-owx-owj-uws-uwf-uwr-uwx-uwj-af-as-ar-ax-aj-aa-aw-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" Const mVNI = "a61-a62-a63-a64-a65-a81-a82-a83-a84-a85-e61-e62-e63-e64-e65-o61-o62-o63-o64-o65-o71-o72-o73-o74-o75-u71-u72-u73-u74-u75-a2-a1-a3-a4-a5-a6-a8-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" Const mXOADAU = "a-a-a-a-a-a-a-a-a-a-e-e-e-e-e-o-o-o-o-o-o-o-o-o-o-u-u-u-u-u-a-a-a-a-a-a-a-d-e-e-e-e-e-e-i-i-i-i-i-o-o-o-o-o-o-o-u-u-u-u-u-u-y-y-y-y-y" Function ChuyenMaTiengViet(ByVal txt As String, ByVal MaNguon As String, Optional ByVal MaDich As String = "") As String Dim Nguon As Variant, Dich As Variant, i As Byte If InStr(UCase(MaNguon), "T") > 0 Then Nguon = Split(mTELEX, "-") ElseIf InStr(UCase(MaNguon), "U") > 0 Then Nguon = Split(mUNICODE, "-") ElseIf InStr(UCase(MaNguon), "V") > 0 Then Nguon = Split(mVNI, "-") End If If InStr(UCase(MaDich), "T") > 0 Then Dich = Split(mTELEX, "-") ElseIf InStr(UCase(MaDich), "U") > 0 Then Dich = Split(mUNICODE, "-") ElseIf InStr(UCase(MaDich), "V") > 0 Then Dich = Split(mVNI, "-") Else Dich = Split(mXOADAU, "-") End If If InStr(UCase(MaNguon), "U") > 0 Then For i = 0 To UBound(Nguon) txt = Replace(txt, ChrW(Nguon(i)), Dich(i)) txt = Replace(txt, UCase(ChrW(Nguon(i))), UCase(Dich(i))) Next i ElseIf InStr(UCase(MaDich), "U") > 0 Then For i = 0 To UBound(Nguon) txt = Replace(txt, Nguon(i), ChrW$(Dich(i))) txt = Replace(txt, UCase(Nguon(i)), UCase(ChrW$(Dich(i)))) Next i Else For i = 0 To UBound(Nguon) txt = Replace(txt, Nguon(i), Dich(i)) txt = Replace(txt, UCase(Nguon(i)), UCase(Dich(i))) Next i End If ChuyenMaTiengViet = txt End Function