Hàm kiểm tra mã Container.

  • Thread starter Thread starter ST-Lu!
  • Ngày gửi Ngày gửi
Liên hệ QC

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Em có sưu tầm một Function sau nhưng chưa hiểu
công dụng của nó là gì?
----------
Các Huynh "ngó" qua và chỉ giúp nhé

PHP:
Type StructName
    Char As String
    Num As Integer
End Type

Global MyArray(26) As StructName    'Save value and character table

Function Check(s1, s2) As String
    s1 = UCase(Trim(s1))        'Trim bank of st string
    s2 = Trim(s2)
    'Init array
    Index = 1
    Char = 65            '65 is equal character "A"
    For i = 10 To 38
        If ((i Mod 11)) <> 0 Then
            MyArray(Index).Char = Chr(Char)
            Char = Char + 1
            MyArray(Index).Num = i
            Index = Index + 1
        End If
    Next i
    If (Len(s1) >= 5) Then
        Check = "Error prefix: More than 4 characters!"
        Exit Function
    End If

    Dim Total As Long
    Total = 0
    k = 1
    For i = 1 To 4
        c$ = Right(Left(s1, i), 1)
        For j = 1 To 26
            If (StrComp(c$, MyArray(j).Char)) = 0 Then
                Total = Total + MyArray(j).Num * k
                k = k * 2
                Exit For
            End If
        Next j
    Next i

    If (s1 = "APLS") Then
        Check = "APL Cont. and only 6 numbers"
        Exit Function
    End If

    If (s1 = "APLU") Then
        Check = "APL Cont. and only 6 numbers"
        Exit Function
    End If

    If ((Len(s2) >= 8)) Then
        Check = "Error: More than 7 numbers"
        Exit Function
    End If
    If ((Len(s1) = 0)) Then
        Check = ""
        Exit Function
    End If
        If ((Len(s2) <= 6)) Then
        Check = "Error: Less than 7 numbers"
       Exit Function
    End If

    For i = 1 To 6
        c$ = Right(Left(s2, i), 1)
        Total = Total + Val(c$) * k
        k = k * 2
    Next i

    If (s1 = "HLCU") Then
        Total = Total - 13
    End If

    While Total >= 11
        Total = Total - 11
    Wend

    If (Total = 10) Then
        Total = 0
    End If

    If (Total = Val(Right(s2, 1))) Then    'if True
        Check = "True!"
    Else
        Check = "Error!Please recheck!"
    End If
End Function
 
From PhanTuHuong: Hàm này dùng để so sánh thông tin trong 2 chuỗi, không hiểu thuộc lĩnh vực nào?

Quả thật là không hiểu hàm trên sử dụng cho mục đích gì, chắc là của nước ngoài. Nhưng nhìn vào thấy vừa array, vừa for với quá nhiều If..End thì ngán rồi. Nếu biết mục đích của hàm thì có lẽ anh em GPE sẽ làm hay hơn thế này.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Hàm gì ?

DÙNG ĐỂ KIỂM TRA SỐ CONTAINER CÓ ĐÚNG MÃ QUỐC TẾ HAY KHÔNG.
NẾU ĐÚNG THÌ CHO KẾT QUẢ LÀ True!
SAI THÌ CHO KẾT QUẢ LÀ Error!Please recheck!

CÁCH TÍNH NHƯ SAU :
CONTAINER CHUẨN CO 4 CHỬ VÀ 7 SỐ THÍ DỤ LÀ MOGU0013465
TA CHO KÝ TỰ TỪ TRÁI SANG PHẢI LA KT1,KT2 KT11
TA LƯỢNG HÓA 4 KÝ TỰ CHỮ VỚI
A=10 B=12 C=13 D=14 E=15 F=16 G=17 H=18 I=19
J=20 K=21 L=23 M=24 N=25 O=26 P=27 Q=28 R=29
S=30 T=31 U=32 V=34 W=35 X=36 Y=37 Z=38
-TÍNH TỔNG 10 KÝ TỰ ĐẦU
TONG=KT1*2^0+KT2*2^1+KT3*2^2+....KT10*2^9
-TÍNH PHẦN DƯ CỦA TỔNG VỚI 11
PHANDU= MOD(TONG,11)
-PHANDU=IF(PHANDU=10,0,PHANDU)
-SO SÁNH PHẦN DƯ VỚI KT11
IF(PHANDU=KT11,"True!","Error!Please recheck!")

