วันศุกร์ที่ 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"

วันพฤหัสบดีที่ 7 กรกฎาคม พ.ศ. 2559

เริ่มต้น VBA ด้วย Macro

Macro คืออะไร แล้วเกี่ยวอะไรกับ VBA

เคยไม๊ กับการทำอะไร ซ้ำ ๆ เดิม ๆ ทุกวัน ทุกอาทิตย์ แน่นอนว่ามันน่าเบื่อ แต่จะให้ทำไงล่ะ ก็มันต้องทำใช่ไม๊ มันก็ใช่ แล้วทำไงดีล่ะ ก็ไม่ต้องทำ !?

เรื่องนี้ได้ไปเข้าหู ท่านเทพเจ้า Excel เข้า จึงได้มอบเครื่องมือพิเศษที่มีชื่อว่า Macro !!

เจ้า Macro นี่ สามารถทำทุกอย่างได้เหมือนที่เราทำ โดยใช้การบันทึกการกระทำของเรา

วิธีการเปิดใช้งาน Macro
  • ไปที่ File > Option > Customize Ribbon
  • ติ๊กถูก ที่ Developer ในช่องด้านขวา

แค่นี้ เราก็จะได้ชุดเครื่องมือแห่งเทพเจ้ามาใช้แล้ว



เริ่มสร้าง Macro กันดู โดยกำหนดโจทย์ดังนี้

     พิมพ์ "A" ที่ A1, "B" ที่ B1, "C" ที่ C1 แล้ว Copy A1:C1 มาลง 10 บรรทัด    



ขั้นตอนในการสร้าง Macro เพื่อทำตามโจทย์ด้านบน ซ้ำ ๆ ทำได้ดังนี้
  • ไปที่ เมนู Developer > Record Macro

  • จะมีหน้าต่างให้ใส่ชื่อ Macro ก็ใส่ไป แล้วกด OK


  • จากนั้นก็บรรเลงเลย กรอกข้อมูล "A" "B" "C" ตามโจทย์ข้างบน
  • เมื่อกรอกข้อมูลเสร็จแล้ว กด Stop Record อยู่ที่ปุ่มเดียวกับ Record Macro เป็นอันเสร็จ
  • ลองทดสอบดู โดยการลบข้อมูลทั้งหมดออกก่อน แล้วกดปุ่ม Macros จะมี Macro ที่เราสร้างขึ้นมาให้เลือก ก็เลือกไป แล้วกด Run ก็จะได้ผลลัพท์ออกมาเหมือนที่เราทำ


แล้ว Macro ที่เราสร้างล่ะ มันไปอยู่ที่ไหน หน้าตาเป็นยังไง

ถึงตอนนี้แล้ว จะเป็นการเฉลยว่า Macro เกี่ยวกับ VBA ยังไง

Macro จริง ๆ แล้วถูกสร้างด้วย VBA นั่นเอง โดยเราสามารถเข้าไปแก้ไข Macro ได้โดย กดที่ Visual Basic จะมีหน้าต่าง VBA ขึ้นมา เลือก Modules ดับเบิ้ลคลิกที่ Module1 เราจะเห็น Source Code ของ Macro ที่เราสร้าง ซึ่งเป็นภาษา VBA



อ้าว ก็ในเมื่อสามารถ Record Macro แล้วก็ได้ VBA ออกมา แล้วจะต้องเขียนอีกทำไม ?
- คำตอบคือ Macro มันไม่ยืดหยุ่น และไม่ฉลาด Record มันมาแค่ไหน มันทำแค่นั้นจบ ไม่มีการเปรียบเทียบเงื่อนไข ไม่มีการวนลูป

ถ้างั้นแล้ว การ Record Macro ก็ไม่จำเป็นต้องใช้สิ ในเมื่อมันไม่ฉลาด ?
- จำเป็นใช้ แต่ไม่ทั้งหมด เพราะการ Record Macro ก็จะได้ Code VBA ออกมา เราเอาไปแก้ไขต่อ ซึ่งเร็วกว่าที่จะต้องเขียนใหม่ทั้งหมด

ฉนั้น ในความคิดผมแล้ว การเริ่มต้นรังสรรค์ Code VBA ให้เริ่มจากการ Record Macro แล้วแก้ไขเพิ่มเติม เปลี่ยนโน่น ปรับนี่ ผสมแนวคิด ตั้งโจทย์ เมื่อเริ่มไปได้ซักพัก แน่นอน เราจะเจอจุดที่ไปต่อไม่ได้ ถึงตอนนี้ เราจะเริ่มเข้าสู่ Googleland ดินแดนมหัศจรรย์ หาอะไรก็เจอ ถามอะไร ตอบได้

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

อะไรคือ Excel VBA in Googleland

Excel ทุกท่านคงรู้จักกันเป็นอย่างดีอยู่แล้วนะครับ ว่ามันคือซอฟแวร์อะไร แล้ว VBA ล่ะ หลายท่านก็ไม่ทราบว่ามันคืออะไร เกี่ยวอะไรกับ Excel เช่นเดียวกับผมในช่วงก่อนหน้านี้

เมื่อก่อนนั้น สำหรับผมแล้ว Excel มันก็แค่ตาราง กรอกข้อมูล จะยากก็แค่สูตรต่าง ๆ ไม่เคยได้รู้ว่ามันมี VBA อยู่ด้วย จนได้เห็น VBA ตัวแรก ซึ่งก็คือ Excel ที่มี "ปุ่มกด" เห้ย ! ปุ่มอะไร ทำไมมันแปะอยู่ในตารางได้ กดแล้ว มีความเคลื่อนไหวเยอะแยะมากมาย น่าทึ่งมากสำหรับผม

ตั้งแต่นั้น ก็เริ่มศึกษาว่ามันคืออะไร ก็ได้รู้ว่ามันคือ VBA หรือ Visual Basic for Application หรือก็คือการเขียนโปรแกรมด้วยภาษา VB ภายใน Excel นั่นเอง ซึ่งในการศึกษาของผมนั้น มาจากที่เดียวเลย คือ Google ไม่มีหนังสือ ไม่ได้ลงเรียน (แต่ก็ได้ซื้อหนังสือมาบ้าง ในภายหลัง เพื่อดูหลาย ๆ แนวคิด) อาศัยแค่พื้นฐานการเขียนโปรแกรมที่พอมีอยู่บ้าง (ท่านที่ไม่มีพื้นฐานโปรแกรมมิ่งเลย อาจจะลำบากไปสักหน่อย) บวกกับการค้นหาสิ่งที่ติดขัดใน Google ทั้งหมด

จึงเป็นที่มาของการทำ Blog นี้ขึ้นมา โดยใช้ชื่อว่า Excel VBA in Googleland เพื่อแชร์ประสบการณ์ การศึกษาในเรื่องนี้นั่นเองครับ