วันศุกร์ที่ 8 กรกฎาคม พ.ศ. 2559

ไม่รู้อะไร ให้ถาม Google

หลังจากที่เราเริ่มคุ้นชินกับ Macro และ VBA บ้างแล้ว จะมีคำถามว่า แล้วจะเขียนยังไง Code มันเยอะแยะไปหมด จะไปจำได้ยังไง คำตอบคือ ถ้าจำได้ก็ดีครับ ถ้าจำไม่ได้ก็โน่นเลย Google ใน Blog นี้ จะเริ่มใช้ Google ในการหาข้อมูลเพื่อนำมาเขียน VBA กัน

จุดประสงค์หลัก ๆ ของการใช้ Macro หรือ VBA ก็เพื่อช่วยลดการทำงานของเราลง โดยให้มันทำงานแทน ทำงานได้เร็วกว่า และถูกต้องกว่า ดังนั้น ในแต่ละโปรแกรมที่แทบจะหลีกเลี่ยงไม่ได้เลยคือ การวนลูป ลองดูกันว่า เราจะมาค้นหาเจ้าสิ่งนี้ใน Google อย่างไร

ผลการค้นหาใน Google มันจะไม่สำเร็จรูป หรือถ้าสำเร็จรูป ก็จะเป็นโปรแกรมที่อาจจะไม่ตรงความต้องการของเราก็ได้ ฉนั้นก่อนจะหาใน Google ให้เราตั้งโจทย์ที่อยากแก้ แล้วเริ่มสร้าง VBA ขึ้นมาก่อน อาจจะใช้การ Record Macro ก็ได้ เช่น อยากจะกรอกตัวเลข 1 - 10 ที่ตำแหน่ง A1:A10 จริง ๆ แค่นี้ไม่ต้องใช้ VBA ก็ได้ เราแค่ทดลองตัวอย่างง่าย ๆ ก่อน

เริ่มจาก Record Macro ก็จะได้ Code แบบนี้
Sub Macro1()

    Range("A1").Select - คลิกเลือกตำแหน่ง A1
    ActiveCell.FormulaR1C1 = "1" - กรอกตัวเลข 1 ลงไป
    Range("A2").Select - คลิกเลือกตำแหน่ง A2
    ActiveCell.FormulaR1C1 = "2" - กรอกตัวเลข 2 ลงไป
    Range("A1:A2").Select - เลือกตำแหน่ง A1 ถึง A2
    Selection.AutoFill Destination:=Range("A1:A10"), Type:=xlFillDefault - ลากลงไปจนถึงตำแหน่ง A10 เพื่อให้มันใส่ตัวเลขต่อเนื่องลงไป
    Range("A1:A10").Select
   
End Sub
แล้วถ้าจากแค่ 1 - 10 เป็น 1 - 10000 ล่ะ
- ก็ง่าย ๆ เลย ให้แก้ตรง
Selection.AutoFill Destination:=Range("A1:A10"), Type:=xlFillDefault
จาก A1:A10 เป็น A1:A10000 เท่านี้ มันก็จะลากลงไปถึง A10000

 แล้วถ้าไม่อยากใช้วิธีการลากล่ะ
- ตรงนี้ ก็จะต้องใช้การวนลูป แต่เราไม่รู้ว่าต้องทำยังไง ไป Google เลย

การค้นหาเกี่ยวกับ VBA ใน Google ให้แปะคำว่า "Excel VBA" แล้วตามด้วยสิ่งที่สนใจ อย่างเช่น เรากำลังจะหาเกี่ยวกับการวนลูป ก็ให้หาว่า "Excel VBA Loop" ก็จะเจอผลการค้นเยอะแยะมากมาย ลองเลือกดูซักเวป

เวปนี้ http://www.excel-easy.com/vba/loop.html น่าสนใจ มี Code ตัวอย่างแบบนี้

Dim i As Integer - ประกาศตัวแปร ว่าเราจะใช้ "i" เป็นตัวเก็บข้อมูลนะ

For i = 1 To 6 - วนลูป 6 รอบ โดยกำหนดให้ "i" มีค่าเท่ากับ 1 และเมื่อจบแต่ละรอบ "i" จะมค่าเพิ่มขึ้น 1
    Cells(i, 1).Value = 100 - กำหนดตัวเลข 100 ลงในเซล
Next i - กลับขึ้นไปที่ For จนกว่าค่า "i" จะครบ 6 ตามที่ For กำหนดด้านบน

ต่อไปเราก็ลองเอา Code ตัวอย่าง มาประยุกต์เข้ากับ Macro ที่เรา Record ไว้แล้ว

    Dim i As Integer - ประกาศตัวแปร ว่าเราจะใช้ "i" เป็นตัวเก็บข้อมูลนะ

    For i = 1 To 10000 - วนลูป 10000 รอบ โดยกำหนดให้ "i" มีค่าเท่ากับ 1 และเมื่อจบแต่ละรอบ "i" จะมีค่าเพิ่มขึ้น 1
    Range("A" & i).Select - ตรงนี้ จะสังเกตุว่า มีตัวแปร "i" มาแทน หมายความว่า ให้คลิกเลือกตำแหน่ง A และ ค่าในตัวแปร "i" ซึ่งค่า "i" จะเพิ่มขึ้น 1 ในแต่ละลูป
    ActiveCell.FormulaR1C1 = i - กำหนดค่าในเซลให้มีค่าเท่ากับค่าในตัวแปร "i"
    Next i - กลับขึ้นไปที่ For จนกว่าค่า "i" จะครบ 10000 ตามที่ For กำหนดด้านบน

เท่านี้ เราก็จะได้ Code ที่กรอกตัวเลข 1 - 10000 แล้ว แต่ข้อเสียของ Code นี้คือ ช้า เพราะเนื่องจากมีการสั่งให้คลิกเลือกตำแหน่ง ก่อนที่จะใส่ข้อมูลลงไป หมายความว่า จะต้องคลิกถึง 10000 ครั้ง

ใน VBA เราสามารถอ้างอิงตำแหน่งได้เลย ดังนี้

เปลี่ยน

Range("A" & i).Select

ให้เป็น

ActiveWorkbook.ActiveSheet.Range("A" & i) = i
 และลบ

ActiveCell.FormulaR1C1 = i
 จะเหลือแค่
    Dim i As Integer

    For i = 1 To 10000
    ActiveWorkbook.ActiveSheet.Range("A" & i) = i
    Next i
 จะเห็นได้ว่า Code สั้นลง และ ทำงานเร็วขึ้น เพราะไม่ต้องคลิกเลือกตำแหน่งก่อน สามารถกำหนดค่าลงในตำแหน่งได้เลย

อธิบาย Code ตามนี้

 ActiveWorkbook คือ workbook ปัจจุบันที่เราเปิดทำงานอยู่ หรือก็คือ Excel ปัจจุบัน
ActiveSheet คือ Sheet ปัจจุบันที่เราเปิดทำงาน
Range("A" & i) = i คือ ให้ใส่ข้อมูลตามค่าในตัวแปร "i" ลงในตำแหน่งที่อ้างอิงกับค่า "i" เช่นรอบที่ 70 ค่า "i" จะมีค่าเป็น 70 ดังนั้น ตำแหน่งที่ A70 จะมีค่า 70 อยู่

สามารถหาข้อมูลเพิ่มเติมเกี่ยวกับ ActiveWorkbook หรือ การอ้างอิงใน VBA อื่น ๆ ได้ โดยการค้นหาคำว่า "Excel VBA Reference"

ไม่มีความคิดเห็น:

แสดงความคิดเห็น