Ở ĐÂY HÀM CÓ TÍNH ĐẾN SỰ KHÔNG CHUẨN CỦA CONTAINER CÓ TIẾP ĐẦU NGỮ LÀ
APLS APLU HLCU.
 
Lần chỉnh sửa cuối:
Upvote 0
Dear Anh Ngvanho. Đúng là quản lý container anh ạ
Như anh viết
CONTAINER CHUẨN Có 4 CHỬ VÀ 7 SỐ THÍ DỤ LÀ MOGU0013465
TA CHO KÝ TỰ TỪ TRÁI SANG PHẢI LA KT1,KT2 KT11
TA LƯỢNG HÓA 4 KÝ TỰ CHỮ VỚI
A=10 B=12 C=13 D=14 E=15 F=16 G=17 H=18 I=19
J=20 K=21 L=23 M=24 N=25 O=26 P=27 Q=28 R=29
S=30 T=31 U=32 V=34 W=35 X=36 Y=37 Z=38
-TÍNH TỔNG 10 KÝ TỰ ĐẦU
TONG=KT1*2^0+KT2*2^1+KT3*2^2+....KT10*2^9
Container chuẩn có 4 chữ, ta lượng hoá 4 ký tự chữ...nhưng
phần dưới thì tính tổng 10 ký tự đầu

Làm sao ta có công thức này
TONG=KT1*2^0+KT2*2^1+KT3*2^2+....KT10*2^9

sau đó ta so sánh với KT11 là KT nào?

Mong anh chỉ giúp để thằng em mở mang thêm chút kiến thức

Cám ơn Anh
 
Upvote 0
NHƯ ĐẢ NÓI Ở TRÊN LÀ CONTAINER CHUẨN TRƯỚC NHẤT PHẢI CÓ 4 CHỬ VÀ 7 SỐ ( CÓ PHẢI ĐÚNG LÀ CO 11 KÝ TỰ KHÔNG?) .THÍ DỤ MOGU0013465( 11 ký tự ).
PHẢI NÓI CHO RỎ LÀ 7 SỐ THỰC CHẤT LÀ TEXT CHỨ KHÔNG PHẢI LÀ SỐ .
CHÚNG TA ĐÁNH SỐ THỨ TỰ CHO CÁC KÝ TỰ LÀ KT1,KT2 . . . KT11 THEO THỨ TỰ TỪ TRÁI SANG PHẢI.VÌ 4 KÝ TỰ ĐẦU LÀ TEXT KHÔNG TÍNH TOÁN ĐƯỢC NGƯỜI QL MÃ CHUẨN ĐÃ SỐ HÓA CHO CÁC KÝ TỰ NHƯ A = 10 B= 12 ( NHƯNG BỘI SỐ CỦA 11 KHÔNG ĐƯỢC DÙNG ĐẾN ) ...Z=38.SAU ĐÓ ĐI TÍNH TỔNG CỦA 10 KÝ TỰ ĐẦU TIÊN THEO CÔNG THỨC (KHÔNG TÍNH KT11 , VÌ DÙNG ĐỂ KIỂM TRA ) :
TOTAL=KT1*2^0+KT2*2^1+KT3*2^2+KT4*2^3....KT10*2^9
TOTAL=MOD(TOTAL,11)
TOTAL= 10 THÌ CHO GT 0,CÒN LẠI LÀ BẰNG CHÍNH TOTAL
SO SÁNH TOTAL VỚI KT11,
NẾU BẰNG THÌ GT SẺ LÀ True !
SAI SẺ LÀ Error!Please recheck !

Ở ĐÂY NGƯỜI TA VIẾT HƠI KHÁC VỚI TÔI NÓI NHƯNG CŨNG GIỐNG NHƯ VẬY

While Total >= 11
Total = Total - 11
Wend

If (Total = 10) Then
Total = 0
End If

If (Total = Val(Right(s2, 1))) Then if True
Check = "True!"
Else
Check = "Error!Please recheck!"
End If



Một file làm bằng công thức kiểm tra container có phải đúng mã quốc tế hay không.xem file đính kèm nhé.
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Cám ơn Anh Nguyenvanho rất nhiều

Cách làm này làm em nhớ tới dạng bài toán kiểm tra mã số thuế (bác Bình OverAcc viết)
Nhưng do kiến thức của em còn quá hạn hẹp nên chưa hiểu nổi.
Thực sự nếu có dùng nó nhưng vẫn mang tính chất máy móc.
Không hiểu ai đã nghĩ ra quy luật này.
Ví dụ:
TOTAL=KT1*2^0+KT2*2^1+KT3*2^2+KT4*2^3....KT10*2^9
TOTAL=MOD(TOTAL,11)
TOTAL= 10 THÌ CHO GT 0,CÒN LẠI LÀ BẰNG CHÍNH TOTAL
SO SÁNH TOTAL VỚI KT11,
Theo như Anh chỉ dạy ở trên ta lấy ví dụ với Container MOGU0013465
với M = 24; O = 26; G = 17; U = 32;
-->
Total = 24*2^0+26*2^1+17*2^2+32*2^3+0*2^4+0*2^5+1*2^6+3*2^7+4*2^8+6*2^9
Total = MOD(TOTAL,11)
Total = MOD(4944,11) --> TOTAL = 5

Tại sao nếu là Container chuẩn thì
MOD (Total,11) lại bằng đúng kí tự thứ 11 nhỉ?

Em thắc mắc quá?

Cám ơn Anh vô cùng
 
Upvote 0
Lúc đi học ,người ta cũng chỉ cho tôi biết là ký tự thứ 11 là ký tự kiểm tra và công thức tính là như vậy.vì thế 1 container nào đó khi dùng hàm kiểm tra thấy báo sai thì phải xuống hiện trường kiểm tra lại.thân.
 
Upvote 0
Ta đã biết mục đích của nó. vậy tìm cách cải tiến xem sao?

Quả thật là không hiểu hàm trên sử dụng cho mục đích gì, chắc là của nước ngoài. Nhưng nhìn vào thấy vừa array, vừa for với quá nhiều If..End thì ngán rồi. Nếu biết mục đích của hàm thì có lẽ anh em GPE sẽ làm hay hơn thế này.

Mình thử cái xem sao, mong các bạn góp thêm:

PHP:
   s1 = UCase(Trim(s1))        'Trim bank of st string'
    s2 = Trim(s2)
1 '
    If (Len(s1) >= 5) Then
        Check = "Error prefix: More than 4 characters!"
        Exit Function
    End If '
2
    'Init array'
    Index = 1
    Char = 65            '65 is equal character "A"
    For i = 10 To 38
        If ((i Mod 11)) <> 0 Then
            MyArray(Index).Char = Chr(Char)
            Char = Char + 1
            MyArray(Index).Num = i
            Index = Index + 1
        End If
    Next i
Để tiết kiệm điện, mình đã cho chuyển đoạn lệnh từ 1 đến 2 lên trên, như hiện nay nó đang chiếm chỗ, Các bạn thấy được không?
 
Upvote 0
Nhờ [ngvanho;127146] & các bạn nào có số liệu kiểm xem macro kiểm tra container đúng mã quốc tế đã đúng hay chưa?
Mình định bỏ vô file cũa Hỗ, nhưng không được, đành nhờ vậy!

