:D snasui.com ยินดีต้อนรับ :D
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย :thup: สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ :arrow: ระบุ Version ของ Excel
:!: โปรดทราบ :!:
  1. กรุณาอ่านกฎการใช้บอร์ด (Forum rules) ในตำแหน่งด้านบนของแต่ละบอร์ด
  2. การสมัครสมาชิก การ Login การกู้คืนรหัสผ่าน
    1. สมัครสมาชิกดูขั้นตอนได้ที่ :arrow: สมัครสมาชิก
    2. Login เข้าระบบโดยคลิกปุ่ม Login ตรงมุมขวาบนของหน้านี้ :roll:
    3. การ Login ผ่าน Facebook ดูวิธีที่ :arrow: Login ผ่าน Facebook
    4. ลืมรหัสผ่านสามารถรับรหัสใหม่ได้ที่ :arrow: Reset รหัสผ่าน
  3. มีปัญหาการใช้งาน แจ้งผู้ดูแลระบบได้ที่ :arrow: ติดต่อผู้ดูแลระบบ
  4. กำหนดการตั้งค่าส่วนตัว เช่นตั้งค่าภาษาเป็นไทยหรืออังกฤษดูได้ที่ :arrow: ตั้งค่าส่วนตัว
  5. การตั้งและตอบกระทู้ดูได้ที่ :arrow: วิธีการตั้งและตอบกระทู้
  6. การจัดรูปแบบตัวอักษรด้วย bbcode ในช่องแสดงความคิดเห็นดูได้ที่ :arrow: จัดรูปแบบตัวอักษร
  7. กำหนดขนาดตัวอักษรใน Browser ดูได้ที่ :arrow: กำหนดขนาดตัวอักษรใน Browser
🪷 คำแสดงเจตนา
ขอผลแห่งการให้ความรู้นี้ จงกลับไปยังผู้ที่เป็นเจ้าของเดิม แม้ข้าพเจ้าจะไม่รู้จักท่านก็ตาม ขอให้แสงแห่งปัญญาที่ท่านเคยจุดไว้ ได้กลับไปเติมเต็มชีวิตของท่านอีกครั้ง และขอให้เจตนาของข้าพเจ้าเป็นการคืนความดีอย่างสงบ

VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

ฟอรัมถาม-ตอบปัญหาการใช้งาน Macro และ VBA
Forum rules
  1. ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
  2. ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
  3. กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
  4. กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
  5. กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
  6. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
aueijung
Member
Member
Posts: 109
Joined: Thu May 30, 2013 12:03 am

VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#1

Post by aueijung »

:mrgreen: ถ้าหากเราต้องการจะดึงข้อมูลของนักเรียน 2 คนให้มาอยู่ในกระดาษหน้าเดียว เช่น เลขที่ 1,2 อยู่ในหน้าที่ 1 ส่วนเลขที่ 3,4 อยู่ในหน้าที่ 2 ประเด็นคือต้องการประหยัดกระดาษเวลาปริ้น เราจะต้องแก้ตรงส่วนไหนครับอาจารย์
ผลลัพธ์ที่ต้องการ
pic_resize.png
pic_resize.png (195.42 KiB) Viewed 127 times
ไฟล์แนบที่มีปัญหา อีกอย่างครับ คือถ้าเราต้องการดึง ชื่อรายวิชาในชีท "คะแนนสอบกลางภาค" โดยจับชื่อวิชาที่เรียงอันดับรายวิชา 1 2 3 4 4.1 . . . 16 มาเทียบกับชื่อวิชาที่ตำแหน่ง ที่ ในชีท
"รายงานผลการเรียน-Miterm" เพื่อจะวางข้อมูลชื่อรายวิชา คะแนนเต็ม และคะแนนที่ได้ ตามโครงสร้างของของแบบฟอร์ม พื้นที่สีเขียว และสีเหลือง เราจะต้องทำอย่างไรครับอาจารย์ :mrgreen:
User avatar
snasui
Site Admin
Site Admin
Posts: 31191
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#2

Post by snasui »

:D ตัวอย่างสูตรที่ 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 ลงด้านล่างครับ
aueijung
Member
Member
Posts: 109
Joined: Thu May 30, 2013 12:03 am

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#3

Post by aueijung »

:thup: :thup: :thup: :thup: :thup: ใช้ได้ดีมากครับอาจารย์

