Xin code chuyển mã kiểu gõ telex! (1 người xem)

Liên hệ QC

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

dazkangel

<New Horizons>
Tham gia
28/2/17
Bài viết
2,882
Được thích
4,048
Giới tính
Nam
Chào các bác, em muốn đổi các chữ kiểu telex giống như sau: "DDaf Nawxng" thành "Đà Nẵng"
Các bác giải giúp em ạ, xin cảm ơn mọi người.
 

File đính kèm

Chào các bác, em muốn đổi các chữ kiểu telex giống như sau: "DDaf Nawxng" thành "Đà Nẵng"
Các bác giải giúp em ạ, xin cảm ơn mọi người.
Để gõ được chữ "Đ" theo kiểu Telex có những cách sau:
Dd
DD
D {một nguyên âm bất kỳ} d


Với chữ "à" gõ theo kiểu Telex có những cách sau:
af
a {một hoặc nhiều hơn một hoặc toàn bộ các ký tự (srxjz)} f

 
Upvote 0
Để gõ được chữ "Đ" theo kiểu Telex có những cách sau:
Dd
DD
D {một nguyên âm bất kỳ} d


Với chữ "à" gõ theo kiểu Telex có những cách sau:
af
a {một hoặc nhiều hơn một hoặc toàn bộ các ký tự (srxjz)} f
Bác có cách nào không ạ, xài code thôi chứ không mong hàm gì cả :D
 
Upvote 0
Để gõ được chữ "Đ" theo kiểu Telex có những cách sau:
Dd
DD
D {một nguyên âm bất kỳ} d


Với chữ "à" gõ theo kiểu Telex có những cách sau:
af
a {một hoặc nhiều hơn một hoặc toàn bộ các ký tự (srxjz)} f
Cái thứ 2 chắc khó ăn thôi chơi kiểu 1 được rồi :P
 
Upvote 0
Chào các bác, em muốn đổi các chữ kiểu telex giống như sau: "DDaf Nawxng" thành "Đà Nẵng"
Các bác giải giúp em ạ, xin cảm ơn mọi người.
Như kiểu gõ này:
Mã:
Buwowsc towsi ddefo ngang bosng xees taf
còn ráng chuyển đổi được, chứ còn kiểu này:
Mã:
Buowstowsiddefongangbosngxeestaf
Dính 1 chùm vậy thì.. thua
 
Upvote 0
Như kiểu gõ này:
Mã:
Buwowsc towsi ddefo ngang bosng xees taf
còn ráng chuyển đổi được, chứ còn kiểu này:
Mã:
Buowstowsiddefongangbosngxeestaf
Dính 1 chùm vậy thì.. thua
cảm ơn bác quan tâm ạ, cái dính trùm thì chịu ạ, khó quá thì mình tìm giải pháp đơn giản hơn ^^
 
Upvote 0
Chào các bác, em muốn đổi các chữ kiểu telex giống như sau: "DDaf Nawxng" thành "Đà Nẵng"
Các bác giải giúp em ạ, xin cảm ơn mọi người.
nếu bạn muốn dùng theo cách gõ của "ANH" ndu nói thì tham khảo cái này (theo mong ước của ẢNH- được trẻ hóa) :v
Mã:
Option Explicit
Const sChrW = "7855-7857-7859-7861-7863-7845-7847-7849-7851-7853-7871-7873-7875-7877-7879-7889-7891-7893-7895-7897-7899-7901-7903-7905-7907-7913-7915-7917-7919-7921-7854-7856-7858-7860-7862-7844-7846-7848-7850-7852-7870-7872-7874-7876-7878-7888-7890-7892-7894-7896-7898-7900-7902-7904-7906-7912-7914-7916-7918-7920-225-224-7843-227-7841-259-226-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-193-192-7842-195-7840-258-194-272-201-200-7866-7868-7864-202-205-204-7880-296-7882-211-210-7886-213-7884-212-416-218-217-7910-360-7908-431-221-7922-7926-7928-7924-10"
Const sTelex = "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-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-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- vbE "
Const sVni = "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-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-A1-A2-A3-A4-A5-A7-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- vbE "
Const sXoaDau = "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-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-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 UT(ByVal mTex As String, Optional Bo As Byte = 1) As String 'chuyen kieu go unicode thanh kieu go telex
Dim i As Long
    Nguon = Split(sChrW, "-"):  KetQua = Split(sTelex, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, ChrW$(Nguon(i)), KetQua(i))
    Next i
    UT = mTex
