Option Explicit
Sub SetupScreen()
txtRandomNumber.Text = ""
txtCheckDigit.Text = ""
txtIDCard.Text = ""
End Sub
' ########################################################
' คลิ๊กปุ่มเพื่อทำการสุ่มหมายเลขบัตรประชาชน
Private Sub cmdRandom_Click()
' ########################################################
Dim Sum As Integer
Dim Count As Byte
Call SetupScreen
' สุ่มหาตัวเลขมาทั้งหมด 12 หลัก โดยที่หลักแรกต้องไม่ใช่ 0 และ 9 ด้วย
' เรียกไปยังฟังค์ชั่น RandomNumber โดยไม่มีการส่งค่าใดๆไป แต่จะต้องรับค่าที่ได้กลับมา
txtRandomNumber.Text = RandomNumber
' หลักคิดสำหรับ 12 หลักแรก
' เริ่มต้นคำนวณหาค่าผลรวมตัวเลขทั้ง 12 หลักแรก ดังนี้
' หาผลรวมตั้งแต่หลักที่ 1 ไปจนถึงหลักที่ 12 (นับจากซ้ายไปขวา)
' โดยให้หลักที่ 1 คูณด้วยน้ำหนักประจำหลัก = 13
' โดยให้หลักที่ 2 คูณด้วยน้ำหนักประจำหลัก = 12
' โดยให้หลักที่ 3 คูณด้วยน้ำหนักประจำหลัก = 11
' โดยให้หลักที่ .. คูณด้วยน้ำหนักประจำหลัก = ..
' โดยให้หลักที่ 12 คูณด้วยน้ำหนักประจำหลัก = 2
' จากนั้นนำผลการคูณของแต่ละหลักมารวมกันเข้าไป
' หลักแต่ละหลัก คือ Val(Mid$(txtIDcard.Text, Count, 1))
' น้ำหนักของแต่ละหลัก คือ (14 - Count) เมื่อ Count เริ่มต้นจาก 1 ไปสิ้นสุดที่ 12
' ดังนั้นค่านี้ (14 - Count) จึงเริ่มต้นค่าจาก 13, 12, 11, ..., สิ้นสุดที่ 2 ครับผม
Sum = 0 ' Clear ค่าผลรวมก่อน (เพื่อความแน่ใจ)
For Count = 1 To 12
Sum = Sum + Val(Mid$(txtRandomNumber.Text, Count, 1)) * (14 - Count)
Next
' ########################################################
' ขั้นตอนนี้ คือ การหาค่า Check Digit หรือ หลักตรวจสอบความถูกต้อง
' นำผลรวมที่ได้ (Sum) มา Mod (การหารเอาเศษ) ด้วย 11 นั่นคือค่าที่เราจะได้ก็คือ 0, 1, 2, .. , 10 (Sum Mod 11)
' จากนั้นให้ลบออกด้วย 11 ก็จะทำให้ได้ค่าตั้งแต่ 1, 2, 3, ... , 11 (11 - (Sum Mod 11))
' แล้วให้เลือกตัวขวามือสุดมาหนึ่งตัว ด้วยคำสั่ง Right$ --> Right$(Str(11 - Sum Mod 11)), 1)
' ค่าสุดท้ายนี้ก็คือ หลักที่ 13 หรือ หลักตรวจสอบความถูกต้อง (Check Digit) นั่นเอง
'
txtCheckDigit.Text = Right$(Str(11 - (Sum Mod 11)), 1)
'
' ########################################################
' ########################################################
' เอาค่ามาจัดเรียงเพื่อนำไปใช้ในการสมัครเล่นเกมส์ต่อไป ... 55555+
'
txtIDCard.Text = txtRandomNumber.Text & txtCheckDigit.Text
'
' ########################################################
End Sub
' ########################################################
' ฟังค์ชั่นที่ใช้ในการสุ่มตัวเลขจำนวน 12 หลัก ไม่มีการรับค่า แต่จะต้องส่งค่าคืนกลับไป (Return)
' ดังนั้นเราต้องใช้เป็นแบบฟังค์ชั่น (Function) จะใช้ Sub Program ไม่ได้
'
Function RandomNumber() As String
'
' ########################################################
' เพื่อบ่งบอกว่าหลักแรกหาค่าได้สำเร็จแล้วหรือไม่
Dim blnFlag As Boolean
Dim i As Byte
' เริ่มต้นในการสุ่มตัวเลขก่อน
Randomize
' สูตรการสุ่มตัวเลข เมื่อ High = ค่าสูงสุด และ Low = ค่าต่ำสุด
'RandomNumber = Int((High - Low + 1) * Rnd) + Low
' ตั้งค่าเป็น False ไว้ก่อน
blnFlag = False
' สุ่มเลขจำนวน 12 หลัก โดยที่หลักแรกต้องไม่ใช่ 0 และ 9
' เนื่องจากเราใช้การนับเริ่มต้นจาก 1 ไปสิ้นสุดที่ 12 โดยมีค่าเพิ่มขึ้นทีละ 1 ... เหมาะสมที่จะใช้ For
For i = 1 To 12
' Not False หรือ ไม่จริง ก็คือ เท็จ (หรือเขียน blnFlag = False) ... แสดงว่าตอนนี้เรากำลังจะหาตัวเลขหลักแรกอยู่
If Not blnFlag Then
' สุ่มตัวเลขหลักแรก ต้องไม่ให้มีค่าเป็น 0 และ 9 ... นี่คือการทำซ้ำ หรือ Repetitive
' ใช้การวนรอบ (Loop) แบบ For จะไม่เหมาะสมสำหรับงานนี้ เพราะเราไม่รู้ค่าเริ่มต้น ค่าสิ้นสุด และ ค่าเพิ่ม (หรือลด)
' แต่มันก็นำมาใช้ได้เหมือนกันน่ะครับ เพราะมันมีคำสั่งให้ออกจาก Loop ด้วย Exit For อยู่
Do
' บวก 0 ลบ 0 ไว้เท่ๆ ... อิอิอิอิอิ
RandomNumber = Int((9 - 0 + 1) * Rnd) + 0
' ทำจนกว่าหลักแรกต้องไม่เท่ากับ 0 และ 9 (เงื่อนไขต้องใช้ AND)
' เช่น เมื่อ RandomNumber มีค่า = 1
' ทำให้ได้เงื่อนไข 1 <> 0 และ 1 <> 9 (True AND True = True) ... เงื่อนไขเป็น "จริง" ให้ออกจาก Loop
' หรือ เมื่อ RandomNumber มีค่า = 9
' ทำให้ได้เงื่อนไข 9 <> 0 และ 9 <> 9 (True AND False = False) ... เงื่อนไขเป็น "เท็จ" ให้วน Loop ต่อไป
Loop Until RandomNumber <> 0 And RandomNumber <> 9
' หรือ ใช้เงื่อนไข Until แต่กลับกันด้วย Not ... คนที่เขียนแบบนี้ส่วนใหญ่จะเป็นพวกระดับอาชีพครับ ... เชื่อมั้ย
'Loop Until Not RandomNumber = 0 And Not RandomNumber = 9
' หรือใช้ While แต่เงื่อนไขต้องกลับกันกับแบบ Until และต้องใช้ OR แทนที่
' เช่น เมื่อ RandomNumber มีค่า = 1
' ทำให้ได้เงื่อนไข 1 = 0 หรือ 1 = 9 (False OR False = False) ... เงื่อนไขเป็น "เท็จ" ให้ออกจาก Loop
' หรือ เมื่อ RandomNumber มีค่า = 9
' ทำให้ได้เงื่อนไข 9 = 0 หรือ 9 = 9 (False OR True = True) ... เงื่อนไขเป็น "จริง" ให้วน Loop ต่อไป
'Loop While RandomNumber = 0 Or RandomNumber = 9
' แจ้งว่าหลักแรกหาตัวเลขที่ไม่ใช่ 0 หรือ 9 เสร็จสมบูรณ์แล้ว หลักต่อไปจะได้ไม่ต้องเข้าไป Do Loop อีก
blnFlag = True
End If
' หาค่าจำนวนหลักที่เหลือ แล้วส่งค่าคืนกลับของฟังค์ชั่นไปได้เลย
RandomNumber = RandomNumber & Int((9 - 0 + 1) * Rnd) + 0
Next
End Function
Private Sub Form_Load()
' ป้องกันการเรียกโปรแกรมซ้ำ
If App.PrevInstance Then End
' ตั้งฟอร์มอยู่กึ่งกลางจอภาพ
Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
Call SetupScreen
End Sub
|