ในบทความนี้ผมจะมาแนะนำวิธีสร้าง Function Query ขึ้นใน Power Query ซึ่งไม่ใช่แบบปกติ แต่จะเป็นแบบที่ยังยอมให้เราแก้ไข Step ต่างๆ ใน Function นั้นได้โดยง่าย
แต่ถ้าใครยังไม่รู้ว่าผมพูดถึงเรื่องอะไร ลองอ่าน recap นี้ดูก่อนเล็กน้อย…
สารบัญ
Recap
Power Query เป็นเครื่องมือสำหรับการดัดแปลงข้อมูลที่ทรงพลังและใช้ง่ายมากๆ อยากจะทำอะไรก็มีเมนูสำเร็จรูปเอาไว้ให้กดได้เลยโดยแทบไม่ต้องเขียนสูตร แต่ว่าหลายครั้งก็น่าเบื่อเวลาที่เราต้องทำ Step อะไรซ้ำๆ เหมือนเดิมกับหลายๆ Query จะดีกว่ามั้ยถ้าเราทำ Step พวกนั้นเป็นฟังก์ชันแล้วเรียกใช้ได้อย่างง่ายๆ เลย?
ในหนังสือ Excel Power Up! ที่ผมเขียนไว้ ในบทหลังๆ ก็มีเขียนวิธีที่ทำให้ Query กลายเป็นฟังก์ชันได้ง่ายๆ โดยเปิด Advanced Editor แล้วใส่คำว่า (input1, input2)=> นำหน้า code เดิม
ซึ่งมันจะเปลี่ยน Query นั้นให้กลายเป็นฟังก์ชันที่มี input 2 ตัวคือ input1 กับ input2 ทันที แต่ข้อเสียคือถ้าจะแก้ต้องมาแก้ใน Advanced Editor ไม่สามารถมี User Interface ง่ายๆ ให้แก้อีกแล้ว
ในบทความนี้ผมก็เลยจะมาแชร์วิธีสร้าง Function อีกวิธีนึงซึ่งยังสามารถทำให้เราแก้ไขได้ง่ายๆ โดยใช้ User Interface ได้อยู่ โดยที่ผมเห็นวิธีนี้ครั้งแรกมาจากคุณโบแห่ง Excel Wizard ที่ไปตอบในคลิปของ อ. Mike แห่ง Excel is fun
ผมเห็นว่ามันเป็นประโยชน์มาก เลยขออนุญาตนำเทคนิคนี้มาถ่ายทอดอีกที แต่มีการดัดแปลงเล็กน้อยให้เข้าใจง่ายขึ้น (ล่ะมั๊ง) นะครับ 555
วิธีใช้ Function Query แบบแก้ไขได้
หลักการมี 4 ขั้นตอน คือ
- สร้าง New Parameter ขึ้นมา โดยจะสร้างกี่ตัวก็ได้ สมมติชื่อ Para1, Para2
- เอา Parameter จากข้อ 1 ไปเรียกใช้ใน Query ที่ต้องการจะให้เป็นต้นแบบ (อันนี้ต้อง Manual แก้สูตรนิดนึง) สมมติชื่อ StepQuery ซึ่ง Function ของเราจะทำ Step ตาม Query ตัวนี้เลย
- สร้างฟังก์ชัน โดยกดคลิ๊กขวา ที่ StepQuery แล้ว Create Function แล้วตั้งชื่อฟังก์ชันอะไรก็ได้
- นำฟังก์ชันไปใช้งาน เช่นเอาไปใช้ใน Query หลัก อาจใช้ผ่าน Invoke Custom Function ก็ได้ง่ายดี
ซึ่งแบบที่เข้าใจง่ายที่สุดก็คือ Parameter ที่เป็นพวกค่าเดี่ยวๆ เช่น ตัวเลข หรือ ข้อความ เป็นต้น
ตัวอย่างของการใช้ Parameter แบบนี้แล้วมีประโยชน์มากก็คือ การดึงข้อมูลจากเว็บไซต์ต่างๆ โดยเปลี่ยน URL ไปเรื่อยๆ เช่น การดึงข้อมูลหุ้น เป็นต้น
ตัวอย่างการสร้าง Function ดึงข้อมูลหุ้นจาก symbol ที่ต้องการ
สมมติผมต้องการข้อมูลจากเว็บหน้านี้ https://www.set.or.th/set/companyhighlight.do?symbol=SCC