End Function
Function TU(ByVal mTex As String, Optional Bo As Byte = 1) As String'chuyen kieu go telex thanh unicode
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)))
    Next i
    TU = mTex
End Function
Function UV(ByVal mTex As String, Optional Bo As Byte = 1) As String'chuyen kieu go unicode thanh kieu go vni
Dim i As Long
    Nguon = Split(sChrW, "-"):  KetQua = Split(sVni, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, ChrW$(Nguon(i)), KetQua(i))
    Next i
    UV = mTex
End Function
Function VU(ByVal mTex As String, Optional Bo As Byte = 1) As String'chuyen kieu go vni thanh unicode
Dim i As Long
    Nguon = Split(sVni, "-"):   KetQua = Split(sChrW, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, Nguon(i), ChrW$(KetQua(i)))
    Next i
    VU = mTex
End Function
Function mTV(ByVal mTex As String, Optional Bo As Byte = 1) As String'xoa dau tieng viet
Dim i As Long
    Nguon = Split(sChrW, "-"):  KetQua = Split(sXoaDau, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, ChrW$(Nguon(i)), KetQua(i))
    Next i
    mTV = mTex
End Function
=UT("Thí nghiệm") => This nghieejm
=TU("This nghieejm") => Thí nghiệm
=UV("Thí nghiệm") => Thi1 nghie65m
=VU("Thi1 nghie65m") => Thí nghiệm
=mTV("Thí nghiệm") => Thi nghiem
code không áp dụng cho tiếng anh nha bạn. This thì nó sẽ thành Thí chứ không thông minh đến nỗi nhận biết nó là tiếng anh mà giữ lại nguyên mẫu đâu, khuyến khích chuyển thành kiểu VNI thì hay hơn
 
Lần chỉnh sửa cuối:
Upvote 0
nếu bạn muốn dùng theo cách gõ của "ANH" ndu nói thì tham khảo cái này (theo mong ước của ẢNH- được trẻ hóa) :v
Mã:
Option Explicit
Const sChrW = "7855-7857-7859-7861-7863-7845-7847-7849-7851-7853-7871-7873-7875-7877-7879-7889-7891-7893-7895-7897-7899-7901-7903-7905-7907-7913-7915-7917-7919-7921-7854-7856-7858-7860-7862-7844-7846-7848-7850-7852-7870-7872-7874-7876-7878-7888-7890-7892-7894-7896-7898-7900-7902-7904-7906-7912-7914-7916-7918-7920-225-224-7843-227-7841-259-226-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-193-192-7842-195-7840-258-194-272-201-200-7866-7868-7864-202-205-204-7880-296-7882-211-210-7886-213-7884-212-416-218-217-7910-360-7908-431-221-7922-7926-7928-7924-10"
Const sTelex = "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-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-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- vbE "
Const sVni = "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-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-A1-A2-A3-A4-A5-A7-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- vbE "
Const sXoaDau = "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-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-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 UT(ByVal mTex As String, Optional Bo As Byte = 1) As String 'chuyen kieu go unicode thanh kieu go telex
Dim i As Long
    Nguon = Split(sChrW, "-"):  KetQua = Split(sTelex, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, ChrW$(Nguon(i)), KetQua(i))
    Next i
    UT = mTex
End Function
Function TU(ByVal mTex As String, Optional Bo As Byte = 1) As String'chuyen kieu go telex thanh unicode
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)))
    Next i
    TU = mTex
End Function
Function UV(ByVal mTex As String, Optional Bo As Byte = 1) As String'chuyen kieu go unicode thanh kieu go vni
Dim i As Long
    Nguon = Split(sChrW, "-"):  KetQua = Split(sVni, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, ChrW$(Nguon(i)), KetQua(i))
    Next i
    UV = mTex
