เพื่อมุ่งให้เกิดคุณภาพจากการอบรมสูงสุด Excel Expert Training ให้การอบรม Excel กลุ่มเล็กๆ ไม่เกิน 6 คนทุกคนสามารถเรียนรู้ Excel อย่างใกล้ชิด จะมาคนเดียวหรือมาเป็นกลุ่มแล้วนัดวันอบรมแบบส่วนตัวก็ได้ ผู้เข้าอบรมทุกคนสามารถติดตามเนื้อหาที่อบรมได้อย่างชัดเจนจากจอภาพด้านหน้าของตัวเอง
Results 1 to 3 of 3

Thread: นำแนวทางการสร้างและใช้ ProgressBar มาฝากครับ

  1. #1
    มิตรภาพ
    Guest

    นำแนวทางการสร้างและใช้ ProgressBar มาฝากครับ

    การสั่งประมวลผลงานหนึ่งๆด้วย VBA โดยการสั่ง Application.Screenupdating=false จะทำให้งานเสร็จได้เร็วกว่าปรกติ แต่มักส่งผลกับ User ทั่วๆไป(ที่ไม่ใช่ผู้เขียนโค้ด) ไม่แน่ใจว่าโปรแกรมกำลังทำงานอยู่หรือเปล่า และก็มักไม่ค่อยสังเกตที่ Statusbar กัน (ทั้งๆที่เขียนไว้แล้ว) จึงเดือดร้อนคนเขียนโค้ด ต้องเขียน Msgbox ขึ้นมาบอกไว้ แต่บางทีก็นิ่งนานๆไป ทำให้ไม่แน่ใจว่าเครื่องแฮ้งค์ไปหรือเปล่า ต้องดิ้นรนหา ProgressBar มาแสดงไว้ให้เห็นกันชัดๆ
    ผมลองหาวิธีการจากการ Search จากอินเตอร์เน็ต ก็ได้มาหลายวิธีเหมือนกันครับ ลองเอามาดัดแปลง ก็ถือว่าใช้ได้ผลดีในระดับหนึ่ง เลยขออนุญาตอาจารย์สมเกียรติ นำมาฝากกันในบอร์ดนี้นะครับ (อ้างอิงกับ Excel2003)
    1. กด Alt+F11 เพื่อเรียกหน้าเขียนโค้ดขึ้นมา แล้วสร้าง Userform ขึ้นมา 1 ฟอร์ม
    2. สำคัญมาก : ในส่วนของกรอบ Properties (กรอบด้านล่าง)ของ Userform ที่เราเพิ่งสร้างขึ้น ค่าของ ShowModal ให้เลือกเป็น False แล้วกด Enter 1 ครั้ง

    3. ที่หน้าเขียนโค้ด ไปที่เมนู Tools เลือก Aditional Controls
    4. ติ๊กเลือกให้มีเครื่องหมาย x ที่หน้า Microsoft ProgressBar Control 6.0 (SP4) แล้วคลิก OK กลับมา
    5. บน toolBox จะมองเห็นสัญญลักษณ์ของ ProgressBar เพิ่มขึ้นมา ให้จับมาลากวางบน Userform ให้เป็นขนาดที่ต้องการ
    6. พิมพ์โค้ดหรือคัดลอกโค้ดนี้ไว้ในหน้าเขียนโค้ดนะครับ
    Code:
    Dim totalSection As Integer, eachSection As Integer
    Sub updatePgBar(totalSection As Integer, eachSection As Integer, ByRef MyProgressBar As ProgressBar)
            Dim percentComplete As Single
            percentComplete = ((1 / totalSection) * eachSection)
            MyProgressBar.Value = percentComplete * 100
            eachSection = eachSection + 1
    End Sub
    Sub PageSetupWithProgressBar()
       UserForm1.Show
       Application.ScreenUpdating = False
       DoEvents
       totalSection = 20
       eachSection = 1
        With ActiveSheet.PageSetup
            .PrintTitleRows = ""
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .PrintTitleColumns = ""
        End With
        updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
        ActiveSheet.PageSetup.PrintArea = ""
        updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
        With ActiveSheet.PageSetup
            .LeftHeader = ""
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .CenterHeader = ""
            .RightHeader = ""
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .LeftFooter = ""
            .CenterFooter = ""
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .RightFooter = ""
            .LeftMargin = Application.InchesToPoints(0.196850393700787)
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .RightMargin = Application.InchesToPoints(0.196850393700787)
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .TopMargin = Application.InchesToPoints(0.196850393700787)
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .BottomMargin = Application.InchesToPoints(0.196850393700787)
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .HeaderMargin = Application.InchesToPoints(0.511811023622047)
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .FooterMargin = Application.InchesToPoints(0.511811023622047)
            .PrintHeadings = False
            .PrintGridlines = False
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .PrintComments = xlPrintNoComments
            .PrintQuality = 300
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .CenterHorizontally = True
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .CenterVertically = True
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .Orientation = xlPortrait
            .Draft = False
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .PaperSize = xlPaperA4
            .FirstPageNumber = xlAutomatic
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .Order = xlDownThenOver
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .BlackAndWhite = True
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
            .Zoom = 100
            .PrintErrors = xlPrintErrorsDisplayed
            updatePgBar totalSection, eachSection, UserForm1.ProgressBar1
        End With
        Unload UserForm1
    End Sub
    จากโค้ดปรับแต่งหน้ากระดาษข้างบน ค่าความละเอียด 300 นั้น กับเครื่องพิมพ์เลเซอร์บางเครื่องอาจเกิด error ได้ เพราะค่าต่ำสุดที่พิมพ์ได้จะเป็น 600 ก็เปลี่ยนแปลงตามความเหมาะสมนะครับ

    วิธีการจะให้แสดง Progressbar ก็คือการนำคำสั่ง updatePgBar คือโค้ดตัวแรก มาวางลงตามตำแหน่งต่างๆเป็นระยะๆ ลองแกะดูนะครับ อาจจะอธิบายได้ไม่ดีนัก
    7. ตัวแปรที่ต้องการ ของการแสดงความคืบหน้า เมื่อเทียบกับ 100% เช่น ถ้าต้องการความคืบหน้าสักครั้งละ 5 หน่วย ดังนั้น totalSection ก็จะเท่ากับ 20 เราก็จะต้องวางคำสั่ง updatePgBar totalSection, eachSection, UserForm1.ProgressBar1 ได้ไม่เกิน 20 ครั้ง ส่วน eachSection ต้องเป็น 1 เสมอครับ

    แต่จากวิธีการและโค้ดข้างต้น ผมยังรู้สึกว่าค่อนข้างรกไปสักหน่อย หากต้องการความละเอียดให้เพิ่มครั้งละ 1 หน่วย ก็ต้องวางคำสั่งถึง 100 ครั้ง จึงอยากเรียนปรึกษาว่า จะมีวิธีการใดนอกเหนือจากนี้ใหมครับ ที่จะสามารถสั่งรันโค้ดให้แสดง ProgressBar ให้วิ่งไปพร้อมๆกับโค้ดหลักได้ (จะใช้หลักการของ ShellAndWait ที่ใช้กับ Winzip ที่มีตัวอย่างอยู่ในอินเตอร์เน็ตได้หรือไม่ http://www.rondebruin.nl/zip.htm) ขอขอบคุณครับผม

  2. #2
    สมเกียรติ
    Guest
    คำอธิบายแบบนี้สมควรเก็บไว้ในฟอรัม Excel Expert Volunteer's Articles & News ครับ จะได้ค้นหาง่ายกว่าเก็บไว้ในฟอรัมถามตอบที่สักวันหนึ่งจะเลื่อนหายไปหลังกระทู้อื่นๆ

    ขอเชิญ Excel Expert Volunteer เขียนบทความหรือแนะนำความรู้ที่น่าสนใจไว้ในฟอรัม Excel Expert Volunteer's Articles & News กันนะครับ

    http://www.excelexperttraining.com/f...isplay.php?f=4

  3. #3
    มิตรภาพ
    Guest
    มีอีกวิธีหนึ่งครับ ที่ง่ายสุดๆหลังจากสร้าง Userform ที่วาง Progressbar ไว้แล้ว ลักษณะการใช้งานก็คล้ายๆกัน แต่คราวนี้ไม่ต้องสร้างโค้ดให้ยุ่งยาก ให้วางคำสั่ง "กำหนดค่า" ของ Progressbar ตรงๆเลย วิธีนี้ไม่ต้องการความละเอียดมากนัก จะใช้เพื่อแสดงความคืบหน้าคร่าวๆครับ

    ค่า Default ของ Progressbar ก็คือ 100 ดังนั้น เราควรจะแบ่ง "ค่าของการวางในแต่ละครั้ง" ให้เหมาะสม ดังตัวอย่างนี้ครับ

    1. ผมมีโค้ดที่ต้องการให้แสดงความคืบหน้า 5 สเต็ป จะทำประมาณนี้
    Userform1.ProgressBar1.value=0
    ..........
    ..........
    Userform1.ProgressBar1.value=20
    ..........
    ..........
    Userform1.ProgressBar1.value=40
    ..........
    ..........
    Userform1.ProgressBar1.value=60
    ..........
    ..........
    Userform1.ProgressBar1.value=80
    ..........
    ..........
    Userform1.ProgressBar1.value=100

    2. แต่ถ้าอยากจะให้ละเอียดขึ้นมาอีก ก็อาจจะใช้แบบ 10 สเต็ป แบบนี้ครับ
    Userform1.ProgressBar1.value=0
    ..........
    Userform1.ProgressBar1.value=10
    ..........
    Userform1.ProgressBar1.value=20
    ..........
    Userform1.ProgressBar1.value=30
    ..........
    Userform1.ProgressBar1.value=40
    ..........
    ..........
    |
    |
    |
    Userform1.ProgressBar1.value=100

    3. หรือถ้าต้องการแบบไม่ต้องคิดมาก ก็สามารถวางกี่ที่ก็ได้ ค่าเท่าไรก็ได้ที่ไม่เกิน 100 จะขึ้นบ้าง ลงบ้าง (แปลกๆไปอีกแบบ) ก็ได้ครับ เช่น
    Userform1.ProgressBar1.value=0
    ..........
    Userform1.ProgressBar1.value=5
    ..........
    ..........
    Userform1.ProgressBar1.value=9
    ..........
    Userform1.ProgressBar1.value=12
    ..........
    Userform1.ProgressBar1.value=5
    ..........
    Userform1.ProgressBar1.value=22
    ..........
    Userform1.ProgressBar1.value=50
    ..........
    Userform1.ProgressBar1.value=75
    ..........
    |
    |
    |
    Userform1.ProgressBar1.value=100

    ระวังไม่ให้เกิน 100 จะได้ไม่ Error และเรื่อง Properties ของ Userform ค่าของ ShowModal ต้องเป็น False ครับ

Similar Threads

  1. นำแนวทางการสร้างและใช้ ProgressBar มาฝากครับ
    By มิตรภาพ in forum Excel Expert Forum Library 2012 - 2007
    Replies: 0
    Last Post: 16 Aug 2007, 12:34

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •