Page 1 of 2
VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Mon Aug 11, 2014 9:42 pm
by aueijung

ถ้าหากเราต้องการจะดึงข้อมูลของนักเรียน 2 คนให้มาอยู่ในกระดาษหน้าเดียว เช่น เลขที่ 1,2 อยู่ในหน้าที่ 1 ส่วนเลขที่ 3,4 อยู่ในหน้าที่ 2 ประเด็นคือต้องการประหยัดกระดาษเวลาปริ้น เราจะต้องแก้ตรงส่วนไหนครับอาจารย์
ผลลัพธ์ที่ต้องการ
pic_resize.png
ไฟล์แนบที่มีปัญหา
รายงานผลการเรียน.xlsm
อีกอย่างครับ คือถ้าเราต้องการดึง ชื่อรายวิชาในชีท "คะแนนสอบกลางภาค" โดยจับชื่อวิชาที่เรียงอันดับรายวิชา 1 2 3 4 4.1 . . . 16 มาเทียบกับชื่อวิชาที่ตำแหน่ง ที่ ในชีท
"รายงานผลการเรียน-Miterm" เพื่อจะวางข้อมูลชื่อรายวิชา คะแนนเต็ม และคะแนนที่ได้ ตามโครงสร้างของของแบบฟอร์ม พื้นที่สีเขียว และสีเหลือง เราจะต้องทำอย่างไรครับอาจารย์

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Tue Aug 12, 2014 6:56 am
by snasui

ตัวอย่างสูตรที่ B7, E7, F7 ตามด้านล่างครับ
Code: Select all
B7 =INDEX(คะแนนสอบกลางภาค!$G$4:$W$4,MATCH($A7,คะแนนสอบกลางภาค!$G$3:$W$3,0))
E7 =INDEX(คะแนนสอบกลางภาค!$G$6:$W$6,MATCH($A7,คะแนนสอบกลางภาค!$G$3:$W$3,0))
F7 =INDEX(คะแนนสอบกลางภาค!$G$7:$W$21,MATCH($F$4,คะแนนสอบกลางภาค!$B$7:$B$21,0),MATCH($A7,คะแนนสอบกลางภาค!$G$3:$W$3,0))
จากนั้น Copy B7, E7, F7 ลงด้านล่างครับ
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Tue Aug 12, 2014 10:49 am
by aueijung

ใช้ได้ดีมากครับอาจารย์
อาจารย์ครับ ผมสั่งปริ้นโดยกำหนดการพิมพ์เป็นช่วง ที่ชีท รายงานผลการเรียน-Miterm โดยการกรอกเลขที่เริ่มต้น และเลขที่สิ้นสุด กดปุ๋มพิมพ์ มันจะไปดึงเอาข้อมูลคะแนนจากชีท คะแนนสอบกลางภาค มาโชว์พรีวิวก่อนปริ้น ที่โค๊ด VBA ต้องปรับอย่างไรให้ ที่ชีท รายงานผลการเรียน-Miterm คอลัมภ์ A:F เป็นข้อมูลของนักเรียนเลขที่ คี่ และคอลัมภ์ I:N เป็นข้อมูลของนักเรียนหมายเลข คู่ วนรอบจนครบทุกคนเวลาปริ้นเอกสารออกมา แค่กดปุ่มปริ้นครั้งเดียวครับ
หรือมีวิธีให้โค๊ด VBA สั้นกว่านี้หรือไม่ครับ เพราะสูตรที่ทำยาวเกินไปครับ
ได้แนบโค๊ด VBA มาให้อาจารย์พิจารณาดูแล้วครับ
รายงานผลการเรียน.xlsm
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Tue Aug 12, 2014 11:22 am
by snasui

คอลัมน์ F และ N ผมทำสูตรไว้ให้แล้ว ไม่จำเป็นต้องดึงข้อมูลมาด้วย VBA
จากไฟล์แนบ ควรกรอกเฉพาะเลขที่ก็เพียงพอ เซลล์อื่น ๆ สามารถดึงมาได้ด้วยสูตร
ค่าที่จะกรอกคือ F4 และ N4 โดยดูเฉพาะค่าเริมต้นและค่าสิ้นสุดเป็นหลัก
ตัวอย่างการ Loop ตามด้านล่างครับ
Code: Select all
Sub test()
Dim iStart%, iStop%, i%
With ActiveSheet
iStart = .Range("q18")
iStop = .Range("q20")
For i = iStart To iStop Step 2
.Range("f4") = i
.Range("n4") = IIf(iStop >= i + 1, i + 1, "")
Next i
End With
End Sub
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Tue Aug 12, 2014 12:07 pm
by aueijung

ได้ผลลัพธ์ตามที่ต้องการปรับอีกนิดเดียว อาจารย์สุดยอดมากเก่งมากครับ ว่าแต่อาจารย์ได้เขียนหนังสือออกมาตามท้องตลาดหรือยังครับ ถ้ามีที่อาจารย์เขียนไว้ผมจะไปหาซื้อมาอ่าน แล้วก็อาจจะซื้อเข้าห้องสมุดโรงเรียน ถ้าอาจารย์เขียนหนังสือยังไงผมจะติดตามเรื่อยๆ นะครับอาจารย์ ขอบพระคุณมากครับ
Code: Select all
Sub ReportMiterm_Click()
Dim iStart%, iStop%, i%
With ActiveSheet
iStart = .Range("Q18")
iStop = .Range("Q20")
For i = iStart To iStop Step 2
.Range("F4") = i
.Range("N4") = IIf(iStop >= i + 1, i + 1, "")
If Sheets("รายงานผลการเรียน-Miterm").Range("Q22") = "พิมพ์ทันที Then
Sheets("รายงานผลการเรียน-Miterm").PrintOut
Else
Sheets("รายงานผลการเรียน-Miterm").PrintOut Preview:=True
End If
Next i
End With
End Sub
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Tue Aug 12, 2014 1:25 pm
by snasui

ผมเขียน
บทความและ
ตอบปัญหาเท่านั้นครับ สำหรับหนังสือคิดว่าให้ท่านอื่น ๆ เขียนไปตามสะดวก ส่วนผู้อ่านและผู้ใช้งาน Excel หากทำตามหนังสือแล้วไม่ได้คำตอบสามารถยกมาถามกันได้ครับ
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Tue Aug 12, 2014 1:47 pm
by aueijung

ขอบคุณครับอาจารย์

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Thu Mar 19, 2015 9:24 pm
by aueijung

จะมองอย่างไรให้ เซลล์ G4 เป็นค่าของชีท รายงานผลการเรียน-Miterm เซลล์ F25
โดยจับคู่กับเลขที่เซลล์ B4 และชีทเกรดเฉลี่ย เซลล์ G4 จะเปลี่ยนไปเรื่อยๆ เมื่อเปลี่ยนเลขที่ ที่เซลล์ B4 ครับอาจารย์
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Fri Mar 20, 2015 1:32 am
by snasui

เซลล์ G4 คีย์สูตรตามด้านล่างครับ
=LOOKUP(9.99999999999999E+307,INDEX('รายงานผลการเรียน-Miterm'!A:N,0,MATCH(B4,'รายงานผลการเรียน-Miterm'!$A$4:$N$4,0)))
Enter
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Fri Mar 20, 2015 7:59 am
by aueijung

เซลล์ G6 ถึงเซลล์ G55 ที่ชีท เกรดเฉลี่ย ไม่แสดงข้อมูลเลยครับเลยครับอาจารย์
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Fri Mar 20, 2015 2:24 pm
by snasui

ตามที่ถามเป็นการนำมาแสดงได้ทีละ 2 ค่าเท่านั้น
ไม่ทราบว่าส่วนที่ต้องการให้แสดงในเซลล์ต่อจากนั้น นำค่ามาจากไหนครับ

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Fri Mar 20, 2015 5:23 pm
by aueijung
ค่าได้นั้นมาจาก เมื่อเราเปลี่ยน .....อ่อ......ครับอาจารย์เราจะทำอย่างไรให้ได้ข้อมูลของทุกๆ เลขที่ ตั้งแต่ เลขที่ 1 ถึง เลขที่สุดท้าย เมื่อเราเปลี่ยนเลขที่ ที่เซลล์ F4 ชีทรายงานผลการเรียน-Miterm แล้วให้มันเปลี่ยนอัติโนมัติ เพื่อดึงเอาค่า F25 มาใส่ที่เซลล์ G4 ถึง G55 ที่ชีทเกรดเฉลี่ย ให้มันวนรอบนำค่ามาแสดงจนครบทุกเลขที่ กลายเป็นข้อมูลแทนที่เราจะมาทำการเปลี่ยนเลขที่เอง คือให้มันสรุปข้อมูลออกมาจนครบทุกคนครับอาจารย์
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Fri Mar 20, 2015 6:15 pm
by snasui

การให้ได้ค่าทั้งหมดตามตัวอย่างที่แนบมาได้นั้นต้อง Loop ด้วย VBA
ลองเขียนมาเองก่อน ติดตรงไหนค่อยถามกันต่อครับ
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Sat Mar 21, 2015 12:53 am
by aueijung

ชีท เกรดเฉลี่ย เซลล์
G7:G61 แสดงข้อมูลแค่เพียงค่าเดียวเองครับอาจารย์ มันไม่แสดงข้อมูลจนครบทุกคน เราจะแก้ไขอย่างไรครับอาจารย์
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Sat Mar 21, 2015 1:17 am
by snasui