PHP:
Option Explicit
Function Check(s1 As String, s2 As String) As String
    s1 = UCase$(Trim(s1))        'Trim bank of st string'
    s2 = Trim(s2)
    If (Len(s1) <> 4) Then
        If ((Len(s1) = 0)) Then
            Check = "GPE.COM"
        Else
            Check = "Error prefix: Only 4 characters!"
        End If
        Exit Function
    ElseIf Left(s1, 3) = "APL" And (Right(s1, 1) = "S" Or Right(s1, 1) = "U") Then
        Check = "APL Cont. and only 6 numbers"
        Exit Function
    ElseIf ((Len(s2) >= 8)) Then
        Check = "Error: More than 7 numbers"
        Exit Function
    ElseIf ((Len(s2) <= 6)) Then
        Check = "Error: Less than 7 numbers"
       Exit Function
    End If
 Dim jJ As Byte:                    Dim ToTal As Long
 Dim Num As Integer
 For jJ = 1 To 10
    If jJ < 5 Then
        Num = Choose(Asc(Mid(s1, jJ, 1)) - 64, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, _
            21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38)
    Else
        Num = CInt(Mid(s2, jJ - 4, 1))
    End If
    ToTal = ToTal + 2 ^ (jJ - 1) * Num
 Next jJ
 If (s1 = "HLCU") Then ToTal = ToTal - 13
 ToTal = ToTal Mod 11
 If (ToTal = 10) Then ToTal = 0
 If (ToTal = Val(Right(s2, 1))) Then   ' if True'
    Check = "True!"
 Else
    Check = "Error!Please recheck!"
 End If
End Function

To ongtrungducmx25
xem quá trời! đọc quá trời ! mà em cũng chẳn hiểu cái này nói gì thế ai biết chỉ giúp giùm em thank

Hãy thử sức mình với hàm người dùng viết trên này xem sao?
 
Lần chỉnh sửa cuối:
Upvote 0
TÁC GIẢ VIẾT VỚI CHỬ VÀ SỐ Ở 2 Ô ,CÒN CHỬ VÀ SỐ NHẬP VÀO LÀM 1 THÌ SAO HẢ ANH?
CHECK(S=S1&S2)
Em thấy anh viết như thế là tốt rồi nhưng chỉ sai ở 22 thôi , phải là 21 mới đúng.ở đây không có bội số của 11(11,22,33).thân
 
Lần chỉnh sửa cuối:
Upvote 0
TÁC GIẢ VIẾT VỚI CHỬ VÀ SỐ Ở 2 Ô ,CÒN CHỬ VÀ SỐ NHẬP VÀO LÀM 1 THÌ SAO HẢ ANH?
CHECK(S=S1&S2)
Lúc đó hàm sẽ là:
PHP:
Function CheckOne( StrCont As String) As String
 Dim S1 As String, S2 As String
 S1 = Left(LTrim(StrCont),4)
 S2 = Right(RTrim(StrCont),7)
 
' . . . . . . . _
 . . . . . . . . . . . .'
End Function
Mà cũng có thể xử lý 1 chuỗi thôi; Nhưng hơi bị lười, thông cảm!!
Em thấy anh viết như thế là tốt rồi nhưng chỉ sai ở 22 thôi , phải là 21 mới đúng.ở đây không có bội số của 11(11,22,33).thân
Ờ hén, đoản quá đi mất! :-=
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
VỀ ĐỀ XUẤT CỦA ANH THÌ EM THẤY VẨN CHƯA ỔN :
TRƯỚC NHẤT PHẢI ĐỀ PHÒNG SL DO GỎ NHẦM NÊN KHÔNG ĐỦ ĐK NHƯ
a) CÓ NHỮNG KHOẢNG TRẮNG
b) KHÔNG ĐỦ 4 CHỬ HOẶC 7 SỐ ( DÙ LEN(S)=11 )
c) KHÔNG ĐỦ 11 KÝ TỰ
d) CÓ NHỬNG KÝ TỰ LẠ ( KHÁC A B C 1 2 3....)
VẬY PHẢI KIỂM TRA NHŨNG TRƯỜNG HỢP NÀY TRƯỚC CHO CHƯƠNG TRÌNH ĐỞ LÀM VIỆC LÒNG VÒNG ( DƯ VIỆC ).ANH THẤY SAO,XIN CHO BIẾT Ý KIẾN ? CÁM ƠN ANH RẤT NHIỀU.
THÂN.
 
Upvote 0
Không lười được, phải không!?!

Có thể còn thiếu sót; Rất cảm ơn người phát hiện cái sai trong ni!
PHP:
Option Explicit
Function Check1(strC As String) As String
 strC = UCase$(Trim(strC))
 If Len(strC) < 10 Or Len(strC) > 11 Then
    Check1 = "Error Cont. string"
 ElseIf Len(strC) = 10 And InStr(strC, "APL") > 0 Then
    Check1 = "APL Cont."
 If Len(strC) = 11 Then
    Dim jJ As Byte:                    Dim ToTal As Long
    Dim Num As Integer:                 Dim S1 As String, s2 As String
    For jJ = 1 To 11
        If jJ < 5 Then
            If Asc(Mid(strC, jJ, 1)) < 65 And Asc(Mid(strC, jJ, 1)) > 90 Then
                Check1 = "Error Cont. string":          Exit Function
            End If
            S1 = S1 & Mid(strC, jJ, 1)
        Else
            If Asc(Mid(strC, jJ, 1)) < 58 And Asc(Mid(strC, jJ, 1)) > 47 Then
                Check1 = "Error Cont. string":          Exit Function
            Else
                s2 = Mid(strC, jJ, 1)
            End If
        End If
    Next jJ
 End If
 
 For jJ = 1 To 10
    If jJ < 5 Then
        Num = Choose(Asc(Mid(S1, jJ, 1)) - 64, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, _
            21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38)
    Else
        Num = CInt(Mid(s2, jJ - 4, 1))
    End If
    ToTal = ToTal + 2 ^ (jJ - 1) * Num
 Next jJ
 If (S1 = "HLCU") Then ToTal = ToTal - 13
 ToTal = ToTal Mod 11
 If (ToTal = 10) Then ToTal = 0
 If (ToTal = Val(Right(s2, 1))) Then   ' if True'
    Check1 = "True!"
 Else
    Check1 = "Error!Please recheck!"
 End If
End Function
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Em đả thử code của anh , thấy nó không ra đáp số như ý . Em có chỉnh code của anh một tí . Tuy nhiên phần 4 ký tự chử đầu và 7 ký tự số kế tiếp nếu không chuẩn thì nó ra kết quả là #value! .a xem file đính kèm và góp ý nhé.thân
 

File đính kèm

Upvote 0
Đã sửa ở dòng lệnh 18 & 24 gây sai

Xin cảm ơn chú mày nhiều lắm!!
Có sửa thêm ở dòng lệnh 21, cũng như 3-5 đã bị vô hiệu hóa.
(Các dòng từ 3-8 ta có thể đem xuống dưới, như sau:

Mã:
[I]Case Else[/I]
[I]     CheckC = "Error Cont. string"[/I]
[I]      Exit Function  [/I]
trước dòng End Select)


PHP:
Option Explicit
Function CheckC(strC As String) As String
strC = UCase$(Trim(strC))
Select Case Len(strC)
'Case Is > 11'
'   CheckC = "Error Cont. string"'
'   Exit Function'
Case Is < 10, Is > 11
    CheckC = "Error Cont. string"
    Exit Function
Case Is = 10
    If InStr(strC, "APL") > 0 Then
        CheckC = "APL Cont."
    Else
        CheckC = "Error Cont. string"
    End If
    Exit Function
Case Is = 11
    Dim jJ As Byte:                 Dim ToTal As Long
    Dim Num As Integer:             Dim S1 As String, s2 As String
    For jJ = 1 To 11
        If jJ < 5 Then                'OR Not AND'