End Function
Function VU(ByVal mTex As String, Optional Bo As Byte = 1) As String'chuyen kieu go vni thanh unicode
Dim i As Long
    Nguon = Split(sVni, "-"):   KetQua = Split(sChrW, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, Nguon(i), ChrW$(KetQua(i)))
    Next i
    VU = mTex
End Function
Function mTV(ByVal mTex As String, Optional Bo As Byte = 1) As String'xoa dau tieng viet
Dim i As Long
    Nguon = Split(sChrW, "-"):  KetQua = Split(sXoaDau, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, ChrW$(Nguon(i)), KetQua(i))
    Next i
    mTV = mTex
End Function
=UT("Thí nghiệm") => This nghieejm
=TU("This nghieejm") => Thí nghiệm
=UV("Thí nghiệm") => Thi1 nghie65m
=VU("Thi1 nghie65m") => Thí nghiệm
=mTV("Thí nghiệm") => Thi nghiem
code không áp dụng cho tiếng anh nha bạn. This thì nó sẽ thành Thí chứ không thông minh đến nỗi nhận biết nó là tiếng anh mà giữ lại nguyên mẫu đâu, khuyến khích chuyển thành kiểu VNI thì hay hơn
dạ cảm ơn bác nhiều lắm ạ !
 
Upvote 0
nếu bạn muốn dùng theo cách gõ của "ANH" ndu nói thì tham khảo cái này (theo mong ước của ẢNH- được trẻ hóa) :v
Mã:
Option Explicit
Const sChrW = "7855-7857-7859-7861-7863-7845-7847-7849-7851-7853-7871-7873-7875-7877-7879-7889-7891-7893-7895-7897-7899-7901-7903-7905-7907-7913-7915-7917-7919-7921-7854-7856-7858-7860-7862-7844-7846-7848-7850-7852-7870-7872-7874-7876-7878-7888-7890-7892-7894-7896-7898-7900-7902-7904-7906-7912-7914-7916-7918-7920-225-224-7843-227-7841-259-226-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-193-192-7842-195-7840-258-194-272-201-200-7866-7868-7864-202-205-204-7880-296-7882-211-210-7886-213-7884-212-416-218-217-7910-360-7908-431-221-7922-7926-7928-7924-10"
Const sTelex = "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-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-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- vbE "
Const sVni = "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-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-A1-A2-A3-A4-A5-A7-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- vbE "
Const sXoaDau = "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-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-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 UT(ByVal mTex As String, Optional Bo As Byte = 1) As String 'chuyen kieu go unicode thanh kieu go telex
Dim i As Long
    Nguon = Split(sChrW, "-"):  KetQua = Split(sTelex, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, ChrW$(Nguon(i)), KetQua(i))
    Next i
    UT = mTex
End Function
Function TU(ByVal mTex As String, Optional Bo As Byte = 1) As String'chuyen kieu go telex thanh unicode
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)))
    Next i
    TU = mTex
End Function
Function UV(ByVal mTex As String, Optional Bo As Byte = 1) As String'chuyen kieu go unicode thanh kieu go vni
Dim i As Long
    Nguon = Split(sChrW, "-"):  KetQua = Split(sVni, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, ChrW$(Nguon(i)), KetQua(i))
    Next i
    UV = mTex
End Function
Function VU(ByVal mTex As String, Optional Bo As Byte = 1) As String'chuyen kieu go vni thanh unicode
Dim i As Long
    Nguon = Split(sVni, "-"):   KetQua = Split(sChrW, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, Nguon(i), ChrW$(KetQua(i)))
    Next i
    VU = mTex
End Function
Function mTV(ByVal mTex As String, Optional Bo As Byte = 1) As String'xoa dau tieng viet
Dim i As Long
    Nguon = Split(sChrW, "-"):  KetQua = Split(sXoaDau, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, ChrW$(Nguon(i)), KetQua(i))
    Next i
    mTV = mTex