ตัวอย่างการปรับ Code ครับ
Code: Select all
Sub GA_Click()
Dim sheet As Worksheet, j As Integer
Dim iStart%, iStop%, i%
'j = 7
With ActiveSheet
iStart = .Range("Q18")
iStop = .Range("Q20")
For i = iStart To iStop Step 2
.Range("F4") = i
.Range("N4") = IIf(iStop >= i + 1, i + 1, "")
If Sheets("รายงานผลการเรียน-Miterm").Range("Q22") = "พิมพ์ทันที" Then
Sheets("เกรดเฉลี่ย").Range("g" & Rows.Count).End(xlUp).Offset(1, 0).Value = _
Sheets("รายงานผลการเรียน-Miterm").Range("F25")
If Sheets("รายงานผลการเรียน-Miterm").Range("N4").Value <> "" Then
Sheets("เกรดเฉลี่ย").Range("g" & Rows.Count).End(xlUp).Offset(1, 0).Value = _
Sheets("รายงานผลการเรียน-Miterm").Range("N25")
End If
Else
Sheets("รายงานผลการเรียน-Miterm").PrintOut Preview:=True
End If
' Sheets("รายงานผลการเรียน-Miterm").PrintOut Preview:=True
Next i
' Sheets("รายงานผลการเรียน-Miterm").PrintOut Preview:=True
End With
End Sub
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Sat Mar 21, 2015 3:20 pm
by aueijung

ถ้าเราจะให้เซลล์
F4 ที่ชีท
รายงานผลการเรียน-Miterm มันมาเช็คค่ากับเซลล์
B7 ที่ชีท
เกรดเฉลี่ย ว่าถ้าเลขที่เท่ากัน ก็ให้คัดลอกค่าเซลล์
F25 ไปกรอกที่เซลล์
B7 ที่ชีท
เกรดเฉลี่ย แล้วเพิ่มค่า
F4 ที่ชีท
รายงานผลการเรียน-Miterm เปรียบเทียบกับค่ากับเซลล์
B7 ที่ชีทเกรดเฉลี่ย ในลำดับถัดมา ว่าถ้าเลขที่เท่ากัน ก็ให้คัดลอกค่าเซลล์
F25 ไปกรอกที่เซลล์
B8 ที่ชีท เกรดเฉลี่ย วนไปเรื่อยๆ จนถึงเลขที่สุดท้ายที่เป็นค่าตัวเลข ที่แสดงในเซลล์
B7:B61 โดยไม่ต้องไปเช็คกับคำว่า "พิมพ์ทันที" ก็ได้ครับ(มองแต่เฉพาะข้อมูลที่เราจะสรุปเป็นค่าของตัวเลขจากเซลล์ F25 เพื่อเอาไปกรอกเท่านั้นครับ) ถ้าไม่เท่ากันก็ให้หยุดการทำงาน ต้องทำการปรับตรงไหนบ้างครับอาจารย์
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Sat Mar 21, 2015 3:52 pm
by snasui

ตัวอย่าง Code เฉพาะส่วนที่ปรับปรุงครับ
Code: Select all
If Sheets("รายงานผลการเรียน-Miterm").Range("Q22") = "พิมพ์ทันที" Then
Sheets("เกรดเฉลี่ย").Range("g6").Offset(Sheets("รายงานผลการเรียน-Miterm").Range("f4").Value, 0) = _
Sheets("รายงานผลการเรียน-Miterm").Range("F25")
If Sheets("รายงานผลการเรียน-Miterm").Range("N4").Value <> "" Then
Sheets("เกรดเฉลี่ย").Range("g6").Offset(Sheets("รายงานผลการเรียน-Miterm").Range("n4").Value, 0) = _
Sheets("รายงานผลการเรียน-Miterm").Range("N25")
End If
Else
Re: VBA คัดลอกค่าข้อมูลที่เปลี่ยนไปตามเงื่อนไข
Posted: Sat Mar 21, 2015 4:44 pm
by aueijung

หลังการปรับ ก็ยังดึงค่าได้แค่ทีละ 2 ค่า ครับอาจารย์ เราสามารถดึงค่าแบบครบทุกเลขที่ได้หรือไม่ครับอาจารย์ โดยการกดปุ่มเพียงครั้งเดียวครับ
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Sat Mar 21, 2015 6:18 pm
by snasui

หากมาคลิกปุ่มที่ชีท เกรดเฉลี่ย ต้องเปลี่ยน Code ใหม่จาก
With ActiveSheet
เป็น
With Sheets("รายงานผลการเรียน-Miterm")
ครับ
Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว
Posted: Sat Mar 21, 2015 9:27 pm
by aueijung

อาจารย์ครับใช้ได้ดีมากครับ แต่ว่า พอเรากดปุ่ม พิมพ์ มันจะทำลายสูตร(สูตรหายไปหมดหลังจากกดปุ่มพิม์)ในชีท รายงานผลการเรียน-Miterm เซลล์ F7:F24 และเซลล์ N7:N24 มันเป็นเพราะอะไรหรือครับสูตรถึงหายไปครับอาจารย์ และจากปกติปริ้นตามกำหนดเลขที่ได้มันออกมาหนึ่งหน้ามีเลขที่ทั้ง เซลล์ F4 และเซลล์ N4 (กดปุ่มพิมพ์ออกมา ไม่มี 2 เลขที่เหมือนเดิม ที่เป็นหน้าคู่ เพื่อประหยัดกระดาษ 1 แผ่นต้องมี 2 เลขที่ แต่กลับมีเลขที่เดียวในสองฝั่ง) งงมากๆ ครับตอนนี้