กระทู้เก่าบอร์ด อ.Yeadram
1,845 11
URL.หัวข้อ /
URL
เขียน vba ให้จัดกลุ่มตามลำดับที่ กลุ่มละเท่าๆกัน
เรียนอาจารย์ทุกท่านครับ
สมมุติว่าผมมีข้อมูล จำนวนนักเรียน 550 คน ต้องการจัดกลุ่มนักเรียน(โดยดูข้อมูลตาม rank) กลุ่มละ 40 คน กลุ่มสุดท้ายจะเหลือกี่คนก็ได้ ขอให้กลุ่มแรกๆ มี 40 คน เท่านั้น โดยมีข้อมูลดังต่อไปนี้ครับ
id math rank gmath
1001 200 1
1003 190 2
1002 190 2
1008 180 4
........ ..... ......
1106 120 39
1007 110 40
1005 110 40
1004 110 40
1010 100 41
1015 100 41
.......... ..... ..... ไปเรื่อยๆ
1110 50 80
1115 50 80
1109 49 81
....... ....... ...... ไปเรื่อยๆ
ผลลัพธ์ที่ได้ สร้างคำสั่ง vba ให้เขียนข้อมูล ลงใน gmath ดังนี้ครับ
id math rank gmath
1001 200 1 1
1003 190 2 1
1002 190 2 1
1008 180 4 1
........ ..... ......
1106 120 39 1
1007 110 40 1
1005 110 40 2 (ต้องเป็นกลุ่ม 2 เพราะจัดกลุ่มละ 40 คนเท่านั้น)
1004 110 40 2
1010 100 41 2
1015 100 41 2
.......... ..... ..... ไปเรื่อยๆ
1110 50 80 2
1115 50 80 3
1109 49 81 3 (ต้องเป็นกลุ่ม 3 เพราะจัดกลุ่มละ 40 คนเท่านั้น)
จนได้ กลุ่มสุดท้าย คือกลุ่มที่ 14 ซึ่งจะเหลือเพียง 30 คนครับ
ขอบคุณอาจารย์ทุกท่านครับ
สมมุติว่าผมมีข้อมูล จำนวนนักเรียน 550 คน ต้องการจัดกลุ่มนักเรียน(โดยดูข้อมูลตาม rank) กลุ่มละ 40 คน กลุ่มสุดท้ายจะเหลือกี่คนก็ได้ ขอให้กลุ่มแรกๆ มี 40 คน เท่านั้น โดยมีข้อมูลดังต่อไปนี้ครับ
id math rank gmath
1001 200 1
1003 190 2
1002 190 2
1008 180 4
........ ..... ......
1106 120 39
1007 110 40
1005 110 40
1004 110 40
1010 100 41
1015 100 41
.......... ..... ..... ไปเรื่อยๆ
1110 50 80
1115 50 80
1109 49 81
....... ....... ...... ไปเรื่อยๆ
ผลลัพธ์ที่ได้ สร้างคำสั่ง vba ให้เขียนข้อมูล ลงใน gmath ดังนี้ครับ
id math rank gmath
1001 200 1 1
1003 190 2 1
1002 190 2 1
1008 180 4 1
........ ..... ......
1106 120 39 1
1007 110 40 1
1005 110 40 2 (ต้องเป็นกลุ่ม 2 เพราะจัดกลุ่มละ 40 คนเท่านั้น)
1004 110 40 2
1010 100 41 2
1015 100 41 2
.......... ..... ..... ไปเรื่อยๆ
1110 50 80 2
1115 50 80 3
1109 49 81 3 (ต้องเป็นกลุ่ม 3 เพราะจัดกลุ่มละ 40 คนเท่านั้น)
จนได้ กลุ่มสุดท้าย คือกลุ่มที่ 14 ซึ่งจะเหลือเพียง 30 คนครับ
ขอบคุณอาจารย์ทุกท่านครับ
11 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R23089
ขอบคุณมากครับอาจารย์ TTT ได้ตามความต้องการเลยครับ ทีนี้ ผมจะ update ข้อมูล gmath ให้เข้าไปอยู่ในตาราง ชื่อ m4_Total_student ได้อย่างไรครับ โดยให้ ถ้า id ตรงกัน ก็นำ gmath จาก ตาราง Table_New ไปใส่ใน gmath ของตาราง M4_Total_student
ผมลองใช้แบบนี้ไม่ได้ครับ
Private Sub Command143_Click()
DoCmd.RunSQL "UPDATE M4_Total_student INNER JOIN Table_New ON M4_Total_student.id = Table_New.id SET M4_Total_student.gmath = [Table_New].[gmath] WHERE (((M4_Total_student.id)=[Table_New].[id]));"
End Sub
ผมลองใช้แบบนี้ไม่ได้ครับ
Private Sub Command143_Click()
DoCmd.RunSQL "UPDATE M4_Total_student INNER JOIN Table_New ON M4_Total_student.id = Table_New.id SET M4_Total_student.gmath = [Table_New].[gmath] WHERE (((M4_Total_student.id)=[Table_New].[id]));"
End Sub
3 @R23092
เป็นเพราะอะไรครับอาจารย์
4 @R23099
ผมจะรอคำตอบน๊ะครับอาจารย์ ขอบคุณครับ
5 @R23104
ดูก็น่าจะถูกแล้วนะครับ
ชื่อ M4_Total_student เป็นชื่อ Table นะครับ รู้สึกคำสั่งนี้ไม่รองรับ Query
แล้วที่ว่าไม่ได้มันฟ้องว่าอะไรครับ
แล้วถ้านำ SQL นี้ไปรันในคิวรี่เลย ไม่ต้องมาทำใน VBA ลองแล้วได้ป่าวครับ
ชื่อ M4_Total_student เป็นชื่อ Table นะครับ รู้สึกคำสั่งนี้ไม่รองรับ Query
แล้วที่ว่าไม่ได้มันฟ้องว่าอะไรครับ
แล้วถ้านำ SQL นี้ไปรันในคิวรี่เลย ไม่ต้องมาทำใน VBA ลองแล้วได้ป่าวครับ
6 @R23106
นำ SQL ไปรันในคิวรี่ได้ครับอาจารย์ ปัญหาคืออยาก update ข้อมูลที่ได้ SQL ที่ชื่อ ฟิลด์ gmath เข้าสู่ ตาราง M4_Total_student ชื่อฟิลด์ gmath ครับ
7 @R23108
ก็ข้องใจเหมือนกันนะว่าไม่ได้ตรงไหน ถามคุณว่าที่ว่าไม่ได้นั้นโปรแกรมมันฟ้องว่าอะไรก็ไม่ได้ตอบ ผมเลยลองจำลองการทำมาให้ดูว่ามันไม่เหมือนกับที่คุณทำตรงไหนบ้างครับ
ดู VDO
ดู VDO
8 @R23109
ขอบคุณครับอาจารย์ TTT ผมจะลองทดลองดูใหม่ ตาม VDO แล้วจะกลับมาแจ้งผลครับ
9 @R23110
ได้แล้วครับอาจารย์ ขอบคุณมากครับ ผมไม่รู้ว่าตอนแรกทำผิดตรงไหน เลยลองเริ่มทำตาม VDO เลย
- ขอเรียนถามอาจารย์อีกว่า ถ้าเราจะใช้คำสั่ง สั่งให้รัน ตัว !Query1 นี้ เราจะเขียนคำสั่งว่ายังไงครับ หมายถึง เขียนใส่ตรงจุดไข่ปลาครับ
Private Sub Command143_Click()
.............................................................................
DoCmd.RunSQL "UPDATE M4_Total_student INNER JOIN Table_New ON M4_Total_student.id = Table_New.id SET M4_Total_student.gmath = [Table_New].[gmath] WHERE (((M4_Total_student.id)=[Table_New].[id]));"
End Sub
- ขอเรียนถามอาจารย์อีกว่า ถ้าเราจะใช้คำสั่ง สั่งให้รัน ตัว !Query1 นี้ เราจะเขียนคำสั่งว่ายังไงครับ หมายถึง เขียนใส่ตรงจุดไข่ปลาครับ
Private Sub Command143_Click()
.............................................................................
DoCmd.RunSQL "UPDATE M4_Total_student INNER JOIN Table_New ON M4_Total_student.id = Table_New.id SET M4_Total_student.gmath = [Table_New].[gmath] WHERE (((M4_Total_student.id)=[Table_New].[id]));"
End Sub
10 @R23118
Private Sub Command143_Click()
'DoCmd.SetWarnings False ' ถ้าไม่ต้องการให้แสดงข้อความเตือน ถ้าใช้ต้องระวัง พลาดกดปุ่มครั้งเดียวข้อมูลเปลี่ยน ไม่มีการถามยืนยัน
DoCmd.RunSQL "SELECT a.ID, a.math, a.rank, a.gmath INTO Table_New FROM (SELECT a.ID, a.math, a.rank, ((SELECT Count(1) FROM M4_Total_student AS b WHERE b.Rank < a.Rank OR (b.Rank = a.Rank AND b.ID < a.ID)) \ 40) + 1 AS gmath FROM M4_Total_student AS a ORDER BY a.rank, a.ID) AS a;"
DoCmd.RunSQL "UPDATE M4_Total_student INNER JOIN Table_New ON M4_Total_student.id = Table_New.id SET M4_Total_student.gmath = [Table_New].[gmath] WHERE (((M4_Total_student.id)=[Table_New].[id]));"
'DoCmd.SetWarnings True
DoCmd.DeleteObject acTable, "Table_New" 'หากต้องการลบตาราง Table New หลังจบการทำงาน
End Sub
'DoCmd.SetWarnings False ' ถ้าไม่ต้องการให้แสดงข้อความเตือน ถ้าใช้ต้องระวัง พลาดกดปุ่มครั้งเดียวข้อมูลเปลี่ยน ไม่มีการถามยืนยัน
DoCmd.RunSQL "SELECT a.ID, a.math, a.rank, a.gmath INTO Table_New FROM (SELECT a.ID, a.math, a.rank, ((SELECT Count(1) FROM M4_Total_student AS b WHERE b.Rank < a.Rank OR (b.Rank = a.Rank AND b.ID < a.ID)) \ 40) + 1 AS gmath FROM M4_Total_student AS a ORDER BY a.rank, a.ID) AS a;"
DoCmd.RunSQL "UPDATE M4_Total_student INNER JOIN Table_New ON M4_Total_student.id = Table_New.id SET M4_Total_student.gmath = [Table_New].[gmath] WHERE (((M4_Total_student.id)=[Table_New].[id]));"
'DoCmd.SetWarnings True
DoCmd.DeleteObject acTable, "Table_New" 'หากต้องการลบตาราง Table New หลังจบการทำงาน
End Sub
11 @R23121
ขอบคุณครับ
Time: 0.3245s
SELECT a.ID, a.math, a.rank, a.gmath INTO Table_New
FROM (SELECT a.ID, a.math, a.rank, ((SELECT Count(1) FROM Table1 AS b WHERE b.Rank < a.Rank OR (b.Rank = a.Rank AND b.ID < a.ID)) \ 40) + 1 AS gmath
FROM Table1 AS a
ORDER BY a.rank, a.ID) AS a;
จากนั้นไปที่เมนู DESIGN > !RUN
จะได้ตารางใหม่ชื่อ Table_New ดูว่าตรงตามความต้องการป่าวครับ