Nhờ Anh chị viết hàm UDF mã hóa chữ ko dấu thành số (và ngược lại)

Liên hệ QC

Tường_Vi

Thành viên tiêu biểu
Tham gia
19/4/10
Bài viết
482
Được thích
121
Nghề nghiệp
Luôn tìm kiếm một vị trí tốt hơn
Nhờ viết hàm UDF (có liên quan đến tìm kiếm, thay thế, kết hợp với vòng lặp)

Gửi Anh Chị

Em hiểu đây là dạng bài tìm kiếm và thay thế, nhưng nó liên quan đến vòng lặp, và phải dịch trong một câu dài nên em chưa biết cách làm
xin Anh chị chỉ giúp.

Giả sử ta có bảng quy ước như sau

CHỮ MÃ HÓA
A 01
B 02
C 03
D 04
E 05
F 06
G 07
H 08
I 09
J 10
K 11
L 12
M 13
N 14
O 15
P 16
Q 17
R 18
S 19
T 20
U 21
V 22
W 23
X 24
Y 25
Z 26


1. YÊU CẦU: HÀM UDF (CONVERTL): Biên dịch chữ không dấu sang số
TOI YEU GPE: = 201509 250521 071605

2.YÊU CẦU: Hàm UDF (CONVERTN): Biên dịch từ số sang chữ
201509 250521 071605 = TOI YEU GPE


Mong Anh Chị chỉ giúp ạ
 

File đính kèm

  • UDF-Mahoa.xlsx
    9.8 KB · Đọc: 44
Lần chỉnh sửa cuối:
Gửi Anh Chị

Em hiểu đây là dạng bài tìm kiếm và thay thế, nhưng nó liên quan đến vòng lặp, và phải dịch trong một câu dài nên em chưa biết cách làm
xin Anh chị chỉ giúp.

Giả sử ta có bảng quy ước như sau

CHỮ MÃ HÓA
A 01
B 02
C 03
D 04
E 05
F 06
G 07
H 08
I 09
J 10
K 11
L 12
M 13
N 14
O 15
P 16
Q 17
R 18
S 19
T 20
U 21
V 22
W 23
X 24
Y 25
Z 26


1. YÊU CẦU: HÀM UDF (CONVERTL): Biên dịch chữ không dấu sang số
TOI YEU GPE: = 201509 250521 071605

2.YÊU CẦU: Hàm UDF (CONVERTN): Biên dịch từ số sang chữ
201509 250521 071605 = TOI YEU GPE


Mong Anh Chị chỉ giúp ạ
Bạn cho tôi hỏi:
Chữ thường thì có mã hóa không và mã hóa như thế nào?
Các ký tự khác nếu có trong chuỗi thì không mã hóa phải không?
 
Upvote 0
Dạ, Chào Anh Thắng
- Không phân biệt HOA và Thường ạh, (A = a )
- Các ký tự khác không mã hóa

Mục đích
- Tập làm quen với code
- có 1 hàm nhỏ dùng vào việc trao đổi giữa 2 người. hi hi
 
Upvote 0
Dạ, Chào Anh Thắng
- Không phân biệt HOA và Thường ạh, (A = a )
- Các ký tự khác không mã hóa

Mục đích
- Tập làm quen với code
- có 1 hàm nhỏ dùng vào việc trao đổi giữa 2 người. hi hi
Tôi nghĩ nếu chuỗi nhập vào thỏa mãn ràng buộc (không có dấu) thì có thể sử dụng hàm UCASE, MID, INSTR để giải quyết.
1. Khai báo 2 hằng chuỗi có dạng: S1="A B C D E ...", S2="0102030405..."
2. Dùng UCASE (có thể thêm WorksheetFunction.Trim) để chuẩn hóa chuỗi nhập vào.
3. Sử dụng vòng lặp để duyệt từng ký tự của chuỗi nhập vào, nếu thuộc loại ký tự cần mã hóa thì kết hợp hàm MID và INSTR để lấy (1 hoặc 2) ký tự tương ứng trong 2 hằng chuỗi S1, S2 kia để ghép vào chuỗi kết quả.
 
Upvote 0
Dạ, Chào Anh Thắng
- Không phân biệt HOA và Thường ạh, (A = a )
- Các ký tự khác không mã hóa

Mục đích
- Tập làm quen với code
- có 1 hàm nhỏ dùng vào việc trao đổi giữa 2 người. hi hi
Bạn tham khảo code này
PHP:
Function CONVERTL(Str As String) As String
Dim i As Long, C As String
For i = 1 To Len(Str)
    C = Mid(Str, i, 1)
    If Asc(UCase(C)) >= 65 And Asc(UCase(C)) <= 90 Then
        CONVERTL = CONVERTL & Format(Asc(UCase(C)) - 64, "00")
    Else
        CONVERTL = CONVERTL & C
    End If
Next
End Function
PHP:
Function CONVERTN(Str As String) As String
Dim i As Long, C As String
Str = Replace(Str, " ", vbBack) & "_"
For i = 1 To Len(Str) - 1
    If IsNumeric(Mid(Str, i, 2)) Then
        If CLng(Mid(Str, i, 2)) >= 1 And CLng(Mid(Str, i, 2)) <= 26 Then
            CONVERTN = CONVERTN & Chr(CLng(Mid(Str, i, 2)) + 64)
            i = i + 1
        Else
            CONVERTN = CONVERTN & Mid(Str, i, 1)
        End If
    Else
        CONVERTN = CONVERTN & Mid(Str, i, 1)
    End If
Next
CONVERTN = Replace(CONVERTN, vbBack, " ")
End Function
Làm chơi để nghiên cứu thì được chứ áp dụng thì còn nhiều vấn đề lắm. Ví dụ NGAY 10/04/2014 mã hóa được 14070125 10/04/2014 nhưng dịch ngược lại thì là NGAY J/D/TN
 