อาจารย์ครับ ผมสั่งปริ้นโดยกำหนดการพิมพ์เป็นช่วง ที่ชีท รายงานผลการเรียน-Miterm โดยการกรอกเลขที่เริ่มต้น และเลขที่สิ้นสุด กดปุ๋มพิมพ์ มันจะไปดึงเอาข้อมูลคะแนนจากชีท คะแนนสอบกลางภาค มาโชว์พรีวิวก่อนปริ้น ที่โค๊ด VBA ต้องปรับอย่างไรให้ ที่ชีท รายงานผลการเรียน-Miterm คอลัมภ์ A:F เป็นข้อมูลของนักเรียนเลขที่ คี่ และคอลัมภ์ I:N เป็นข้อมูลของนักเรียนหมายเลข คู่ วนรอบจนครบทุกคนเวลาปริ้นเอกสารออกมา แค่กดปุ่มปริ้นครั้งเดียวครับ

หรือมีวิธีให้โค๊ด VBA สั้นกว่านี้หรือไม่ครับ เพราะสูตรที่ทำยาวเกินไปครับ
ได้แนบโค๊ด VBA มาให้อาจารย์พิจารณาดูแล้วครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 31191
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#4

Post by snasui »

:D คอลัมน์ 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
aueijung
Member
Member
Posts: 109
Joined: Thu May 30, 2013 12:03 am

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#5

Post by aueijung »

:D :thup: :cp: ได้ผลลัพธ์ตามที่ต้องการปรับอีกนิดเดียว อาจารย์สุดยอดมากเก่งมากครับ ว่าแต่อาจารย์ได้เขียนหนังสือออกมาตามท้องตลาดหรือยังครับ ถ้ามีที่อาจารย์เขียนไว้ผมจะไปหาซื้อมาอ่าน แล้วก็อาจจะซื้อเข้าห้องสมุดโรงเรียน ถ้าอาจารย์เขียนหนังสือยังไงผมจะติดตามเรื่อยๆ นะครับอาจารย์ ขอบพระคุณมากครับ

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
User avatar
snasui
Site Admin
Site Admin
Posts: 31191
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#6

Post by snasui »

:D ผมเขียนบทความและตอบปัญหาเท่านั้นครับ สำหรับหนังสือคิดว่าให้ท่านอื่น ๆ เขียนไปตามสะดวก ส่วนผู้อ่านและผู้ใช้งาน Excel หากทำตามหนังสือแล้วไม่ได้คำตอบสามารถยกมาถามกันได้ครับ
aueijung
Member
Member
Posts: 109
Joined: Thu May 30, 2013 12:03 am

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#7

Post by aueijung »

:thup: ขอบคุณครับอาจารย์ :D
aueijung
Member
Member
Posts: 109
Joined: Thu May 30, 2013 12:03 am

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#8

Post by aueijung »

:mrgreen: จะมองอย่างไรให้ เซลล์ G4 เป็นค่าของชีท รายงานผลการเรียน-Miterm เซลล์ F25
โดยจับคู่กับเลขที่เซลล์ B4 และชีทเกรดเฉลี่ย เซลล์ G4 จะเปลี่ยนไปเรื่อยๆ เมื่อเปลี่ยนเลขที่ ที่เซลล์ B4 ครับอาจารย์
Attachments
AVG.xlsm
(76.75 KiB) Downloaded 8 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31191
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#9

Post by snasui »

:D เซลล์ G4 คีย์สูตรตามด้านล่างครับ

=LOOKUP(9.99999999999999E+307,INDEX('รายงานผลการเรียน-Miterm'!A:N,0,MATCH(B4,'รายงานผลการเรียน-Miterm'!$A$4:$N$4,0)))

Enter
aueijung
Member
Member
Posts: 109
Joined: Thu May 30, 2013 12:03 am

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#10

Post by aueijung »

:mrgreen: เซลล์ G6 ถึงเซลล์ G55 ที่ชีท เกรดเฉลี่ย ไม่แสดงข้อมูลเลยครับเลยครับอาจารย์
Attachments
AVG.xlsm
(81.68 KiB) Downloaded 7 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31191
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#11

Post by snasui »

:D ตามที่ถามเป็นการนำมาแสดงได้ทีละ 2 ค่าเท่านั้น

ไม่ทราบว่าส่วนที่ต้องการให้แสดงในเซลล์ต่อจากนั้น นำค่ามาจากไหนครับ :?:
aueijung
Member
Member
Posts: 109
Joined: Thu May 30, 2013 12:03 am

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#12

Post by aueijung »