ผมก็สามารถสั่ง Get Data From Web ได้ โดยเลือกว่าจะดูด table ในรูป

ที่นี้มันจะดูดข้อมูลเข้า Power Query เฉพาะ Symbol นี้อันเดียว
ให้เปลี่ยนชื่อ Query เป็น StepQuery ซะ เพราะตารางนี้แหละที่เราจะใช้เป็นแม่เแบบของการ Transform Data ซึ่งเราจะ Transform ข้อมูลให้เสร็จไปเลยก็ได้ แต่ผมยังไม่ทำ เพราะไปทีหลังได้
1. สร้าง Parameter
ทีนี้ให้เราสร้าง Parameter ขึ้นมา โดยกด Manage Parameter แล้ว New แล้วตั้งชื่อว่า StockSymbol จากนั้นเลือก Type เป็น Text เพราะว่า Parameter นี้คือข้อความ จากนั้นใส่ Current Value เป็น SCC ไปก่อน เพื่อจะได้ดึงค่าจากหุ้น SCC ได้

2.เอา Parameter ไปใช้ใน Step Query
กดตามรูป แล้วไปแก้สูตรของ Source ซะ ให้เปลี่ยนจากข้อความว่า SCC เป็น Parameter ที่ชื่อว่า StockSymbol แทน ซึ่งเชื่อมด้วยเครื่องหมาย &
= Web.Page(Web.Contents("https://www.set.or.th/set/companyhighlight.do?symbol="&StockSymbol))

พอลองกดกลับมาดู Step หลังๆ ก็ควรจะต้องเห็นว่ายังใช้งานได้อยู่เหมือนเดิม

3.สร้างฟังก์ชัน
จากนั้นคลิ๊กขวาที StepQuery แล้วกด Create Function

จากนั้นตั้งชื่อตามใจชอบเช่น GetStockData แล้วกด ok

มันจะสร้างฟังก์ชันแล้วผูก Query ให้เราโดยอัตโนมัติ

4.นำฟังก์ชันไปใช้งาน
ทีนี้เราจะลองใช้งานเพื่อดูดหุ้นซัก 5-6 ตัว แต่เนื่องจากเรายังไม่มี List รายชื่อหุ้นเลย ดังนั้นเดี๋ยวไปสร้าง List รายชื่อหุ้นก่อน ซึ่งเราจะสร้างใน Excel ไฟล์นี้แหละ
ดังนั้นก่อนอื่นให้เรา Close & Load To… -> Only Create Connection เพื่อออกไปยัง Excel ก่อน (ไม่งั้นมันไม่ให้ออกไปสร้าง)
ให้เราใส่ Data ลงไปตามต้องการ แล้วกดสร้าง Table ชื่อ StockList ซะ

จากนั้นกด Get Data From Table/Range เพื่อเอาเข้า Power Query
จากนั้นกด Add Column -> Invoke Custom Function เพื่อเรียกใช้ฟังก์ชันที่เราสร้างขึ้นมา

มันอาจจะมีขึ้นมาเตือนเรื่อง Data Privacy เพราะมีการดึงข้อมูลจาก Local ผสมกับจากแหล่งออนไลน์ ก็ให้กด Continue ไป

จุดนี้ถ้าไม่คิดอะไรมาก ติ๊ก Ignore Privacy Level ก็ได้ (มันก็จะไม่แคร์เรื่องข้อมูลรั่วไหลอะไรเลย)

จากนั้นมันก็จะดึงข้อมูล Symbol ทุกตัวออกมาเป็น Table ดังรูป เมื่อคลิ๊กแต่ละช่องที่เป็น Table เราก็จะเห็นไส้ในของ Table นั้น

ถ้าเรากด Expand ที่มุมขวาบนของคอลัมน์ มันก็จะเอาทุก Table มา Append ต่อแถวกันโดยอัตโนมัติ โดยการ Append ก็จะยึดจากชื่อคอลัมน์ที่เป็นหัวตารางเป็นหลัก
แต่เนื่องจากหัวตารางไส้ในของเรายังไม่ ok ดังนั้นเราจะกลับไปแก้ StepQuery ให้เรียบร้อยก่อน
กลับไปแก้ StepQuery (เพราะเราข้ามมา)

เอาล่ะ เรากดย้อนหลับมายัง StepQuery เพื่อจัดการตารางให้เรียบร้อยกัน
ก่อนอื่นจะ Filter เอาบรรทัดที่ไม่เกี่ยวข้องออก นั่นก็คือคอลัมน์แรกจะเอาตัวที่มีคำว่า “สำคัญ” ออกไปซะ

ให้ Transpose ตารางลงมาก่อน

แล้ว Use First Row as Header ซะ แต่จะลบ Step Change Type ออกเพื่อไม่ให้มันระบุชื่อหัวตารางในสูตร

จากนั้นเราอยากใส่ลำดับปีเป็น Y-4, Y-3, Y-2, Y-1, Y-0 ดังนั้นจะกด Add Index Column ใหม่แบบ Custom

จากนั้นจะได้เลขเรียง 4,3,2,1,0 ออกมา
แต่คราวนี้เราจะใส่คำว่า Y- ไว้ข้างหน้า ก็ไปที่ Transform -> Format-> Add Prefix

ก็จะได้ผลลัพธ์ตามต้องการ

กลับไปดูผลที่ Query หลัก (หลังจากแก้ StepQuery)
เมื่อกดกลับไปดูที่ StockList ซึ่งเป็น Query หลักของเรา จะเห็นว่าที่เราไปแก้ใน StepQuery นั้นได้สะท้อนออกมายัง Query หลักแล้ว

คราวนี้เราก็ Expand ข้อมูลได้อย่างสบายใจแล้ว

แค่นี้เราก็จะได้ข้อมูลจากทุก Symbol มารวมกันแล้วครับ

ถ้าใครไม่อยากให้ตอน Expand มันระบุชื่อคอลัมน์ ก็สามารถทำตาม Tips ของบทความนี้ได้ เพื่อให้มันอ่านหัวคอลัมน์ใหม่ได้ตลอด
เช่น เราจะแก้สูตรเป็น
= Table.ExpandTableColumn(#"Invoked Custom Function", "GetStockData", List.Union(List.Transform(#"Invoked Custom Function"[GetStockData],each Table.ColumnNames(_))))
ผลลัพธ์ที่ได้จะเหมือนเดิม แต่จะยืดหยุ่นขึ้นกรณีที่ในอนาคตอาจจะมี Field เพิ่มก็จะเห็นทันที

ต่อจากนี้จะเปลี่ยน Datatype ตัวไหนยังไงก็แล้วแต่เลยครับ ผมขอไม่ทำให้ดูแล้วนะ ^^
ตอนต่อไปคืออะไร?
ในบทความตอนถัดไป จะเป็นวิธีสร้างฟังก์ชันคล้ายๆ แบบบทความนี้ แต่สร้าง Parameter เป็น Any แทนที่จะเป็น Parameter แค่ Text ธรรมดา เพื่อให้ดึงข้อมูลจาก Table ที่ต้องการได้ ซึ่งจะยากขึ้นอีกเล็กน้อยครับ
ซึ่งแบบหลังนี้แหละที่คุณโบ Excel Wizard ทำให้ดูในคลิป Excel is fun แต่ถ้าให้ผมอธิบายวิธีนั้นเลย น่าจะงงแน่นอน เลยต้องสอนแบบง่ายก่อนนะ
แล้วพบกันในตอนต่อไปครับ รับรองว่าเจ๋งมากๆ อีกแล้ววว
Leave a Reply