เขียน vba ให้จัดกลุ่มตามลำดับที่ กลุ่มละเท่าๆกัน
กระทู้เก่าบอร์ด อ.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 คนครับ
ขอบคุณอาจารย์ทุกท่านครับ

11 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R23087
ลองเขียน SQL แบบนี้ดูครับ สมมุติตารางชื่อ Table1

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 ดูว่าตรงตามความต้องการป่าวครับ
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
3 @R23092
เป็นเพราะอะไรครับอาจารย์
4 @R23099
ผมจะรอคำตอบน๊ะครับอาจารย์ ขอบคุณครับ
5 @R23104
ดูก็น่าจะถูกแล้วนะครับ
ชื่อ M4_Total_student เป็นชื่อ Table นะครับ รู้สึกคำสั่งนี้ไม่รองรับ Query
แล้วที่ว่าไม่ได้มันฟ้องว่าอะไรครับ
แล้วถ้านำ SQL นี้ไปรันในคิวรี่เลย ไม่ต้องมาทำใน VBA ลองแล้วได้ป่าวครับ
6 @R23106
นำ SQL ไปรันในคิวรี่ได้ครับอาจารย์ ปัญหาคืออยาก update ข้อมูลที่ได้ SQL ที่ชื่อ ฟิลด์ gmath เข้าสู่ ตาราง M4_Total_student ชื่อฟิลด์ gmath ครับ
7 @R23108
ก็ข้องใจเหมือนกันนะว่าไม่ได้ตรงไหน ถามคุณว่าที่ว่าไม่ได้นั้นโปรแกรมมันฟ้องว่าอะไรก็ไม่ได้ตอบ ผมเลยลองจำลองการทำมาให้ดูว่ามันไม่เหมือนกับที่คุณทำตรงไหนบ้างครับ
ดู 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
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
11 @R23121
ขอบคุณครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3245s