18            If Asc(Mid(strC, jJ, 1)) < 65 Or Asc(Mid(strC, jJ, 1)) > 90 Then
                CheckC = "Error Cont. string":          Exit Function
            Else
                If jJ = 4 Then S1 = Left(strC, jJ) '<=='
            End If
        Else                          'OR Not AND'
24            If Asc(Mid(strC, jJ, 1)) < 48 Or Asc(Mid(strC, jJ, 1)) > 57 Then
                CheckC = "Error Cont. string":          Exit Function
            Else
                s2 = Right(strC, 7)
            End If
        End If
    Next jJ
    For jJ = 1 To 10
        If jJ < 5 Then
            Num = Choose(Asc(Mid(S1, jJ, 1)) - 64, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, _
                21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38)
        Else
            Num = CInt(Mid(s2, jJ - 4, 1))
        End If
        ToTal = ToTal + 2 ^ (jJ - 1) * Num
    Next jJ
    If (S1 = "HLCU") Then ToTal = ToTal - 13
    ToTal = ToTal Mod 11
    If (ToTal = 10) Then ToTal = 0
    If (ToTal = Val(Right(s2, 1))) Then   ' if True'
        CheckC = "True!"
    Else
        CheckC = "Error! Please reCheckC!"
    End If
 End Select
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Em đả kiểm tra , hàm ra kết quả rất tốt.cám ơn anh đả bỏ chút thời gian cùng em làm ra hàm hoàn thiện.
Gởi đến anh chị em ngành vận tải tàu biển hàm kiểm tra mả iso chuẩn cho container.
thân!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
From Sa_DQ: Khi được tác giả topic đồng ý, mình sẽ đổi tên đề tài này cho sát nghĩa hơn, Ví dụ: . . . . . . . . . (Mời các bạn cho ý kiến tên tiêu đề mới!)
Em nghĩ sẽ đặt là: "Hàm kiểm tra mã container". Các bác nghĩ sao? Thân From Sa_DQ: Bạn thiếu chữ 'các', vì chí ít có hai hàm hoàn chỉnh; 1 do tác giả topic đưa ra, & 1 do GPE.COM viết! Bổ sung: Mà, nếu có người đề nghị, chúng ta sẽ gom hai hàm này thành một! Theo kiểu:
PHP:
 Function ChekcO( Str1 As String, Optional Str2 As String) As String  '. . . . . . . . .  _   . . . . . . . . . . . . . '  End Function
Xin đề nghỉ tác giả bài này & các bạn khác ta tiếp tục xem sao!?!
 
Lần chỉnh sửa cuối:
Upvote 0
--=0Nói cho rỏ hơn :
Hàm đầu tiên do bạn st-lu đưa lên nhưng không biết tác giả là ai
( mình cũng thấy nó trên mail của công ty marina ).sau đó gpe chúng ta
cải tiến ở dạng có 2 biến s1,s2 ở 2 ô tách biệt.do thấy có nơi người ta
thể hiện container là 1 ô với 4 ký tự chử và 7 số liền nhau hoặc cách nhau 1
khoảng trắng .nên tôi đề nghị a hyen17 làm lại hàm này theo hướng đó.
Vậy chúng ta chỉ có thể phổ biến hàm có 1 đối số mà thôi,còn hàm đầu phải
xin phép tác giả.đề nghị anh chị,em có sử dụng và phát triển chỉ nên dùng hàm sau do anh hyen17 tạo( hàm mà chử và số chung 1 ô).thân

To NgVanHo: Ý mình là viết lại hoàn toàn hàm này theo cách của chúng ta; nhưng khả năng của nó có thể nhận 2 loại đối số tùy chọn;
Loại 1: chỉ là 1 chuỗi 10-11 ký tự
Loại 2, hàm nhận hai đối số, Str4 & Str7
Chỉ phần đầu khảo sát tính đúng đắn của chuỗi nhận vô; còn thân chương trình vẫn chỉ tuyền các lệnh của chúng ta thôi; Đảm bảo không tí tẹo nào copy hay ăn cắp 1 dòng lệnh nào của họ cả; Chú đừng lo chuyện bản quyền ở đây!--=0

