Bài tập viết hàm UDF để xác định số kiểm tra của 1 mã ghi trên container bất kỳ

Liên hệ QC

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
14,534
Được thích
22,802
Nghề nghiệp
U80
Bài tập VBA dành cho người chập chững:

Thường mã số container gồm 4 ký tự, sau đó là 6 ký số & ký số cuối cùng được gọi là số (để) kiểm tra

Ví dụ ABCZ 123456 X

Số X được gọi là số kiểm tra & xác lập nó theo 3 bước, như sau: (SUDU 307007)

Bước I: Biến các ký tự thành các số (gồm 2 chữ số) theo bảng I sau đây:

ABCDEFGHIJKLM
10121314151617181920212324
NOPQRSTUVWXYZ
25262728293031323435363738
(Các số ở hàng dưới để thay cho các chữ cái trên nó tương ứng: B=> 12,. . . .)

Bước 2: (Tạm gọi là chuyển số) theo qui ước đề ra theo bảng II

Kí tựSố tương ứngLũy thừa 2 mũ nChi tiếtTách số
(a)(b)(c)(b)x(c)(e)
S302^030 x 2^030
U322^132 x 2^164
D142^214 x 2^256
U322^332 x 2^3256
332^43 x 2^448
002^50 x 2^50
772^67 x 2^6448
002^70 x 2^70
002^80 x 2^80
772^97 x 2^93584
Tổng4486


Bước 3: Tính tổng & lấy tổng này chia cho 11 để tìm ra số kiểm tra, là số dư của phép chia

Ví dụ cú pháp hàm sẽ là =SoKT("SUDU 307007") sẽ trả về con số 9
 
Lần chỉnh sửa cuối:
Bài tập VBA dành cho người chập chững:

Thường mã số container gồm 4 ký tự, sau đó là 6 ký số & ký số cuối cùng được gọi là số (để) kiểm tra

Ví dụ ABCZ 123456 X

Số X được gọi là số kiểm tra & xác lập nó theo 3 bước, như sau: (SUDU 307007)

Bước I: Biến các ký tự thành các số (gồm 2 chữ số) theo bảng I sau đây:

ABCDEFGHIJKLM
10121314151617181920212324
NOPQRSTUVWXYZ
25262728293031323435363738
(Các số ở hàng dưới để thay cho các chữ cái trên nó tương ứng: B=> 12,. . . .)

Bước 2: (Tạm gọi là chuyển số) theo qui ước đề ra theo bảng II

Kí tựSố tương ứngLũy thừa 2 mũ nChi tiếtTách số
(a)(b)(c)(b)x(c)(e)
S302^030 x 2^030
U322^132 x 2^164
D142^214 x 2^256
U322^332 x 2^3256
332^43 x 2^448
002^50 x 2^50
772^67 x 2^6448
002^70 x 2^70
002^80 x 2^80
772^97 x 2^93584
Tổng4486


Bước 3: Tính tổng & lấy tổng này chia cho 11 để tìm ra số kiểm tra, là số dư của phép chia

Ví dụ cú pháp hàm sẽ là =SoKT("SUDU 307007") sẽ trả về con số 9
Góp vui bài này nhé bác:
Mã:
Function SoKT(ByVal Chuoi As String) As Long
Dim sArr(), I As Long, J As Long, K As Long, R As Long, a As Long, b As Long
Dim MaSo As String, Tong As Long
K = 10
MaSo = Replace(Chuoi, " ", "") 'bo khoang trang
For I = 65 To 90
    J = J + 1
    Select Case K: Case 11, 22, 33: K = K + 1: End Select
    ReDim Preserve sArr(1 To 26, 1 To 2)
    sArr(J, 1) = Chr(I): sArr(J, 2) = K: K = K + 1
Next
R = UBound(sArr, 1)
For a = 1 To Len(MaSo)
    If a <= 4 Then
        For b = 1 To R
                If Mid(MaSo, a, 1) = sArr(b, 1) Then
                    Tong = Tong + sArr(b, 2) * 2 ^ (a - 1): Exit For
                End If
        Next
    Else
        Tong = Tong + Mid(MaSo, a, 1) * 2 ^ (a - 1)
    End If
Next
SoKT = Tong Mod 11
End Function
 
Upvote 0
Thử làm bài tập
Mã:
Function ABC(ByVal s As String) As Long
Dim i As Long, n As Long
For i = 1 To 11
    If i < 5 Then
        n = Asc(Mid(s, i, 1)) - 55
        ABC = ABC + (n + n \ 11) * 2 ^ (i - 1)
    ElseIf i > 5 Then
        ABC = ABC + Mid(s, i, 1) * 2 ^ (i - 2)
    End If
Next
ABC = ABC Mod 11
End Function
 
Upvote 0
Thử làm bài tập
Mã:
Function ABC(ByVal s As String) As Long
Dim i As Long, n As Long
For i = 1 To 11
    If i < 5 Then
        n = Asc(Mid(s, i, 1)) - 55
        ABC = ABC + (n + n \ 11) * 2 ^ (i - 1)
    ElseIf i > 5 Then
        ABC = ABC + Mid(s, i, 1) * 2 ^ (i - 2)
    End If
Next
ABC = ABC Mod 11
End Function
Bài tập VBA dành cho người chập chững
Anh HuuThang chập chững lâu quá :D
 
Upvote 0
Nếu là tính chữ số kiểm tra thì phải là For i = 1 To 10 chứ nhỉ.
 
Upvote 0
Nếu gọi là bài tập thì phải cho người ta biết khi bắt đầu làm bài thì cần biết những gì và sau khi làm xong thì học được gì.

Nói cho đúng thì loại bài này là tập giải thuật nhào nắn ký số chứ không hẳn là tập code. Loại bài giành cho dân đã quen phân tích con toán. Trình độ trung bình trở lên chứ không thể gọi là "chập chững".

@tác giả bài #2, #3:
Hai đoạn phân biệt và làm việc khác nhau. Con số 4 đã xác định ranh giới. Gặp tôi thì 2 vòng lặp quách chứ gom vào 1 chi mất công:
For i = 1 to 4
n = Asc(Mid(s, i, 1)) - 55
ABC = ABC + (n + n \ 11) * 2 ^ (i - 1)
Next i
For i = 6 Tp 11 (hoặc 5 To 10 nếu đã loại dấu cách)
ABC = ABC + Mid(s, i, 1) * 2 ^ (i - 2)
Next i
 
Upvote 0
Chuỗi mẫu có ký tự space ở giữa nữa nên xét đến ký tự thứ 11 mới lấy đủ 10 ký tự cần tính toán.
À thì ra thế. Tôi không để ý kỹ vì nếu tôi không lầm thì dấu cách này là do chủ thớt tự bịa ra chứ theo CHUẨN thì làm gì có dấu cách.
 
Upvote 0
.̃ . . . . vì nếu tôi không lầm thì dấu cách này là do chủ thớt tự bịa ra chứ theo CHUẨN thì làm gì có dấu cách.

Thú thực là mình cũng không rành về mã này lắm, nên thấy người ta ghi sao thì sao chép lại thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu nói về chuẩn thì tôi cũng có thể tự đọc. Ý tôi là tôi không tìm thấy chỗ nào nói là SỐ CÔNG TƠ NƠ phải có dấu cách sau 4 ký tự đầu.
 
Upvote 0
Web KT

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

Back
Top Bottom