End Function
=UT("Thí nghiệm") => This nghieejm
=TU("This nghieejm") => Thí nghiệm
=UV("Thí nghiệm") => Thi1 nghie65m
=VU("Thi1 nghie65m") => Thí nghiệm
=mTV("Thí nghiệm") => Thi nghiem
code không áp dụng cho tiếng anh nha bạn. This thì nó sẽ thành Thí chứ không thông minh đến nỗi nhận biết nó là tiếng anh mà giữ lại nguyên mẫu đâu, khuyến khích chuyển thành kiểu VNI thì hay hơn
Em không rành về VBA lắm, em thử trong file nó báo lỗi không chạy được anh à.
Anh thử trong file gửi em xem được không.
 
Upvote 0
Để làm bài này, bạn cần phân tích ra nhiều công việc.

Công việc thứ nhất là viết một hàm đọc từ. Hàm này phải đọc được thế nào là 1 từ. Regex có thể làm chuyện này dễ dàng.

Công việc thứ hai là nhận định từ có phải là telex. Ví dụ loo, đổi sang tiếng Việt là lô; nhưng làm sao bạn biết được nó khong phải là tiếng Anh, vì từ này tiếng anh có nghĩa là cái toa lét.

Ví dụ bạn chấp nhận rằng "đổi nhầm ráng chịu" thì ta có thể bắt đầu công việc thứ ba:
Tiếng Việt có luật đặc biệt rằng một từ không bao giờ có 2 nguyên âm giống nhau (trừ trường hợp oo ở trên)
Như vậy việc đầu tiên của bạn là duyệt từng ký tự của từ, hễ có 2 a thì nó là â, 2 e thì là ê, 2 o thì là ô, nhưng có 3 a thì lại coi đó là tiếng Anh. Nếu gặp xoong thì ráng chịu. Bạn phải tự đặt luật rằng xoong, xonog thì đổi thành xông và xooong thì đổi thành xoong.
Kế đó là xét các ký tự nằm không đúng chỗ.; tiếng Việt có một số phụ âm bắt buộc phải ở đầu từ.
1. d phải ở đầu từ, nếu nó nằm ở vị trí khác thì chỉ có thể dùng để biến cái d ở đầu từ.
2. s cũng phải ở đầu từ, nếu nó nằm ở vị tri khác thì nó là dấu sắc.
3. ...

Ở công việc thứ ba này, bạn phải lập ra một bảng quy luật đầy đủ rồi từ đó mới có thể dùng bảng quy luật để lập giải thuật và viết code
 
Upvote 0
Để làm bài này, bạn cần phân tích ra nhiều công việc.

Công việc thứ nhất là viết một hàm đọc từ. Hàm này phải đọc được thế nào là 1 từ. Regex có thể làm chuyện này dễ dàng.

Công việc thứ hai là nhận định từ có phải là telex. Ví dụ loo, đổi sang tiếng Việt là lô; nhưng làm sao bạn biết được nó khong phải là tiếng Anh, vì từ này tiếng anh có nghĩa là cái toa lét.

Ví dụ bạn chấp nhận rằng "đổi nhầm ráng chịu" thì ta có thể bắt đầu công việc thứ ba:
Tiếng Việt có luật đặc biệt rằng một từ không bao giờ có 2 nguyên âm giống nhau (trừ trường hợp oo ở trên)
Như vậy việc đầu tiên của bạn là duyệt từng ký tự của từ, hễ có 2 a thì nó là â, 2 e thì là ê, 2 o thì là ô, nhưng có 3 a thì lại coi đó là tiếng Anh. Nếu gặp xoong thì ráng chịu. Bạn phải tự đặt luật rằng xoong, xonog thì đổi thành xông và xooong thì đổi thành xoong.
Kế đó là xét các ký tự nằm không đúng chỗ.; tiếng Việt có một số phụ âm bắt buộc phải ở đầu từ.
1. d phải ở đầu từ, nếu nó nằm ở vị trí khác thì chỉ có thể dùng để biến cái d ở đầu từ.
2. s cũng phải ở đầu từ, nếu nó nằm ở vị tri khác thì nó là dấu sắc.
3. ...

