ข้ามไปที่เนื้อหาหลัก

Storage many Boolean data in single binary form [Database]



การจัดเก็บข้อมูล แบบ Boolean (True/False) ในรูปแบบเลขฐานสอง

พอดีว่าได้ทำโปรเจคฐานข้อมูลใหม่ และในรูปแบบข้อมูลมีการใช Checkbox เยอะ หากจะทำตาราง Database ให้ Checkbox แต่ละตัว เวลาเขียน code ก็จะยาว และแก้ไขลำบาก ก็เลยหาข้อมูลและมีการบันทึกข้อมูลในลักษณะนี้อยู่

หลักการก็คือ เราจะกำหนดให้แต่ละบิตในเลขฐานสอง แทนด้วย checkbox แต่ละตัว โดย checkbox ที่เป็นกลุ่มข้อมูลเดียวกันก็จะทำเป็น Control array ไว้ เวลาเขียน code จะได้ loop ได้ง่ายหน่อย

เช่น มี Checkbox อยู่ 4 ตัว หากเราต้องการบันทึกข้อมูลว่าทุกตัวมีค่าเป็น True (คลิ๊กเลือก) ก็จะบันทึกข้อมูลไปว่า 15 หรือ 1111 ในเลขฐานสอง (แต่จะบันทึกเป็นเลขฐานสิบนะ)



หรือต้องการคลิ๊กเลือกแค่ Checkbox ที่ 2 กับ 4 ก็จะบันทึกข้อมูลไปว่า 5 หรือ 0101 ในเลขฐานสอง



ขั้นตอนการตรวจสอบ Checkbox เพื่อคำนวนหาเลขที่ต้องบันทึก
1 กำหนดตัวแปรขึ้นมา
2 Loop ตรวจสอบค่าของแต่ละ Checkbox
3 เมื่อค่าเป็น True ให้บวกค่าเข้าตัวแปร ด้วย 2^(เลข Loop ปัจจุบัน -1)
4 เมื่อตรวจสอบจนครบก็จะได้เลขที่เราต้องการ

ตัวอย่าง (ใช้เป็น Excel VBA )
สร้าง Control และตั้งชื่อตามนี้เลย

Code
Private Sub CmdRun_Click()
'ตัวแปรแสดงเลขฐานสอง
Dim BiVal As String
'ตัวแปรเลขฐาน 10
Dim DecVal As Integer

'กำหนดค่าเริ่มต้น
BiVal = vbNullString
DecVal = 0

'Loop ตรวจสอบ
For i = 1 To 7
If UserForm1.Controls("CheckBox" & i).Value Then
DecVal = DecVal + (2 ^ (i - 1))
BiVal = "1" & BiVal
Else
BiVal = "0" & BiVal
End If
Next

'แสดงเลขฐานสองใน Label1
Label3.Caption = BiVal
Label4.Caption = DecVal

End Sub

ผลลัพธ์เมื่อ Run Program

ขั้นตอนการตรวจสอบข้อมูลที่บันทึกไว้ เพื่อใส่ค่าให้แต่ละ Checkbox
1 ดึงค่าที่เราบันทึกไว้เก็บใส่ตัวแปร
2 Loop ตรวจสอบค่าในแต่ละตำแหน่ง
  หลักการในการตรวจสอบ
  ให้นำค่าที่ได้บันทึกไว้ มา AND gate กับ 2^(Loop ปัจจุบัน - 1)
  จากนั้นเอามาหารด้วย 2^(Loop ปัจจุบัน)
  ตัวอย่าง

เมื่อนำมาหารด้วย 4 (2^2) ก็จะได้เท่ากับ 1

3 เมื่อได้ค่าเป็น 1 ให้ Checkbox Array ที่เลข Loop นั้น มีค่าเป็น True
ถ้าได้ค่าเป็น 0 ก็มีค่าเป็น False
4 เมื่อตรวจสอบจนครบ Checkbox ก็จะมีค่าตามที่เราได้บันทึกไว้

ตัวอย่าง (ใช้เป็น Excel VBA )
สร้าง Control และตั้งชื่อตามนี้เลย

Code

Private Sub CmdRun_Click()
'ตัวแปรแสดงเลขฐานสอง
Dim BiVal As String
'กำหนดตัวแปรขึ้นมา เพื่อเก็บค่าที่บันทึกไว้ มาคำนวน
Dim DecVal As Integer
DecVal = Val(TextBox1.Text)

BiVal = vbNullString

'Loop ตรวจสอบ
For i = 1 To 7
If (DecVal And (2 ^ (i - 1))) / (2 ^ (i - 1)) = 1 Then
UserForm1.Controls("CheckBox" & i).Value = True  'Excel VBA สร้าง Control Array ไม่ได้ เลยใช้แบบนี้แทน
Else
UserForm1.Controls("CheckBox" & i).Value = False
End If
BiVal = CStr((DecVal And (2 ^ (i - 1))) / (2 ^ (i - 1))) & BiVal 'เก็บค่าเลขฐานสอง ไว้แสดงผล
Next

'แสดงเลขฐานสองใน Label3
Label3.Caption = BiVal

End Sub



ผลลัพธ์เมื่อ Run program

ก็ต้องเอาไปลองประยุกต์ใช้กันดูครับ

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

Make BIG checkbox in Excel

ทำ Checkbox ขนาดใหญ่ใน Excel ในบางครั้งเมื่อเราต้องการทำฟอร์มเอกสารให้คนอื่นกรอก ก็มักจะมีตัว Checkbox เพื่อให้คลิ๊กเลือกในรายการที่เรากำหนดไว้ โดยจะเพิ่มจากตัว ActiveX control ที่มีอยู่แล้วใน Excel แต่ปัญหาคือเจ้าตัว checkbox นี้มันปรับขนาดไม่ได้ พอเราปรับขนาดหน้าจอเล็กลง เจ้าตัว checkbox นี่ก็จะเล็กลงตาม ทำให้ความไฮโซของแบบฟอร์มลดลงไป

เทคนิคการสร้าง Folder ลับ (การซ่อน Folder) 2

เทคนิคการสร้าง Folder ลับ (การซ่อน Folder) 2 วันนี้ก็จะเอาเทคนิคการซ่อน Folder มาฝากกันเพิ่มเติมนะครับ จะต่างจากในบทความแรก https://lazedev.blogspot.com/2016/03/folder-folder.html ซึ่งเป็นการเก็บแบบ System file ธรรมดา โดยคราวนี้จะเพิ่มความสามารถให้ Folder ที่เราซ่อนไว้ให้เข้ายากขึ้นไปอีกนิด (ซ่อนได้เนียนขึ้น) นะครับ มาดูขั้นตอนกันเลย

เอา Password Excel VBA ออก

พอดีว่ากำลังทำโปรเจ็คฐานข้อมูลเกี่ยวกับ Excel VBA แต่ทำ ๆ ไปดันลืม พาสเวิดที่ตัวเองใส่ไว้ซะงั้น เลยต้องลำบากลำบนไปค้นหาวิธีการเอาพาสเวิดนั้นออก ดูไปแล้วก็พอมีวิธีอยู่ ก็เลยทำเป็นบทความเก็บไว้ดีกว่า มาดูกันเลย **เป็นการเอารหัสของ VBA ใน Excel ออกนะครับ ไม่ใช่รหัสของ Excel