อยากได้โค้ดสำหรับตรวจสอบการกรอกเลขบัตรประชาชน
กระทู้เก่าบอร์ด อ.Yeadram

 10,436   11
URL.หัวข้อ / URL
อยากได้โค้ดสำหรับตรวจสอบการกรอกเลขบัตรประชาชน

เรียน ท่าน yeadram คืออยากได้โค้ดที่นำไปใช้ในการตรวจสอบการกรอกข้อมูลเลขบัตรประชาชนของคนไทย คือจะนำฟังก์ชันดังกล่าวไปใส่ในคิวรี่อาจจะรายงานผลออกมาเป็นเลขบัตรผิดกรอกใหม่นะครับ เป็นต้น

11 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R00087
ขออนุญาติ แสดงความเห็นนะครับ คือผมไม่แน่ใจว่า
1.ถ้ากรอก เลขครบ 13 หลัก แล้วมีวิธีการตรวจสอบ ได้หรือไม่ว่าเป็นเลขบัตรประชาชนที่ถูกต้อง หรือ ไม่ถูกต้อง

2.แต่ถ้า กรอกไม่ครบ 13 หลัก หรือ ไม่กรอก พอจะคิดออกอยู่ครับ เช่น ใช้ function len หรือตรวจสอบค่าว่าง ก่อนบันทึก

ถ้าเป็นประเด็นที่ 1 ใครมีแล้ว ก็อยากจะได้เหมือนกันครับ
2 @R00095
หมายความว่า CODE นี้ใช้ตรวจสอบเลขบัตรประชาชนที่ถูกต้อง หรือ ไม่ถูกต้อง
ได้ด้วยใช่ไหมครับ (ในกรณีกรอกเลข 13 หลัก ครบ)
ถ้าใช่ รบกวน คุณ YearRam อธิบายหลักการซักหน่อยได้ไหมครับ
เผื่อจะมีประโยชน์อื่นอีกในวันข้างหน้า
3 @R00096
วิธี checkdigit เลขบัตรประชาชน

เลขบัตร 1201541462234

ขั้นตอนที่ 1 - เอาเลข 12 หลักมา เขียนแยกหลักกันก่อน (หลักที่ 13 ไม่ต้องเอามานะคร้าบ)
1 2 0 1 5 4 1 4 6 2 2 3

ขั้นตอนที่ 2 - เอาเลข 12 หลักนั้นมา คูณเข้ากับเลขประจำหลักของมัน
รหัสบัตร 1   2   0 1   5 4 1 4 6 2 2 3
ตัวคูณ 13 12 11 10 9 8 7 6 5 4 3 2
ผลคูณ 13 24 0   10 45 32 7 24 30 8 6 6

ขั้นตอนที่ 3 - เอาผลคูณทั้ง 12 ตัวมา บวกกันทั้งหมด จะได้ 13+24+0+10+45+32+7+24+30+8+6+6=205

ขั้นตอนที่ 4 - เอาเลขที่ได้จากขั้นตอนที่ 3 มา mod 11 (หารเอาเศษ) จะได้ 205 mod 11 = 7