Ở công việc thứ ba này, bạn phải lập ra một bảng quy luật đầy đủ rồi từ đó mới có thể dùng bảng quy luật để lập giải thuật và viết code
dạ cố định kiểu anh ơi, ví dụ : buowsc là mũ ơ trước rồi mới đến dấu sắc
 
Upvote 0

File đính kèm

Upvote 0
nếu bạn muốn dùng theo cách gõ của "ANH" ndu nói thì tham khảo cái này (theo mong ước của ẢNH- được trẻ hóa) :v
Mã:
Option Explicit
Const sChrW = "7855-7857-7859-7861-7863-7845-7847-7849-7851-7853-7871-7873-7875-7877-7879-7889-7891-7893-7895-7897-7899-7901-7903-7905-7907-7913-7915-7917-7919-7921-7854-7856-7858-7860-7862-7844-7846-7848-7850-7852-7870-7872-7874-7876-7878-7888-7890-7892-7894-7896-7898-7900-7902-7904-7906-7912-7914-7916-7918-7920-225-224-7843-227-7841-259-226-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-193-192-7842-195-7840-258-194-272-201-200-7866-7868-7864-202-205-204-7880-296-7882-211-210-7886-213-7884-212-416-218-217-7910-360-7908-431-221-7922-7926-7928-7924-10"
Const sTelex = "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-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-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- vbE "
Const sVni = "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-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-A1-A2-A3-A4-A5-A7-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- vbE "
Const sXoaDau = "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-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-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 UT(ByVal mTex As String, Optional Bo As Byte = 1) As String 'chuyen kieu go unicode thanh kieu go telex
Dim i As Long
    Nguon = Split(sChrW, "-"):  KetQua = Split(sTelex, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, ChrW$(Nguon(i)), KetQua(i))
    Next i
    UT = mTex
End Function
Function TU(ByVal mTex As String, Optional Bo As Byte = 1) As String'chuyen kieu go telex thanh unicode
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)))
    Next i
    TU = mTex
End Function
Function UV(ByVal mTex As String, Optional Bo As Byte = 1) As String'chuyen kieu go unicode thanh kieu go vni
Dim i As Long
    Nguon = Split(sChrW, "-"):  KetQua = Split(sVni, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, ChrW$(Nguon(i)), KetQua(i))
    Next i
    UV = mTex
End Function
Function VU(ByVal mTex As String, Optional Bo As Byte = 1) As String'chuyen kieu go vni thanh unicode
Dim i As Long
    Nguon = Split(sVni, "-"):   KetQua = Split(sChrW, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, Nguon(i), ChrW$(KetQua(i)))
    Next i
    VU = mTex
End Function
Function mTV(ByVal mTex As String, Optional Bo As Byte = 1) As String'xoa dau tieng viet
Dim i As Long
    Nguon = Split(sChrW, "-"):  KetQua = Split(sXoaDau, "-")
    For i = LBound(Nguon, 1) To UBound(Nguon, 1) - Bo
        mTex = Replace(mTex, ChrW$(Nguon(i)), KetQua(i))
    Next i
    mTV = mTex
End Function
=UT("Thí nghiệm") => This nghieejm
=TU("This nghieejm") => Thí nghiệm
=UV("Thí nghiệm") => Thi1 nghie65m
=VU("Thi1 nghie65m") => Thí nghiệm
=mTV("Thí nghiệm") => Thi nghiem
code không áp dụng cho tiếng anh nha bạn. This thì nó sẽ thành Thí chứ không thông minh đến nỗi nhận biết nó là tiếng anh mà giữ lại nguyên mẫu đâu, khuyến khích chuyển thành kiểu VNI thì hay hơn
Mấy cái hằng số sao bạn vừa khai báo chữ thường vừa CHỮ HOA chi vậy? Tôi nghĩ chỉ cần dạng chữ thường là đủ, bởi trong VBA hàm UCase hỗ trợ Unicode mà
 
