กระทู้เก่าบอร์ด อ.Yeadram
        
           1,671   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.0650s
    
      
		
checkbox ทั้ง 31 อัน เลือกได้แค่ 1 หรือเปล่าครับ