ขั้นตอนที่ 5 - เอา 11 ตั้ง ลบออกด้วย เลขที่ได้จากขั้นตอนที่ 4 จะได้ 11-7 = 4 (เราจะได้ 4 เป็นเลขในหลัก Check Digit)
ถ้าเกิด ลบแล้วได้ออกมาเป็นเลข 2 หลัก ให้เอาเลขในหลักหน่วยมาเป็น Check Digit (เช่น 11 ให้เอา 1 มา, 10 ให้เอา
4 @R00097
พอ เข้า ใจแล้วครับ
ใครคนคิดนี่ เลขบัตรประชาชนนี่
ดังนั้น เลขบัตรประชาชนบางเลข จึงไม่น่าจะมี
เช่น
1111111111111
00000000000
อะไรประมาณนี้ ใช่ไหมครับ
5 @R00098
Yes ถ้า หลักที่ 13 ไม่เท่ากับที่เราคำนวนได้ จะเป็นเลขปลอมครับ

(เขียนไม่ครบ 10 เอา 0 ครับ)
6 @R00100
ขอบคุณทุกๆ ท่านครับ ที่เข้ามาร่วมตอบ และ เยี่ยมชมคงมีประโยชน์สำหรับหลายๆ ท่านน่ะครับ ของผมนี่ไม่ต้องการตรวจสอบขณะที่กรอกครับ..
7 @R00101
พิสูจน์แล้ว
Expr1     pin
-1     1550500139753
0     1550500140051

ฟังก์ชั่นหาจากเอ็กเซลเป็น
=+RIGHT(11-MOD(SUMPRODUCT((MID(C2,ROW($1:$12),1))*(14-ROW($1:$12))),11),1)
1550500139753     3 (ตัวท้ายที่แสดง)
1550500140051     1 (ตัวท้ายที่แสดง)
จากเว็บ http://www.excelexperttraining.คอม/forums/showthread.php?p=9231
เลยขอนำมาปรับปรุงเรื่องที่กรณีผลลัพธ์เป็น 2 หลัก(10 หรือ 11) ให้เอามาตัวขวาสุดตัวเดียว ผมเห็นในฟังก์ชั่น ให้แจ้งว่า False คือ 0 ถูกคือ -1 ใช่เปล่าครับ(อันนี้ลองกับเลขตัวเอง) ช่วยตรวจให้อีกรอบนะครับ ขอบคุณครับหากนำไปใช้ไม่ถูกต้องชี้แนะให้ใหม่นะครับ
8 @R00102
แก้ไขครับ

Function ThaiIDcheck(ByVal IDnumber As String) As Boolean
Dim i, x As Integer
If Len(IDnumber) <> 13 Then GoTo chkFalse
For i = 1 To 13
If Not IsNumeric(Mid(IDnumber, i, 1)) Then GoTo chkFalse
Next
If CLng(Left(IDnumber, 1)) = 9 Then GoTo chkFalse 'ราชวงศ์.. ไม่เช็ค
If CLng(Left(IDnumber, 1)) = 0 Then GoTo chkFalse 'เป็นไปไม่ได้
            i = 0
        For j = 1 To 12
            i = i + ((14 - j) * CLng(Mid(IDnumber, j, 1)))
        Next
               x = Right(11 - (i Mod 11), 1)
            ThaiIDcheck = False
            If CInt(Right(IDnumber, 1)) = x Then ThaiIDcheck = True
Exit Function
chkFalse:
    ThaiIDcheck = False
End Function
จริงแล้วเลขทุกหลัก มีความหมายหมดนะครับถ้าจะเช็คกันจริงๆ เช็คได้ครับ เทียบกับฐานข้อมูลตำบลได้ครับ แต่ผมเช็คให้คร่าว แค่สามเงื่อนไข
- เป็นตัวเลขทั้งหมด
- มี 13 หลัก
- หลักแรก ไม่ขึ้นต้นด้วย 0 (ส่วนเงื่อนไขการตรวจสอบหลักอื่นๆ คงพอได้แนวทางแล้วนะครับ ก็ไปเพิ่มเติมกันเอาเอง)
สำหรับความหมายของแต่ละหลัก ผมจำลิงค์ไม่ได้ครับ ลองค้นดูใน search engine ดูนะครับมีหลายลิงค์ที่แจงรายละเอียดครับ
9 @R00103
ถูกต้องแล้วครับ ผลลัพธ์ถูกต้อง... ขอบคุณท่าน yeadram ครับผม
10 @R00126
ฝากเอาไว้ให้อ่านกันครับ
เช็คดิจิตที่ผิดเพี้ยน

อีกอย่างนึงครับที่ผมหามานานไม่รู้มีใครเก็บสะสมหรือเปล่า
สูตรเช็คดิจิตของธนาคารต่าง...
11 @R06704
ขอบคุณครับ มีประโยชน์มากๆ

-----------------------------------------------------------------------
จดโดเมน เว็บโฮสติ้งhttp://www.hostingjidee.com
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2842s