กระทู้เก่าบอร์ด อ.Yeadram
1,506 5
URL.หัวข้อ /
URL
เขียนโค้ดให้สั้นยังไงครับ
เขียนโค้ดให้สั้นยังไงครับ
SubForm มี
1.textbox 1 ชื่อ npid
2.checkbox 31 ชื่อ Ctl1 - Ctl31
ต้องเขียน โค้ด 31 ชุด ดังตัวอย่าง
คืออยากห้สั้นโค้ดสั้นกว่านี้ต้องเขียนยังไงครับ
ขอบคุณครับ
Private Sub Ctl1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Forms.main.Combo_np.Value = Me.npid
Forms.main.d.Value = Me.Ctl1.DefaultValue
End Sub
.
.
.
Private Sub Ctl31_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Forms.main.Combo_np.Value = Me.npid
Forms.main.d.Value = Me.Ctl31.DefaultValue
End Sub
SubForm มี
1.textbox 1 ชื่อ npid
2.checkbox 31 ชื่อ Ctl1 - Ctl31
ต้องเขียน โค้ด 31 ชุด ดังตัวอย่าง
คืออยากห้สั้นโค้ดสั้นกว่านี้ต้องเขียนยังไงครับ
ขอบคุณครับ
Private Sub Ctl1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Forms.main.Combo_np.Value = Me.npid
Forms.main.d.Value = Me.Ctl1.DefaultValue
End Sub
.
.
.
Private Sub Ctl31_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Forms.main.Combo_np.Value = Me.npid
Forms.main.d.Value = Me.Ctl31.DefaultValue
End Sub
5 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R03385
- ที่ Access เปิด subform ในมุมมองออกแบบเอาไว้
- ที่ VBA เขียนโค้ดในฟอร์ม (subform) ว่า
- ไปสร้างโมดูลเปล่าๆ มาตัวนึง ยังไม่ต้องเซฟ
เอาฟังก์ชั่นนี่ วางลงไป ยังไม่ต้องเซฟ
- ระบุชื่อของ subform ในจุดที่ให้ระบุ
- กด ปุ่ม F5 บนแป้นคีย์บอร์ด
- ถ้าไม่ error ใดๆ ลบโมดูลใหม่ตัวนี้ทิ้งได้เลย จบงานแล้ว
- กลับไปที่ Access
- ที่ไดอะล็อกซ์ "คุณสมบัติ" ให้ตรวจสอบดูว่า ในเหตุการณ์ on mousedown ของแต่ละ checkbox มีตัวหนังสือเขียนลงไปถูกต้องแล้วหรือไม่ ถ้าถูกต้องครบถ้วน ให้เซฟและปิด subform ได้เลย
- ทดสอบการทำงานได้ตามปกติครับ
สรุปคือ ในฟอร์มย่อยของคุณ จะเหลือโค้ดแค่ 4 บรรทัด (รวม หัว-ท้าย โพรซีเยอร์)
- ที่ VBA เขียนโค้ดในฟอร์ม (subform) ว่า
Function MD(ctlN As String)
Forms.main.Combo_np.Value = Me.npid
Forms.main.d.Value = Me(ctlN).DefaultValue
End Function
- ไปสร้างโมดูลเปล่าๆ มาตัวนึง ยังไม่ต้องเซฟ
เอาฟังก์ชั่นนี่ วางลงไป ยังไม่ต้องเซฟ
Sub xx()
Dim ctl As Control
For Each ctl In Forms("... ใส่ชื่อของ subform....").Controls
If TypeOf ctl Is CheckBox Then ctl.OnMouseDown = "=MD(" & Chr(34) & ctl.Name & Chr(34) & ")"
Next
End Sub
- ระบุชื่อของ subform ในจุดที่ให้ระบุ
- กด ปุ่ม F5 บนแป้นคีย์บอร์ด
- ถ้าไม่ error ใดๆ ลบโมดูลใหม่ตัวนี้ทิ้งได้เลย จบงานแล้ว
- กลับไปที่ Access
- ที่ไดอะล็อกซ์ "คุณสมบัติ" ให้ตรวจสอบดูว่า ในเหตุการณ์ on mousedown ของแต่ละ checkbox มีตัวหนังสือเขียนลงไปถูกต้องแล้วหรือไม่ ถ้าถูกต้องครบถ้วน ให้เซฟและปิด subform ได้เลย
- ทดสอบการทำงานได้ตามปกติครับ
สรุปคือ ในฟอร์มย่อยของคุณ จะเหลือโค้ดแค่ 4 บรรทัด (รวม หัว-ท้าย โพรซีเยอร์)
3 @R03389
เมื่อวานไม่มีเวลาดูเลยครับ
ตอบคุณอนุชิต ครับ
เลือกได้ทั้ง 31 ตัวครับ เป็นตัวแทนวันที่ในแต่ละเดือนครับ
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
ตอบคุณ yeadram ครับ
มี error ครับ
และสงสัยว่าบรรทัดนี้ คือยังไงครับ
- ที่ไดอะล็อกซ์ "คุณสมบัติ" ให้ตรวจสอบดูว่า ในเหตุการณ์ on mousedown ของแต่ละ checkbox มีตัวหนังสือเขียนลงไปถูกต้องแล้วหรือไม่ ถ้าถูกต้องครบถ้วน ให้เซฟและปิด subform ได้เลย
ผมตรวจสอบดู ในเหตุการณ์ on mousedown ก็ว่างเปล่าครับ ไม่มีอะไร
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
ขอบคุณครับ
ตอบคุณอนุชิต ครับ
เลือกได้ทั้ง 31 ตัวครับ เป็นตัวแทนวันที่ในแต่ละเดือนครับ
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
ตอบคุณ yeadram ครับ
มี error ครับ
และสงสัยว่าบรรทัดนี้ คือยังไงครับ
- ที่ไดอะล็อกซ์ "คุณสมบัติ" ให้ตรวจสอบดูว่า ในเหตุการณ์ on mousedown ของแต่ละ checkbox มีตัวหนังสือเขียนลงไปถูกต้องแล้วหรือไม่ ถ้าถูกต้องครบถ้วน ให้เซฟและปิด subform ได้เลย
ผมตรวจสอบดู ในเหตุการณ์ on mousedown ก็ว่างเปล่าครับ ไม่มีอะไร
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
ขอบคุณครับ
4 @R03391
ตามที่ผมเข้าใจ (ไม่รู้ว่าเข้าใจผิดหรือเปล่า)
คุณมี Checkbox อยู่ 31 ตัว เวลาเลือกที่ checkbox(1-31) ก็จะส่งค่าไปยัง control ชื่อ d นั่นก็หมายความว่าถึงแม้ว่าคุณจะเลือก 2 checkbox หรือมากกว่านั้น , control ชื่อ d ก็จะรับค่าจาก checkbox ตัวที่เลือกครั้งหลังสุดตลอด ใช่หรือไม่
ถ้าใช่ ก็สามารถใช้ option group เข้ามาช่วยก็ได้ ซึ่งภายใต้ option group ก็ประกอบด้วย checkbox ทั้ง 31 ตัว
หลังจากนั้นคุณก็เขียนคำสั่งที่ option group แทน ก็จะได้ชุดคำสั่งประมาณ 4 บรรทัด ครับ
ปล. ถ้าผมเข้าใจความหมายของคุณผิดต้องขออภัยด้วยครับ
คุณมี Checkbox อยู่ 31 ตัว เวลาเลือกที่ checkbox(1-31) ก็จะส่งค่าไปยัง control ชื่อ d นั่นก็หมายความว่าถึงแม้ว่าคุณจะเลือก 2 checkbox หรือมากกว่านั้น , control ชื่อ d ก็จะรับค่าจาก checkbox ตัวที่เลือกครั้งหลังสุดตลอด ใช่หรือไม่
ถ้าใช่ ก็สามารถใช้ option group เข้ามาช่วยก็ได้ ซึ่งภายใต้ option group ก็ประกอบด้วย checkbox ทั้ง 31 ตัว
หลังจากนั้นคุณก็เขียนคำสั่งที่ option group แทน ก็จะได้ชุดคำสั่งประมาณ 4 บรรทัด ครับ
ปล. ถ้าผมเข้าใจความหมายของคุณผิดต้องขออภัยด้วยครับ
5 @R03392
ชื่อฟอร์มของคุณ ตั้งชื่อผิดหลักครับ ก็เลยมีปัญหาเวลาเขียนโค้ด
มันมีช่องว่างภายในชื่อ
ลองใส่ blanket เพิ่มเข้าไป ดูครับ แล้วรันใหม่
Forms("[detail subform]")
หรือลองเปลี่ยนชื่อฟอร์มให้เขียนติดกันไปก่อน รัน sub xx() ผ่านแล้วก็เซฟฟอร์ม แล้วค่อยเปลี่ยนชื่อกลับคืนดังเดิม
--------------------------
ถ้า sub xx() รันไม่ผ่าน
ยังไม่ต้องไปตรวจที่ access ครับ ไม่เห็นอะไรแน่นอน
sub xx() เป็นแค่ตัวช่วยให้คุณง่ายขึ้นครับ
--------------------------
ถ้า sub xx() ยังมีปัญหาอีก ให้คุณใช้วิธีแมน่วล ก็ได้ครับ (ลืม sub xx() ไปได้เลย)
ที่เหตุการณ์ on mousedown ของทุก checkbox ให้คุณเขียนว่า
=MD("ชื่อของcheckboxตัวนั้นๆ")
เช่น
=MD("ctl1")
=MD("ctl31")
มันมีช่องว่างภายในชื่อ
ลองใส่ blanket เพิ่มเข้าไป ดูครับ แล้วรันใหม่
Forms("[detail subform]")
หรือลองเปลี่ยนชื่อฟอร์มให้เขียนติดกันไปก่อน รัน sub xx() ผ่านแล้วก็เซฟฟอร์ม แล้วค่อยเปลี่ยนชื่อกลับคืนดังเดิม
--------------------------
ถ้า sub xx() รันไม่ผ่าน
ยังไม่ต้องไปตรวจที่ access ครับ ไม่เห็นอะไรแน่นอน
sub xx() เป็นแค่ตัวช่วยให้คุณง่ายขึ้นครับ
--------------------------
ถ้า sub xx() ยังมีปัญหาอีก ให้คุณใช้วิธีแมน่วล ก็ได้ครับ (ลืม sub xx() ไปได้เลย)
ที่เหตุการณ์ on mousedown ของทุก checkbox ให้คุณเขียนว่า
=MD("ชื่อของcheckboxตัวนั้นๆ")
เช่น
=MD("ctl1")
=MD("ctl31")
Time: 0.3162s
checkbox ทั้ง 31 อัน เลือกได้แค่ 1 หรือเปล่าครับ