Upvote 0
Mấy cái hằng số sao bạn vừa khai báo chữ thường vừa CHỮ HOA chi vậy? Tôi nghĩ chỉ cần dạng chữ thường là đủ, bởi trong VBA hàm UCase hỗ trợ Unicode mà
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.
 
Upvote 0
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.
Vào VBA, bấm Ctrl + G mở cửa số Immediate, gõ vào dòng lệnh:
Mã:
?UCase("á") = "Á"
Enter phát, xem kết quả và tự rút ra kết luậ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
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!
 
Upvote 0
Vào VBA, bấm Ctrl + G mở cửa số Immediate, gõ vào dòng lệnh:
Mã:
?UCase("á") = "Á"
Enter phát, xem kết quả và tự rút ra kết luận
--------------------------------------------

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!
khà khà, Thầy nghiên cứu xem :P
 
Upvote 0
Vào VBA, bấm Ctrl + G mở cửa số Immediate, gõ vào dòng lệnh:
Mã:
?UCase("á") = "Á"
Enter phát, xem kết quả và tự rút ra kết luận
--------------------------------------------

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ỗ đó.
đú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.
 
Lần chỉnh sửa cuối:
Upvote 0
như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?
bỏ bớt phần chữ in và thêm 1 dòng lệnh với Ucase xem sao
Mã:
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
 
Upvote 0
bỏ bớt phần chữ in và thêm 1 dòng lệnh với Ucase xem sao
Mã:
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ăm :D
 
Upvote 0
Trước khi chuyển, bạn ghi lại xem cái ký tự đầu nó là in hay thường. (1)
Lúc chuyển, đổi cả hai ký tự thành thường (2). Và chuyển thành tiếng có dấu
Chuyển xong, dựa vào ký tự đầu là in hay thường mà UCase chúng trở lại.

Gợi ý:
(1) bảng mã Ascii chuẩn thì ký tự thường = ký tự in + 32. Có thể xét in/thường qua cái bit 32 của nó
thuong = (Asc(kyTu) And 32)
(2) đổi ký tự từ in thành thường cũng có thể dùng cái bit 32
kyTu = Char(Asc(kyTu) Or 32)
 
Upvote 0
như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.
Bà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!
 
Upvote 0
bạ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é
Hình như cái hàm UNItoVBA là của tôi thì phải :))
http://www.giaiphapexcel.com/dienda...-để-làm-thư-viện-hàm.50873/page-3#post-325712
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
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.
 
Upvote 0
Upvote 0
Bà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!
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
 

File đính kèm

Upvote 0
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
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
 
Upvote 0
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!
đọ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 :D
 
Upvote 0
Upvote 0
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
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ỉ.
Em thì phải ngồi ghi bước giải quyết vô giấy rồi cách giải quyết mọi trường hợp. Xong mới viết code, viết 1 hồi hết nhìn ra luôn. Hên viết tới đâu còn ghi chú tới đó, coi còn hiểu chỗ đó làm cái gì.
 
Upvote 0
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ẹ
 
Upvote 0
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ẹ

Chưa hẳn do thiếu bộ nhớ làm chậm. Cái chậm có thể do thời gian đưa code vào bộ nhớ.
VBA là loại ngôn ngữ chạy theo kiểu đến đâu dịch đến đó. Bién toàn cục chỉ đưa vào chương trình 1 lần rồi nằm luôn trong bộ nhớ (bộ nhớ heap). Biến nôi nằm trong function, khi function chạy thì nó đi theo vào bộ nhớ (bộ nhớ stack), chạy xong thì cả vùng stack đó được clear hết.