Cú pháp hàm trong tương lai sẽ là:
Hoặc Function CheckO( Str1)
Hay Function ChechO( Str1, Str2) tùy chọn người dùng có thể
=Function( [A7] hay =Function( [C2], [D2])
Mà tại 'A7' đang là chuỗi 'ABVF1543546'
hay tại 'C2' là 'BVFD' & tại 'D2' là chuỗi '1542512'


Em nhất trí với anh về đề xuất đó và cũng đồng ý với cái tên do bạn po-pikachu đặt.cám ơn bạn st-lu,anh sa-dq,hyen17...và các bạn khác về đề tài gần với ngành mình làm.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Hàm sau đây cho phép ta tùy biến rọng rãi hơn đó nha!

Hàm cho phép ta có thể nhập 1 hay 2 ô chứa chuỗi:
* 01 chuỗi duy nhất
* Hai chuỗi với độ dài 7 & 4 hay 4 & 7 lần lượt!
Nhờ chú Hỗ & các bạn kiểm tra thêm, nhất là sự đúng đắn của 10 dòng lệnh đầu
}}}}} :-=
PHP:
Option Explicit
Function ContCheckGPE(strC As String, Optional Str2 As String) As String
Const ErrCont As String = "Error Cont. string"
Dim jJ As Byte:                     Dim ToTal As Long
Dim Num As Integer:                 Dim S1 As String, s2 As String

strC = UCase$(Trim(strC))
If Len(Str2) > 0 Then Str2 = Trim(Str2)
If Len(Str2) = 7 Then
    strC = strC & Str2
ElseIf Len(Str2) = 4 And Len(strC) = 7 Then
9    strC = Str2 & strC
End If
Select Case Len(strC)
Case Is = 10
    If InStr(strC, "APL") > 0 Then
        CheckC = "APL Cont."
    Else
        CheckC = ErrCont
    End If
    Exit Function
Case Is = 11
    For jJ = 1 To 11
        If jJ < 5 Then
            If Asc(Mid(strC, jJ, 1)) < 65 Or Asc(Mid(strC, jJ, 1)) > 90 Then
                CheckC = ErrCont:                       Exit Function
            End If
        Else
            If Asc(Mid(strC, jJ, 1)) < 48 Or Asc(Mid(strC, jJ, 1)) > 57 Then
                CheckC = ErrCont:                       Exit Function
            Else
            End If
        End If
    Next jJ
    S1 = Left(strC, 4):                     s2 = Right(strC, 7)
    For jJ = 1 To 10
        If jJ < 5 Then
            Num = Choose(Asc(Mid(S1, jJ, 1)) - 64, 10, 12, 13, 14, 15, 16, 17, 18, 19 _
                , 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38)
        Else
            Num = CInt(Mid(s2, jJ - 4, 1))
        End If
        ToTal = ToTal + 2 ^ (jJ - 1) * Num
    Next jJ
    If (S1 = "HLCU") Then ToTal = ToTal - 13
    ToTal = ToTal Mod 11
    If (ToTal = 10) Then ToTal = 0
    If (ToTal = Val(Right(s2, 1))) Then
        CheckC = "True!"
    Else
        CheckC = "Error! Please reCheckC!"
    End If
 Case Else
    CheckC = ErrCont:                       Exit Function
 End Select
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Em đã kiểm tra hàm với 1 và 2 đối số đều có kết quả rất tốt.xin chân thành cám ơn anh sa_dq nhiều.chúc anh năm mới nhiều sức khỏe,phát tài,phát lôc.
Chúc năm mới vui vẻ.thân.
 
Upvote 0
Web KT

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

Back
Top Bottom