Upvote 0
Em cám ơn Anh Thắng và mọi người.
Hàm sử dụng rất OK

Em sẽ nghiên cứu code, và hỏi Anh sau
 
Lần chỉnh sửa cuối:
Upvote 0
Dear Anh Thắng

Anh cho em hỏi hàm ASC dùng như nào ạh?
 
Upvote 0
Trúng tủ ta rồi,. . .

Bạn đến đây:
http://www.giaiphapexcel.com/forum/...ững-bài-tập-đơn-giản-về-xử-lý-chuỗi-trong-VBA

Nhưng báo trước mật mã của bạn ngay đầu công nguyên người ta cũng đã giải được bằng fương cách thống kê số lặp lại;

Hiện mình đang đọc quyển "Mật mã từ cổ điển đến lượng tử", khá hay; Trong đó có việc tạo ra loạt bài nêu trên

Và mình còn định viết 1 bài sắp tới tiếp sau. Xin giới thiệu luôn lên đây:

Mật mã gồm biểu thị 2 từ liền nhau bằng chữ số như bảng sau:

|1|2|3|4|5|6|. . . |21|..
1|A|AC|AE|AI|AM|AN|. . .|MA|..
2|E|EA|EC|EI|EM|EN|. . . |SE|. . .
3|IA|IC|IE|IM|IN|IO|. . . |QI|..
4|OA|OC|. . |. |. . .|..

Như vậy để biểu thị chữ 'MA SE IA' ta sẽ có 121 (1 là chỉ số dòng; 21 là chỉ số cột) 221 31

. . . .

Chúc vui!
 
Lần chỉnh sửa cuối:
Upvote 0
EM hiểu rồi, hàm ASC trả về mã hóa của 1 số/
 
Upvote 0
Cám ơn Anh SA_DQ
Rất hay ạh

Anh Thắng ơi
hàm CLng dùng để làm gì ạh, trong máy của em bôi đên nhấn F1 nhưng không được
 
Upvote 0
Tặng bạn hàm để mã hóa & giải mã với 2 ống khóa "Việt Tiệp"

Còn chìa khóa thì bạn tự nghiêm cứu trong bài đã dẫn để tạo ra khi xài

Ví dụ trường hợp "ABC"
(Dòng 3) ta dũa ra chìa khóa "BA CA MA A AC . . . . . "
(Dòng 4) "BE XE VE E EA . . . ."

. . . . . . . . . .
 

File đính kèm

  • gpeBaiTap.rar
    12.7 KB · Đọc: 28
Upvote 0
Tặng bạn ống khóa 6*6 & chìa khóa là VIETNAM, như sau:

Ta có vùng như bảng dưới đây:
|1|2|3|4|5|6
1| V | I | E | T |0|1
2| N | A | M |2|3|4
3|B|C|D|F|G|5
4|H|J|K|L|O|6
5|P|Q|R|S|U|7
6|W|X|Y|Z|8|9

Ô trống trên trái nhất của bảng là ô [A1] & bảng này được gán tên là "ABC9", như ta thấy trong hàm tự tạo.

Với hàm sau, ta sẽ mã hóa câu "Giai Phap Excel Sang Tuoi Thu 7"

PHP:
Option Explicit
Function MaHoa6_6(StrC As String)
 Dim J As Long, VTr As Byte
 Dim Rng As Range, sRng As Range
 Const KT As String = " ":                      Dim Tmp  As String
 
 Set Rng = Range("ABC9").Offset(1, 1)
 StrC = UCase$(Trim(StrC)) & KT
 For J = 1 To Len(StrC)
    Tmp = Mid(StrC, J, 1)
    If Tmp <> KT Then
        Set sRng = Rng.Find(Tmp, , xlFormulas, xlWhole)
        If sRng Is Nothing Then
            MaHoa6_6 = MaHoa6_6 & "? "
        Else
            MaHoa6_6 = MaHoa6_6 & Cells(sRng.Row, "A").Value & Cells(1, sRng.Column).Value
        End If
    Else
        MaHoa6_6 = MaHoa6_6 & KT
    End If
 Next J
End Function

Thành chuỗi "35122212 51412251 1362321344 54222135 14554512 144155 56"
 
Upvote 0
Mã:
Str = Replace(Str, " ", vbBack) & "_"

đoạn code trên em ko hiểu dùng để thay thế khoảng trống với VBback để làm gì ạ?
 
Upvote 0
Mã:
Str = Replace(Str, " ", vbBack) & "_"

đoạn code trên em ko hiểu dùng để thay thế khoảng trống với VBback để làm gì ạ?
Cái này bạn phải hiểu thuật toán thì mới hiểu được. Giải thích vầy không biết bạn hiểu không
PHP:
IsNumeric("1" & " ") = True
PHP:
IsNumeric("1" & vbBack) = False
 
Upvote 0
Cái này bạn phải hiểu thuật toán thì mới hiểu được. Giải thích vầy không biết bạn hiểu không
PHP:
IsNumeric("1" & " ") = True
PHP:
IsNumeric("1" & vbBack) = False

Anh Thắng
Tại sao mình phải thay thế (xóa) các khoảng trống bằng vbback (backscape). sau đó chèn thêm 01 ký tự (_) ớ dưới cùng.

khi đến cuối cùng lại replace vbback lại bằng một space bar

Có phải việc làm này (xóa khoảng trống) để thuận tiện cho đoạn lấy từng 02 ký tự số một phải ko ạh?



Anh chỉ giúp nhé
 
Upvote 0
Web KT
Back
Top Bottom