Trên nguyên tắc, có 2 lý do khiến ngừoi ta muốn đưa các Const's vào hàm:
1. code gọn hơn, lúc cần dời đổi thì chỉ cần cóp nguyên hàm. Nếu ngừoi viết khéo, đặt chúng ở đầu code thì ngừoi đọc nhìn vào, biết ngay hàm chạy dựa trên 1 số điều kiện thông số (trị của Const's) và sửa đổi dễ dàng (ngừoi viết thường có chú thích chỉ dẫn cách sửa đổi)
2. an toàn hơn, hàm nào có Const's nấy. Tha hồ đặt tên, khỏi bị xích mích nhau.

Cũng trên nguyên tắc, có 2 lý do người ta muốn đưa ra ngoài:
1. chúng là của chung, là thông số cho tất cả các hàm trong module
2. bắt buộc chúng nằm trong heap để không phải mất công đưa vào bộ nhớ nhiều lần (đây là Const, khong cần khở tạo, chứ biến thì người ta còn tiết kiệm thời gian khởi tạo)

Tôi nói đây là trên quan điểm kỹ thuật chung chứ tôi thực sự không biết bên trong VBA Const được xử như thế nào. Có môt số ngôn ngữ, const là dạng hằng được trình dịch đưa thẳng vào nơi sử dụng. Tức là:
Const C = 999 : lúc đọc đến dòng này, trình dịch nhớ rằng nó có 1 hằng số 999
A = B + C : lúc đọc đến dòng này, trình dịch sẽ tự động hiểu A = B + 999
 
Upvote 0
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ỉ.
.
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ì:
- Viết 1 hàm riêng để chuyển tiếng Việt có dấu sang cách gõ Telex (hoặc VNI)
- Viết 1 hàm riêng để chuyển cách gõ Telex (hoặc VNI) sang tiếng Việt có dấu
- Viết thêm vài hàm riêng khác nữa nếu cần (chẳng hạn loại bỏ dấu tiếng Việt hay gì đó)
- Xong tôi viết 1 hàm chính như hàm của bạn nhưng code ngắn gọn hơn vì khi ấy tôi chỉ làm động tác gọi mấy hàm phía trên là xong
Và theo cách viết tôi vừa nêu thì việc đặt Const bên ngoài là rất hợp lý
 
Upvote 0
không hiểu sao máy mình làm cái Msgbox Tiếng Việt nó cứ hiểu sai Từ Sau ...và 1 vài từ nữa .... biết được chắc chết
Sai: Đã = ChrW(272) & "ã"
Đúng: Đã = ChrW(272)&ChrW(227)
 
Upvote 0
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
Anh ơi em muốn từ:
Đà Nẵng đổi thành DDaf Nawngx, là ý nghĩ để dấu ở cuối được không anh.
Em cần để làm mã đố ạ.
 
Upvote 0
Anh ơi em muốn từ:
Đà Nẵng đổi thành DDaf Nawngx, là ý nghĩ để dấu ở cuối được không anh.
Em cần để làm mã đố ạ.
cái đấy có vẻ hơi khó đấy bạn
nếu gõ như vậy bạn cho mình hỏi chữ này nếu theo cách gõ bạn nêu thì kết quả như thế nào. để kết quả đúng thì gõ ra sao
chữ Dương theo bạn gõ tự do thì gõ ra sao để chuyển về đúng với chữ Dương, 1 chữ w cuối cùng hay 2 chữ. nếu 2 chữ thì liệu khi chuyển về có đúng kết quả không
tôi có tham khảo bài bên này, code chuyển kiểu tự do sang kiểu chuẩn thì kết quả trả về không chính xác
 
Upvote 0
cái đấy có vẻ hơi khó đấy bạn
nếu gõ như vậy bạn cho mình hỏi chữ này nếu theo cách gõ bạn nêu thì kết quả như thế nào. để kết quả đúng thì gõ ra sao
chữ Dương theo bạn gõ tự do thì gõ ra sao để chuyển về đúng với chữ Dương, 1 chữ w cuối cùng hay 2 chữ. nếu 2 chữ thì liệu khi chuyển về có đúng kết quả không
tôi có tham khảo bài bên này, code chuyển kiểu tự do sang kiểu chuẩn thì kết quả trả về không chính xác
dạ anh theo yêu cầu bên em thì chứ Dương sẽ được viết như sau Duwowng ạ
còn các dấu sắc huyền hỏi ngã nặng tương ứng s f r x j sẽ được viết sau cùng, cảm ơn sư quan tâm của anh.
 
Upvote 0

File đính kèm

Upvote 0

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

Back
Top Bottom