ค่าได้นั้นมาจาก เมื่อเราเปลี่ยน .....อ่อ......ครับอาจารย์เราจะทำอย่างไรให้ได้ข้อมูลของทุกๆ เลขที่ ตั้งแต่ เลขที่ 1 ถึง เลขที่สุดท้าย เมื่อเราเปลี่ยนเลขที่ ที่เซลล์ F4 ชีทรายงานผลการเรียน-Miterm แล้วให้มันเปลี่ยนอัติโนมัติ เพื่อดึงเอาค่า F25 มาใส่ที่เซลล์ G4 ถึง G55 ที่ชีทเกรดเฉลี่ย ให้มันวนรอบนำค่ามาแสดงจนครบทุกเลขที่ กลายเป็นข้อมูลแทนที่เราจะมาทำการเปลี่ยนเลขที่เอง คือให้มันสรุปข้อมูลออกมาจนครบทุกคนครับอาจารย์
User avatar
snasui
Site Admin
Site Admin
Posts: 31191
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#13

Post by snasui »

:D การให้ได้ค่าทั้งหมดตามตัวอย่างที่แนบมาได้นั้นต้อง Loop ด้วย VBA

ลองเขียนมาเองก่อน ติดตรงไหนค่อยถามกันต่อครับ
aueijung
Member
Member
Posts: 109
Joined: Thu May 30, 2013 12:03 am

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#14

Post by aueijung »

:mrgreen: ชีท เกรดเฉลี่ย เซลล์ G7:G61 แสดงข้อมูลแค่เพียงค่าเดียวเองครับอาจารย์ มันไม่แสดงข้อมูลจนครบทุกคน เราจะแก้ไขอย่างไรครับอาจารย์
Attachments
AVG.xlsm
(80.74 KiB) Downloaded 8 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31191
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#15

Post by snasui »

:D ตัวอย่างการปรับ 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
aueijung
Member
Member
Posts: 109
Joined: Thu May 30, 2013 12:03 am

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#16

Post by aueijung »

:mrgreen: ถ้าเราจะให้เซลล์ F4 ที่ชีทรายงานผลการเรียน-Miterm มันมาเช็คค่ากับเซลล์ B7 ที่ชีทเกรดเฉลี่ย ว่าถ้าเลขที่เท่ากัน ก็ให้คัดลอกค่าเซลล์ F25 ไปกรอกที่เซลล์ B7 ที่ชีท เกรดเฉลี่ย แล้วเพิ่มค่า F4 ที่ชีทรายงานผลการเรียน-Miterm เปรียบเทียบกับค่ากับเซลล์ B7 ที่ชีทเกรดเฉลี่ย ในลำดับถัดมา ว่าถ้าเลขที่เท่ากัน ก็ให้คัดลอกค่าเซลล์ F25 ไปกรอกที่เซลล์ B8 ที่ชีท เกรดเฉลี่ย วนไปเรื่อยๆ จนถึงเลขที่สุดท้ายที่เป็นค่าตัวเลข ที่แสดงในเซลล์ B7:B61 โดยไม่ต้องไปเช็คกับคำว่า "พิมพ์ทันที" ก็ได้ครับ(มองแต่เฉพาะข้อมูลที่เราจะสรุปเป็นค่าของตัวเลขจากเซลล์ F25 เพื่อเอาไปกรอกเท่านั้นครับ) ถ้าไม่เท่ากันก็ให้หยุดการทำงาน ต้องทำการปรับตรงไหนบ้างครับอาจารย์
User avatar
snasui
Site Admin
Site Admin
Posts: 31191
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#17

Post by snasui »

:D ตัวอย่าง 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
aueijung
Member
Member
Posts: 109
Joined: Thu May 30, 2013 12:03 am

Re: VBA คัดลอกค่าข้อมูลที่เปลี่ยนไปตามเงื่อนไข

#18

Post by aueijung »

:mrgreen: หลังการปรับ ก็ยังดึงค่าได้แค่ทีละ 2 ค่า ครับอาจารย์ เราสามารถดึงค่าแบบครบทุกเลขที่ได้หรือไม่ครับอาจารย์ โดยการกดปุ่มเพียงครั้งเดียวครับ
Attachments
AVG.xlsm
(80.8 KiB) Downloaded 8 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31191
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#19

Post by snasui »

:D หากมาคลิกปุ่มที่ชีท เกรดเฉลี่ย ต้องเปลี่ยน Code ใหม่จาก With ActiveSheet เป็น With Sheets("รายงานผลการเรียน-Miterm") ครับ
aueijung
Member
Member
Posts: 109
Joined: Thu May 30, 2013 12:03 am

Re: VBA แสดงรายการผลการเรียนของ 2 คน ในหน้าเดียว

#20

Post by aueijung »

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