Author: Sira Ekabut

  • VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว?

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว?

    การ VLOOKUP เพื่อนำข้อมูลจากตารางอ้างอิงอีกที่นึงกลับมาได้แบบอัตโนมัติ ก็จะช่วยให้เราทำงานเร็วขึ้นมาก แต่ถ้าข้อมูลมีเยอะ มันก็อาจจะทำให้ VLOOKUP ของเราช้าได้ ในบทความนี้ผมจะมาสอนว่าทำยังไงให้ผลลัพธ์มันเร็วขึ้นครับ อ่านจบชีวิตเปลี่ยนแน่นอน ^^

    แนวทาง 1 : ใช้ Excel 365 สิ

    ใน Excel 365 version 1809 เป็นต้นไป ทาง Microsoft ได้มีการปรับปรุงการประสิทธิภาพการทำงานของสูตรพวก VLOOKUP ให้ทำงานเร็วขึ้น โดยหลักการคือให้โปรแกรมมีการสร้าง Index ในคอลัมน์ที่ทำการค้นหา (แม้ไม่ได้เรียง) ก่อนทำการค้นหา ซึ่งผลลัพธ์ของ VLOOKUP ใน Excel 365 จะเร็วขึ้นประมาณ 4 เท่าเมื่อเทียบกับ Excel 2010 หรือ 2016

    แต่ก็นะ… กรณีที่เราอุตส่าห์มี Excel 365 แล้ว และคนที่เราต้องใช้งานด้วยก็มี Excel 365 แบบเรา ผมแนะนำให้ใช้ฟังก์ชันสุดโกงอย่าง XLOOKUP ไปเลยก็ได้นะครับ เร็วเท่ากันกับ VLOOKUP (แบบ 365 ที่แก้ให้เร็วแล้ว) แต่ดีตรงว่า XLOOKUP ใช้งานง่ายกว่าอีก!

    แนวทาง 2 : ถ้า VLOOKUP แบบเร็ว 100 เท่า

    เมื่อปี 2014 ผมได้เคยเขียนบทความเกี่ยวกับการทำ VLOOKUP แบบเร็ว 100 เท่า ซึ่งใช้ VLOOKUP แบบ Approximate Match 2 ตัว มาช่วยกันทำงานร่วมกับฟังก์ชัน IF เพื่อเลียนแบบ VLOOKUP Exact Match ได้ และแน่นอนว่าก็ใช้กับ Excel version เก่าๆ ได้ด้วย

    วิธีการที่จะใช้เทคนิคนี้ได้คือ

    1. ให้เรียงคอลัมน์ซ้ายสุดของ Table_Array จากน้อยไปมากก่อนเสมอ
    2. เขียนสูตรในฝั่งที่เราต้องการแสดงผลลัพธ์ดังนี้ (และใน table_array อย่าเลือกรวมหัวตาราง)
    =IF(VLOOKUP(lookup_value, table_array, 1, TRUE)=lookup_value,
    VLOOKUP(lookup_value, table_array, col_index_num, TRUE),NA() )


    ที่ต้องใช้ IF มาช่วยเพราะว่า VLOOKUP แบบ Approximate แม้จะทำงานเร็วมาก แต่มีโอกาสได้ข้อมูลผิดตัวกลับมา (กรณี Lookup_Value ไม่ได้ตรงกับค่าใน คอลัมน์ซ้ายสุดของ Table_Array เป๊ะๆ) เราจึงให้ลองเอาคอลัมน์ที่ 1 กลับมาดูว่าตรงกับ lookup_value หรือไม่ ถ้าตรงจึงจะเชื่อสิ่งที่เอากลับมาได้

    VLOOKUP แบบเร็ว 100 เท่า

    ดังนั้นสูตรนี้จึงแปลว่า ถ้าเอาคอลัมน์แรกกลับมา มันจะเท่ากับ Lookup_value ที่ใช้คนหารึเปล่า?” ถ้าเท่ากันแสดงว่าใช้ได้ ให้เอาค่าจากคอลัมน์ที่ต้องการกลับมาได้ (เช่น คอลัมน์ลำดับที่ 3 ที่ต้องการจริงๆ)

    ในรูปที่เป็นการสรุปในคอลัมน์ F ก็เลยบอกว่า IF คอลัมน์ E จริง ให้เชื่อ ค่าในคอลัมน์ C นอกนั้นให้เป็น NA() ไปซะ

    แนวทาง 3 : ใช้ INDEX+MATCH ดีกว่า กรณีที่ Lookup ค่ากลับมาหลายคอลัมน์

    หลายคนอาจเคยได้ยินเกี่ยวกับฟังก์ชัน INDEX และ MATCH มาบ้าง และอาจสงสัยว่ามันดีกว่า VLOOKUP มั้ย?

    ก็ต้องเข้าใจก่อนว่า INDEX นั้นมีความสามารถในการหยิบข้อมูลจากพิกัดที่ระบุได้ แต่ไม่สามารถค้นหาข้อมูลเองได้ ก็เลยต้องใช้ MATCH มาช่วยในการค้นหาข้อมูลแทน ซึ่งต่างจาก VLOOKUP ซึ่งเป็นการค้นหาข้อมูลและหยิบข้อมูลกลับมาได้ด้วยตัวเอง

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 1

    ดังนั้นถ้าจะเอาค่ากลับมาแค่คอลัมน์เดียว ใช้ VLOOKUP จะสะดวกกว่า และก็ไม่ได้ช้ากว่าแต่อย่างใด

    เพราะว่าถ้าเรามาพิจารณาแล้ว ขั้นตอนการทำงานนั้นแบ่งเป็น 2 แบบคือ

    • ค้น = ค้นหาว่าข้อมูล lookup_value อยู่ไหน => ช้าที่ขั้นตอนนี้แหละ!!
    • คว้า = หยิบข้อมูลในคอลัมน์ที่ต้องการกลับมา (คว้า) => เร็ว

    แต่ถ้าเราต้องการเอาค่ากลับมาหลายๆ คอลัมน์ การใช้ VLOOKUP หลายๆ รอบเพื่อให้ได้ข้อมูลหลายๆ คอลัมน์นั้นจะช้าโดยใช่เหตุ

    เช่น เราต้องการเอาค่ากลับมา 3 คอลัมน์ จากตารางอ้างอิงที่ต้องการ ปกติแล้วเราก็จะใช้ VLOOKUP 3 ที (ต่อ 1 บรรทัด) โดยเปลี่ยน Col_index_num เป็นตัวเลขลำดับ 3 เลขที่ต้องการ

    ไอ้การเขียน VLOOKUP หลายๆ Cell ต่อ 1 บรรทัด มันต้องทำการค้นหาข้อมูลใหม่หลายรอบเลยว่า Lookup_value อยู่แถวที่เท่าไหร่ ทั้งๆ ที่จริงๆ มันควรจะค้นทีเดียวก็ได้แล้วจำลำดับแถวเอาไว้ (แต่สูตร Excel มันไม่ได้จำนะ ว่ามันเคยหามาแล้ว)

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 2

    ดังนั้นเราก็เลยใช้เทคนิคในการสร้างคอลัมน์พิเศษแล้วใช้ MATCH เพื่อให้มันหาว่าสิ่งที่ต้องการอยู่ลำดับที่เท่าไหร่ (ผลของ MATCH จะออกมาเป็นตัวเลขลำดับตำแหน่งของ Lookup_value) จากนั้นค่อยใช้ INDEX คว้าหยิบข้อมูลในลำดับที่ต้องการได้เลย ซึ่งขั้นตอนการคว้านั้นเร็วมากกๆๆๆๆ ครับ และใช้กับ Excel version เก่าๆ ได้เช่นกัน

    แนวทางการเขียนสูตรจะทำประมาณนี้ นั่นคือสร้างคอลัมน์ Match เพื่อคำนวณลำดับเลขแถวที่ต้องการ แล้วด้านขวาใช้ INDEX หยิบค่าอย่างเดียวรัวๆ เลย

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 3

    ดังนั้นสรุปว่าวิธีนี้จะเร็วกว่ามาก กรณีที่เอาค่ากลับมาหลายคอลัมน์ เช่น ถ้าเอาค่ากลับมา 10 คอลัมน์ ก็น่าจะเร็วขึ้นประมาณ 10 เท่าจากวิธีปกติได้ครับ

    Tips : ถ้าจะเร็วแบบ Peak เลย คือเราเอา VLOOKUP 100 เท่า มาแทนการใช้ MATCH หาตำแหน่งได้นะ มันจะเร็วแบบสุดๆๆๆๆๆๆ เลย

    แนวทาง 4 : ใช้ Merge Query ใน Power Query แทน VLOOKUP

    นอกจากการใช้สูตรพวก VLOOKUP ในการเอาข้อมูลจากอีกที่มาแปะในที่ที่ต้องการได้ (เรียกว่า Mapping ข้อมูล) อีกวิธีนึงที่ทำได้ก็คือใช้เครื่องมือ Power Query นั่นเอง ซึ่งทำง่ายมากแค่ต้องเอา Table ทั้งสองฝั่ง เข้าสู่ Power Query ก่อน ซึ่งผมเอาเข้าแบบ Connection Only ไว้

    จากนั้นก็เลือกไปที่ตารางหลัก แล้วสั่ง Merge Query

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 4

    ผลลัพธ์แต่ละช่องจะออกมาเป็น Table ก่อน ยังใช้งานไม่ได้ ต้องกด Expand ค่าออกมา และเลือกว่าอยากได้คอลัมน์ไหนบ้าง เอา Prefix มั้ย? (ซึ่งผมไม่เอา)

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 5

    แค่นี้ก็ได้ค่าที่ต้องการทันที หลายคอลัมน์พร้อมกันเลยด้วย!

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 6

    จากนั้นถ้าจะเอาผลลัพธ์ออกไปใช้ ก็กด Close & Load to… แล้วค่อยเลือกว่าจะเอาออกไปเป็นอะไร เช่น เป็น Table หรือ จะเอาเข้า Pivot Table เลย หรือจะเข้า Data Model ก็ได้

    นี่ไง ได้ละ ซึ่งเร็วมากเลยนะ

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 7

    แนวทาง 5 : ใช้ Data Model

    จริงๆ แล้วก่อนที่เราจะทำการ VLOOKUP หรืออะไรก็แล้วแต่ข้างบน เราต้องถามตัวเองก่อนเลยนะ ว่า “เราจะเอาข้อมูลจากตารางอ้างอิงมาแปะในตารางหลักทำไม?

    ถ้าแปะเพื่อแค่ให้มี Field ในการ Pivot ได้

    ถ้าแปะเพื่อแค่ให้มี Field ในการ Pivot ได้ แค่นี้เราไม่จำเป็นต้องแปะเลย เราแค่ใช้ Data Model มาช่วย ทุกอย่างจะง่ายขึ้นมาก และไม่ต้องเสียเวลา Lookup เลยแม้แต่วินาทีเดียว แต่เปลี่ยนมาเป็นใช้การสร้าง Data Model แทน ซึ่งเสียเวลาทำครั้งเดียว ต่อไปจะต้องการค่าอะไรก็ทำได้เลย

    การจะใช้ Data Model ได้นั้น ต้องมี Excel 2013 ขึ้นไป (ให้ Activate Com Add-in ที่ชื่อว่า Power Pivot) หรือจะใช้ Power BI ก็ได้

    หลักการคือ ให้เอาตารางทั้งหมดที่มีความสัมพันธ์กันเนี่ย Load เข้าสู่ Data Model ซะ ซึ่งจะโหลดผ่าน Ribbon Power Pivot หรือจะโหลดผ่านการ Close & Load to… ของ Power Query ก็ได้

    เช่น ผม add จากข้อมูลที่เป็น Table ใน Sheet Excel ดังนี้

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 8

    มันก็จะไปโผล่ในหน้าจอ Power Pivot ดังนี้

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 9

    กด icon Excel mี่มุมซ้ายบนเพื่อกลับมาใน Excel แล้ว add ตารางอื่นๆ ที่เกี่ยวข้องทั้งหมดเข้าไป

    สมมติผม add เข้าไป 3 ตารางพอใจแล้ว ก็ให้กด Diagram view ใน Power Pivot

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 10

    จากนั้นทำการลากเชื่อมความสัมพันธ์ระหว่างแต่ละตาราง (Relationship) ว่าเชื่อมกันด้วย Field ไหน

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 11

    ลากเชื่อม Relationship ให้ครบ

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 12

    จากนั้นกด icon Pivot Table ใน Ribbon ของ Power Pivot ได้เลย มันจะสร้าง Pivot Table โหมด Data Model ขึ้นมาให้

    ซึ่งจะเห็นว่าเราสามารถลาก Field คนละตารางมา Pivot รวมกันได้เลย

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 13

    ถ้าต้องการ Lookup ค่ามาทำบางอย่างต่อ

    ถ้าหากเราไม่ได้แค่จะเอา Field มา Pivot รวมกันเฉยๆ แต่ต้องการ Lookup ค่ามาทำบางอย่างต่อในตาราง เราก็สามารถทำได้เช่นกัน โดยหลังจากที่ทำ Data Model เสร็จแล้ว ให้ไปที่ Data View ของเครื่องมือ Power Pivot แล้วไปในตารางที่ต้องการ

    จากนั้นสร้างคอลัมน์ใหม่ในตารางหลักที่เราต้องการ (ฝั่งที่ความสัมพันธ์เป็น *) แล้วเรียกใช้ฟังก์ชัน RELATED ได้เลย ซึ่งมันจะให้เลือกว่าต้องการ Field ไหนจากตารางอื่น ซึ่งในที่นี้ผมต้องการชื่อ จากตาราง SalesRef

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 14

    ดังนั้นสูตรจะเขียนแค่นี้เลย

    =RELATED(SalesRef[ชื่อ])

    และเราก็ได้ค่าตามที่ต้องการ ซึ่งเร็วมากๆ เช่นกัน

    VLOOKUP ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 15

    สรุป

    ใครสนใจเรื่อง Power Query ก็สามารถไปอ่านบทความที่เป็นเนื้อหาตัวอย่างของหนังสือ Excel Power Up ของผมได้ ฟรี!

    ใครสนใจเรื่องของ Data Model ผมแนะนำให้ไปศึกษาบทความซีรีส์ Power BI ที่ผมเขียนไว้ก็ได้ครับ (ฟรี!) มีหลายตอนมากๆ ซึ่งตามความเห็นของผม การศึกษา Data Model และ DAX จาก Power BI จะเรียนรู้ง่ายกว่าทำใน Excel เพราะเครื่องมือมันพร้อมมากกว่า

    ขายของนิดนึง

    อย่างไรก็ตาม หากอยากจะใช้ Power BI ได้ดี ควรจะใช้ Pivot Table ใน Excel ให้เป็นก่อน และควรมีความเข้าใจให้ดีว่าจริงๆ แล้วตัวเลขใน Pivot มันคำนวณมาจากไหนด้วย ซึ่งผมมี หรือถ้าจะปรับพื้นเรื่องอื่นๆ เช่น Excel ทั้งหมด, Power Query, Power BI ลองไป

  • FORECAST

    FORECAST

    TLDR สรุปสั้นๆ

    FORECAST ทำนายค่าของตัวแปรตาม (y) โดยใช้การถดถอยเชิงเส้นกับค่าของตัวแปรอิสระ (x)

    คำอธิบาย

    ฟังก์ชัน FORECAST ใช้คาดการณ์หรือทำนายค่าหนึ่งในอนาคตโดยใช้ข้อมูลที่มีอยู่ ค่าในอนาคตจะเป็นค่า y สำหรับค่า x ที่กำหนด ค่าที่มีอยู่คือค่า x และ y ที่รู้จัก และค่าที่จะทำนายในอนาคตโดยคำนวณโดยใช้สมการเส้นตรง (linear regression) ฟังก์ชันนี้สามารถใช้งานเพื่อทำนายยอดขายในอนาคต ความต้องการสินค้าคงคลัง หรือลักษณะการบริโภคของลูกค้า เป็นต้น

    มีครั้งแรกในเวอร์ชันไหน

    Excel 2003 หรือก่อนหน้า

    รูปแบบคำสั่ง (Syntax)

    FORECAST(x, known_y's, known_x's)

    Arguments

    • x (Required – number)
      จุดข้อมูลที่คุณต้องการทำนาย
    • known_y’s (Required – range)
      อาเรย์หรือช่วงข้อมูลที่ต้องการการพึ่งพา
    • known_x’s (Required – range)
      อาเรย์หรือช่วงข้อมูลที่ไม่ต้องการการพึ่งพา

    ตัวอย่างการใช้งาน (Examples)

    • Formula:
      =FORECAST(30, A2:A6, B2:B6)
      Description: ทำนายค่า y จากค่า x ที่กำหนดเท่ากับ 30
      Result:10.607253 (ค่าที่ทำนายออกมาเป็นตัวเลขจริง)
    • Formula:
      =FORECAST(2025, C2:C7, B2:B7)
      Description: ทำนายราคาอสังหาริมทรัพย์ในปี 2025 โดยใช้ข้อมูลประวัติจากปี 2016 ถึง 2021
      Result:ได้ค่าทำนายราคาบ้านที่ไม่ชัดเจน เนื่องจากต้องมีข้อมูลที่สมบูรณ์ที่จะทำนาย
    • Formula:
      =FORECAST.LINEAR(5, {3, 6, 8, 4}, {1, 2, 3, 4})
      Description: คาดการณ์ค่าที่ 5 โดยใช้ชุดข้อมูลที่กำหนดไว้
      Result:คาดการณ์ค่า y ที่ประมาณค่าจำนวนจริงหนึ่งค่า
    • Formula:
      =FORECAST(50, D2:D10, C2:C10)
      Description: ใช้สำหรับทำนายยอดขายสินค้าในอนาคตโดยใช้ข้อมูลทางประวัติศาสตร์
      Result:ได้ค่าทำนายที่ใช้สำหรับประมาณยอดขายในอนาคต
    • Formula:
      =FORECAST.LINEAR(15, E2:E12, D2:D12)
      Description: ทำนายความต้องการในอนาคตโดยใช้ข้อมูลที่มีความสัมพัทธ์กันระหว่างความต้องการกับจำนวนที่ผลิต
      Result:ประมาณการค่าที่สามารถใช้ในการวางแผนการผลิต

    Tips & Tricks

    ใช้ฟังก์ชันนี้ให้มีประสิทธิภาพ คุณควรรักษาระยะห่างของข้อมูลให้สม่ำเสมอ ในกรณีที่คุณมีข้อมูลที่มีความซับซ้อนอย่างฤดูกาลที่ซับซ้อน คุณอาจต้องตรวจสอบการทำนายอีกครั้งโดยใช้เครื่องมือนอกจากตัวฟังก์ชันเพื่อประเมินความแม่นยำ

    ข้อควรระวัง (Cautions)

    ควรระวังว่าเมื่อใช้ฟังก์ชันนี้ข้อมูลที่มีความซับซ้อนอาจจะถูกประมาณไม่ครบถ้วน เนื่องจากฟังก์ชันนี้เหมาะสำหรับข้อมูลที่มีความสัมพันธ์ตัวแปรแบบเชิงเส้นเท่านั้น

    ฟังก์ชันที่เกี่ยวข้อง

    References

    ขอบคุณที่เข้ามาอ่านนะครับ ❤️

  • การคำนวณระยะเวลาคืนทุน ( Payback Period)

    การคำนวณระยะเวลาคืนทุน ( Payback Period)

    หากพูดเรื่องของการใช้ Excel เพื่อคำนวณเกี่ยวกับบัญชีการเงินการลงทุนนั้น การคำนวณระยะเวลาคืนทุนหรือ Payback Period ก็เป็นอีกเรื่องที่มีหลายคนมักถามผมมามากเช่นกัน ดังนั้นก็เลยคิดว่าน่าจะเขียนเป็นบทความเพื่อให้เกิดประโยชน์กับคนหมู่มากซะเลย

    เพื่อให้เกิดความเข้าใจง่ายที่สุด ผมขอใช้ตัวอย่างที่ Simple มากๆ เลย ดังนี้

    ตัวอย่างที่ Simple แต่ชัดเจน

    สมมติว่าเรามีเงินเข้าและเงินออกในแต่ละปี เราจะสามารถคำนวณเงินสุทธิในแต่ละปีได้ดังนี้

    เงินสุทธิ = เงินเข้า-เงินออก

    หลักๆ คือ เราต้องการทำให้เงินเข้าสุทธิเป็น + และ เงินออกสุทธิเป็น – นั่นเอง (ดังนั้นถ้าเงินออกเป็นลบอยู่แล้ว ก็ไม่ต้องไปลบมันซ้ำนะ)

    การคำนวณระยะเวลาคืนทุน ( Payback Period) 16

    หากต้องการคำนวณระยะเวลาคืนทุน วิธีที่ง่ายที่สุดคือคำนวณเงินสุทธิสะสมตั้งแต่ต้นจนจบ ดังนี้

    =SUM($C$4:C4)

    โดยใส่ $ lock แค่จุดตั้งต้น ไม่ lock จุดจบ เพื่อให้ลากไปทางขวาได้

    การคำนวณระยะเวลาคืนทุน ( Payback Period) 17

    ถามว่ามันคุ้มทุนตอนไหน?

    หากคุณตอบว่า ปีที่ 5… ถามว่ารู้ได้ไง?

    หากบอกว่าก็ดูเอา… แล้วลองคิดดูสิว่าคุณมีวิธีดูยังไง?

    คำตอบคือ ดูปีแรกที่เงินได้สะสม มากกว่าเท่ากับ 0 นั่นเอง

    วิธีเขียนสูตร Payback Period แบบเต็มปี

    เรามีวิธีเขียนสูตรได้หลายแบบ ขึ้นอยู่กับ version ของ Excel

    ถ้ามี Excel 365

    ใน Excel 365 มีตัวขี้โกงอย่าง XLOOKUP ให้ใช้ ดังนั้นจะเขียนเงื่อนไขได้ง่ายมากดังนี้

    =XLOOKUP(lookup_value,lookup_array,return_array,[if_not_found],[match_mode],[search_mode])
    =XLOOKUP(0,C6:J6,C1:J1,"-",1,1)
    • เราหาค่า lookup_value คือเลข 0
    • lookup_array คือ เงินสะสมสุทธิ C6:J6
    • return_array คือ ชื่อปีของเรา นั่นคือ C1:J1

    โดยที่ใส่ match_mode เป็น 1 ซึ่งแปลว่าให้หา Exact match or next larger item นั่นคือ จะได้ค่า 0 หรือมากกว่า

    การคำนวณระยะเวลาคืนทุน ( Payback Period) 18

    ส่วน Search Mode เราจะเลือก Mode 1 เพื่อให้หาตั้งแต่แรกสุดไล่ไปหลังสุด (จริงๆ เป็นค่า default อยู่แล้ว แต่ผมใส่ให้ชัดเจน)

    การคำนวณระยะเวลาคืนทุน ( Payback Period) 19

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

    การคำนวณระยะเวลาคืนทุน ( Payback Period) 20

    ถ้าไม่มี Excel 365

    วิธีที่ผมคิดว่าง่ายที่สุด คือใช้ MATCH ร่วมกับ INDEX ซึ่งผมจะใช้ MATCH หาก่อนว่าตัวไหนคือตัวแรกที่มากกว่าหรือเท่ากับ 0 ดังนี้

    =MATCH(1,1/(C6:J6>=0),0)
    **ถ้าไม่ใช่ Excel 365 ต้องกด Control+Shift+Enter ด้วยนะ เพราะเป็นสูตร Array

    จากนั้นพอเราได้ลำดับว่าเลขที่มากกว่าหรือเท่ากับ 0 ตัวแรกอยู่ที่ไหน ก็สามารถเอาค่ากลับมาได้ด้วย INDEX ดังนี้

    =INDEX(C1:J1,ค่าที่ MATCH ได้)

    สรุปรวบสูตรได้ดังนี้

    =INDEX(C1:J1,MATCH(1,1/(C6:J6>=0),0))
    **ถ้าไม่ใช่ Excel 365 ต้องกด Control+Shift+Enter ด้วยนะ เพราะเป็นสูตร Array
    การคำนวณระยะเวลาคืนทุน ( Payback Period) 21

    วิธีเขียนสูตร Payback Period แบบคิดเป็นสัดส่วนของปีได้

    แบบนี้หลักการคือ ถ้าเรารู้ค่าของ 2 ปีที่คร่อมเลข 0 อยู่ ให้มองเหมือนเป็นรูปสามเหลี่ยมแล้วดูว่าค่าที่ทำให้เงินสะสมสุทธิเป็น 0 พอดีคือปีที่เลขอะไร? ซึ่งจะเทียบ Ratio สามเหลี่ยมคล้ายก็ได้ แต่ผมจะใช้ฟังก์ชัน FORECAST มาช่วยดังนี้

    การคำนวณระยะเวลาคืนทุน ( Payback Period) 22

    แปลว่าถ้าผมรู้ยอดเลขสะสมแต่ละปีที่คร่อม 0 อยู่ ผมก็จะคำนวณแบบละเอียดได้ ดังนั้นจึงเขียนเพิ่มดังนี้

    ถ้ามี Excel 365

    Payback period excel คำนวณระยะเวลาคืนทุน

    ถ้าไม่มี Excel 365

    Payback period excel คำนวณระยะเวลาคืนทุน

    ถ้าจะแปลงปีละเอียดแบบทศนิยมให้เป็น ปี กับ เดือน ล่ะ?

    วิธีที่เข้าใจง่ายที่สุดก็คือใช้ INT เพื่อเอาเลขจำนวนเต็ม แล้วค่อยลบกันเพื่อเอาเลขทศนิยม

    จากนั้นค่อยเอาเลขทศนิยมไปคูณ 12 ให้เป็นเดือน

    ทีนี้เพื่อให้มันเป็นเดือนแบบเต็มๆ เลยใช้ ROUNDUP ปัดขึ้นอีกทีนึง สรุปได้ดังนี้

    Payback period excel คำนวณระยะเวลาคืนทุน

    เรื่องของ Time Value of Money

    ปกติแล้ว การคำนวณ Payback Period หรือระยะเวลาคืนทุนนั้นจะไม่สนใจเรื่อง Time Value of Money (หรือคุณค่าของเงินที่ลดลงตามกาลเวลา) ดังนั้นถ้าคุณจะแคร์เรื่องนี้ด้วย อย่าลืมประยุกต์ใช้พวก PV มา Discount Cashflow ก่อนจะคิด Payback Period ด้วยล่ะ

    สรุป

    เป็นยังไงบ้างกับการคิดระยะเวลาคืนทุนที่ผมนำเสนออันนี้ครับ ใครทำแล้วติดขัดอะไร หรืออยากให้ทำอะไรเพิ่มตรงไหนก็บอกได้เลยนะ

  • การฝึก Excel และ การจับตะเกียบ

    การฝึก Excel และ การจับตะเกียบ

    เมื่อวานเย็นผมพาลูกชายไปกินข้าวเย็นที่ร้านอาหารญี่ปุ่นแห่งหนึ่ง เค้ากินด้วยความเอร็ดอร่อย แต่ก็เกิดปัญหาเล็กๆ บางอย่างขึ้นระหว่างที่เรากิน นั่นก็คือ อาหารบางส่วนที่ลูกชายผมกินนั้นหกเลอะเทอะ

    สาเหตุที่หกก็เพราะว่าลูกชายผมใช้ส้อมจิ้มอาหารกิน ซึ่งอาหารบางชิ้นอาจจะบางไป หรือเล็กไป ไม่เหมาะกับการใช้ส้อมจิ้ม ทำให้อาหารหล่นง่าย

    ลูกชายผมสงสัยว่าทำไมอาหารของผมถึงไม่หกบ้าง ผมก็อธิบายลูกชายว่า เป็นเพราะผมใช้ตะเกียบคีบได้อย่างถูกวิธี มันจึงคีบได้มั่นคงและคีบอาหารได้ทุกอย่าง ไม่ว่าจะหนาบาง เล็กใหญ่แค่ไหน (พูดง่ายๆ คือคีบได้ทุกอย่าง ยกเว้นน้ำ 555)

    ระหว่างนั้นเองทำให้ผมฉุกคิดได้ว่า เอ..จริงๆ ลูกชายและภรรยาผมก็เคยฝึกใช้ตะเกียบนี่นา แต่ทำไมสุดท้ายทั้งสองคนปัจจุบันยังใช้ตะเกียบได้ไม่ถูกวิธีล่ะ?

    จะว่าไปแล้วการฝึกใช้ตะเกียบนั้นก็มีอะไรคล้ายกับการฝึก Excel หลายอย่างเหมือนกันนะ และนี่ก็คือสิ่งที่ผมคิดว่ามันเหมือนกัน

    ฝึกจับตะเกียบเหมือนฝึก Excel ยังไง?

    ที่ว่าคล้ายนั้นมีหลายประเด็นเลย เช่น การฝึกจับตะเกียบอย่างถูกวิธีนั้น (จับแล้วเป็นสามเหลี่ยมปลายแหลม) ช่วงแรกๆ จะรู้สึกว่าไม่ถนัดและรู้สึกว่ามันยาก เราเลยท้อไปซะก่อนและพยายามหนีไปที่ทางออกที่ง่ายกว่า….

    ทางออกแรกนั่นคือ ใช้ช้อนส้อมไปซะเลย พอกันทีกับตะเกียบ บางทีก็อาจจะรู้สึกว่าช้อนส้อมก็ทำงานได้ดีมากแล้ว ไม่เห็นต้องใช้ตะเกียบเลยก็ได้

    หรือไม่ก็ไปทางออกที่สอง นั่นคือ ก็ใช้ตะเกียบต่อไปนี่แหละ แต่ไม่ต้องเป็นวิธีแบบถูกต้องก็ได้ คีบเอาจนกว่าจะได้ก็พอ คีบได้แค่บางอย่างก็ยังดี (ซึ่งมักจะจับตะเกียบออกมาเป็นรูปกากบาททุกที) ซึ่งคนที่ใช้วิธีนี้สุดท้ายแล้วมักจะลงเอยที่ว่า “ชินกับวิธีนี้ไปแล้ว” จนฝึกวิธีที่ถูกต้องได้ยากมากขึ้นไปอีก (เรียกได้ว่าการ unlearn นั่นยากมากทีเดียว)

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

    เรื่องของการฝึก Excel

    การเรียน Excel ก็เช่นกัน การใช้ Excel ได้อย่างดีนั้นต้องเข้าใจพื้นฐานของมันอย่างถูกต้อง รวมถึงการใช้ Tool บางอย่างใน Excel ช่วงแรกอาจรู้สึกว่าไม่คุ้น หรือทำแล้วเกิดปัญหาแล้วรู้สึกว่ายาก ทำให้อยากหลบไปใช้วิธีที่ตัวเองคุ้นเคยมากกว่า สุดท้ายเราเลยไม่ได้เรียนรู้ Tool ใหม่ๆ นั้นอย่างเต็มที่ และไม่ได้ปลดปล่อยพลังที่แท้จริงออกมา

    ยกตัวอย่างเช่น

    • คนที่หัดใช้ Excel ใหม่ๆ อาจอยากหนีกลับไปกดเครื่องคิดเลขแล้วเอามากรอกในตาราง Excel (ทั้งๆ ที่คนที่ใช้เป็นแล้วจะไม่กลับไปใช้เครื่องคิดเลขอีก)
    • คนที่หัดใช้ การเขียนสูตรเพื่อแก้ปัญหาแยกชื่อกับนามสกุล สุดท้ายอาจท้ออาจหนีไปวิธีที่ง่ายกว่าเช่น Flash Fill หรือ Text to Column ซึ่งไม่สามารถทำงานแบบอัตโนมัติได้
    • คนที่หัดใช้ Pivot Table ใหม่ๆ อาจหนีไปใช้การ Filter ข้อมูลแล้ว Sum เอาเอง ทำให้เกิดการ Manual ทำงานเช่นกัน ไม่อัตโนมัติ และช้าด้วย
    • คนที่หัดใช้ Power BI ใหม่ๆ อาจอยากหนีกลับไปใช้ Pivot Table ที่ตัวเองคุ้นเคย ซึ่งทั้งที่จริงแล้วความสามารถของ Power BI นั้นมีมากกว่า Pivot Table ธรรมดาหลายเท่าแท้ๆ
    • คนที่หัดใช้ Power Query แล้วติดปัญหา สุดท้ายอาจจบที่การหนีไปใช้วิธีอื่นที่ตัวเองคุ้นเคย หรือแม้กระทั่งยอมทำ Manual Copy ไฟล์หลายไฟล์มารวมกัน นี่ยิ่งไม่อัตโนมัติเข้าไปใหญ่เลย..

    สรุป

    ดังนั้นสิ่งที่อยากบอกก็คือ เวลาฝึก Skill หรือ Tool ใหม่ๆ นั้น มันจะเจอความยากและความไม่ชินแน่นอน “ขอให้มีความอดทน อย่าเพิ่งรีบหนีกลับไปทำวิธีที่เราคุนเคยเร็วเกินไป” ให้พยายามฝึก Tool ใหม่อย่างเต็มที่ก่อน

    พอเรารู้จัก Tool ใหม่ๆ และใช้มันเป็นแล้ว “สุดท้ายเราจะมี Tool ให้เลือกเยอะขึ้น ซึ่งเราจะสามารถเลือกนำมาใช้ให้เหมาะกับทุกสถานการณ์ที่เราจะเจอได้” เช่น ถ้าเจอของชิ้นเล็กๆ หรือบางๆ เราก็ใช้ตะเกียบได้ ถ้าเจอน้ำเราใช้ช้อนตัก (หรือยกซด) ได้ แน่นอนว่าทำเป็นหลายวิธีย่อมดีกว่าจริงมั้ยครับ?

    แล้วเพื่อนๆ ล่ะ คิดยังไงกับเรื่องนี้? และเคยหัดอะไรใหม่ๆ แล้วอยากจะหนีกลางทางกลับไปทำวิธีเดิมมั้ย? ถ้าเคย เอาชนะใจตัวเองยังไง? มาแชร์กันหน่อยครับ

  • วิธีคำนวณค่าเสื่อมราคาใน Excel ภาค 2 : ค่าเสื่อมแบบช่วงเวลาไม่เต็มปี (Partial Depreciation)

    วิธีคำนวณค่าเสื่อมราคาใน Excel ภาค 2 : ค่าเสื่อมแบบช่วงเวลาไม่เต็มปี (Partial Depreciation)

    หลังจากที่ผมได้ Post สอนวิธีคำนวณค่าเสื่อมราคาใน Excel (Depreciation) ไปแล้ว ก็ได้รับการตอบรับอย่างดีจากแฟนเพจทุกท่าน แต่ก็ได้มีคำถามเพิ่มเติมมาว่า อยากจะคำนวณค่าเสื่อมราคาแบบที่ไม่เต็มปีด้วย นั่นคือมีระบุวันที่ซื้อทรัพย์สินมา ซึ่งอาจจะซื้อในเดือนที่ 4 ของปี เป็นต้น แบบนี้จะคำนวณค่าเสื่อมอย่างไร?

    หลักการทุกอย่างยังคงเหมือนเดิมทุกประการ แค่ Period ของการนับเวลาในปีแรก กับปีสุดท้ายจะมีการเลื่อนไป ยกตัวอย่างเช่น สมมติซื้อเครื่องจักรอายุ 5 ปี แต่ซื้อที่เดือนที่ 4 แทนที่จะมองว่าทุกปีมีระยะเวลาคิดค่าเสื่อม 12 เดือน เป็นเวลา 5 ช่วง ก็ให้คิดว่าในช่วงปีแรกก็คิดค่าเสื่อมแค่ 8 เดือน (เดือนที่ใช้งานจริงๆ) ส่วนปีสุดท้าย (คือช่วงปีที่ 6 ) ก็คิดค่าเสื่อมแค่ 4 เดือนเป็นต้น นอกนั้นอีก 4 ช่วงที่อยู่ตรงกลางก็คิด ช่วงละ 12 เดือนตามปกติ นั่นเอง

    ความละเอียดของช่วงเวลา

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

    ลองมาดูกันว่าถ้าใน Excel จะเป็นยังไง ถ้าซื้อเครื่องจักรอายุ 5 ปี แต่ซื้อที่วันที่ 20/4/2020 โดยมีมูลค่า 100,000 ค่าซาก 10,000 เหมือนเดิม

    วิธีคิดค่าเสื่อมแบบเส้นตรงแบบไม่เต็มปี (Partial year’s Straight Line depreciation)

    โดยที่เราจะเพิ่มคอลัมน์จำนวนเดือนที่ใช้งานเครื่องจักรในแต่ละปี เพื่อเป็นตัวช่วยคำนวณสัดส่วนที่จะคิดกับค่าเสื่อม ดังนี้

    Partial Depreciation
    =IF(A7=YEAR($F$1),12-$F$2,
    IF(A7=YEAR($F$1)+$B$2,$F$2,
    IF(OR(A7<YEAR($F$1),A7>YEAR($F$1)+$B$2),0,
    12)))

    ความหมายคือ

    • ถ้าปีที่คิดค่าเสื่อมตรงกับปีที่ซื้อเครื่องจักร ให้เอาเดือนที่เหลือในปีนั้น
    • ถ้าปีที่คิดค่าเสื่อมตรงกับปีสุดท้ายที่จะใช้งานเครื่องจักร ให้เอาเดือนที่ซื้อมา
    • ถ้าปีไม่อยู่ในช่วงคิดค่าเสื่อม ให้จำนวนเดือนเป็น 0 เดือน
    • นอกนั้นให้เอาจำนวนเดือน 12 เดือน

    ส่วนตัวค่าเสื่อมราคา ก็แค่เอาค่าเสื่อมเส้นตรงแบบที่สอนในตอนที่แล้วไปคูณจำนวนเดือนที่ใช้แล้วหารด้วย 12 ก็จบแล้ว ดังนี้

    สูตรคณิตศาสตร์

    =($B$1-$B$3)*(1/$B$2)  
    *B7/12

    สูตร Excel

    =SLN($B$1,$B$3,$B$2)  
    *B7/12

    วิธีคิดค่าเสื่อมแบบ Double Decline แบบไม่เต็มปี (Partial year’s Double Declining Balance depreciation)

    ทีนี้ถ้าเกิดเป็นการคิดค่าเสื่อมแบบไม่ใช่เส้นตรงจะทำยังไง? จริงๆ มันก็หลักการเดิมเลยครับ ซึ่งเราจะคำนวณระยะเวลาที่ใช้เครื่องจักรออกมาก่อนด้วยสูตรเดิม

    และเราจะใช้ฟังก์ชัน VDB มาใช้ ซึ่งมันรองรับการคิดแบบเป็น Period อยู่แล้ว แต่เราจะปรับหน่วยของ Period ให้เป็นเดือน

    สูตร Excel

    =VDB( cost, salvage, life, start_period, end_period, [factor], [no_switch] )

    ดังนั้น life แทนที่จะใส่ 5 ปี เราจะใส่เป็น 5*12 เดือน แทน

    ส่วน start กับ end ก็ขึ้นอยู่ว่าจะคิดช่วงไหน ซึ่งผมจะขอสร้างคอลัมน์เพิ่มเพื่อให้เข้าใจง่ายขึ้น โดยพยายามสะสมค่า period ที่ใช้ไปเรื่อยๆ

    โดยที่ตอนคิดค่าเสื่อมก็ใช้ VDB ดังนี้

    =VDB($B$1,$B$3,$B$2*12,C7,D7)
    วิธีคำนวณค่าเสื่อมราคาใน Excel ภาค 2 : ค่าเสื่อมแบบช่วงเวลาไม่เต็มปี (Partial Depreciation) 23

    สรุป

    หลักการคิดค่าเสื่อมแบบ Partial หลักการก็เหมือนกับคิดค่าเสื่อมปกติ แค่มีเรื่องต้องคิดสัดส่วนการใช้กรณีที่ใช้ไม่เต็มปีเท่านั้นเอง ยังไงลองเอาไปปรับใช้ดูได้นะครับ

  • วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง

    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง

    ผมเพิ่งมีโอกาสได้ดูหนังเรื่อง TENET ของโนแลน ไปเมื่อวานนี้เอง (ใครเป็นคอหนัง Sci-Fi นี่พลาดไม่ได้เลยนะ) ซึ่งผมชอบในหลายๆ ประเด็นของเรื่องนี้มาก และแน่นอนว่าที่มันเท่ที่สุดก็คือ Concept การย้อนเวลาในเรื่องนั่นเอง

    (ถ้าใครยังไม่ได้ดู และไม่อยากรู้ Concept การย้อนเวลาในเรื่องนี้ ไม่ต้องอ่านต่อนะ แต่เอาจริงมันไม่ได้สปอยเนื้อหาหรอก แค่สปอยหลักการย้อนเวลาในหนัง ซึ่งแทบไม่กระทบอะไรเลย)

    .

    .

    .

    .

    .

    ในเรื่องนี้การย้อนเวลาแบบไม่ได้เหมือนกับเรื่องอื่น นั่นก็คือในเรื่องนี้ใช้การย้อนเวลาด้วยการย้อนกลับของเอ็นโทรปี (Entropy) ซึ่งทำให้เกิดการย้อนเวลาแบบวิ่งสวนทางกับเหตุการณ์ปกติไปเลย

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

    ซึ่งนั่นก็คือที่มาของ Post นี้แหละ เราจะมาทำการกลับตัวอักษรหน้าหลังกันด้วย Excel ซึ่งจะทำด้วยหลากหลายวิธีครับ

    Version คลิปวีดีโอ

    กลับด้านโดยเขียนสูตรด้วย Excel 365

    เราจะเริ่มจากการใช้ MID สกัดตัวอักษรแต่ละตัวออกมาแบบ Array Formula แต่แทนที่จะสกัดจากหน้าไปหลัง เราจะสกัดจากหลังไปหน้าแทน โดยใช้ SEQUENCE มาช่วยสร้างเลขที่เริ่มจากจำนวนตัวอักษรที่มี (LEN) ย้อนกลับไปทีละ -1 เช่น

    =SEQUENCE(LEN(A2),,LEN(A2),-1)
    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง 24

    จากนั้นค่อยเอา SEQUENCE ที่ได้ไปใส่ใน Start Number ของ MID แล้วเอามาทีละ 1 ตัว

    =MID(A2,SEQUENCE(LEN(A2),,LEN(A2),-1),1)
    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง 25

    สุดท้ายค่อยประกอบร่างข้อมูลแต่ละตัวอักษรกลับเป็นคำเดียวกันด้วย TEXTJOIN โดยใช้แบบไม่มีตัวคั่น

    =TEXTJOIN("",TRUE,MID(A2,SEQUENCE(LEN(A2),,LEN(A2),-1),1))
    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง 26

    หรือจะใช้ CONCAT ก็ได้ถ้าเราจะไม่มีตัวคั่นอยู่แล้ว

    =CONCAT(MID(A2,SEQUENCE(LEN(A2),,LEN(A2),-1),1))
    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง 27

    แค่นี้ก็ได้คำตอบแล้วล่ะ!

    กลับด้านโดยเขียนสูตรด้วย Google Sheets

    หลักการจะคล้ายๆ ใน Excel แต่ว่าใน Google Sheets ใส่ SEQUENCE ทำให้เลขวิ่งถอยหลังไม่ได้ แต่อันนี้พลิกแพลงเล็กน้อยโดยใช้พวก SORT มาช่วยดังนี้ (สร้างเลข SEQUENCE แล้วเรียงย้อนกลับ)

    =sort(SEQUENCE(LEN(A2)),1,false)
    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง 28

    จากนั้นก็ยัดเข้าไปใน MID เหมือนเดิม แต่ใน Google Sheets ต้องใส่ ARRAYFORMULA ครอบเข้าไปถึงจะเห็นผลลัพธ์หลายตัวได้

    =ARRAYFORMULA(mid(A2,sort(SEQUENCE(LEN(A2)),1,false),1))

    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง 29

    จากนั้นก็จับรวบด้วย TEXTJOIN ซะเลย

    =TEXTJOIN("",true,ARRAYFORMULA(mid(A2,sort(SEQUENCE(LEN(A2)),1,false),1)))
    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง 30

    กลับด้านโดยใช้ Power Query

    ก่อนอื่นเอาข้อมูลเข้าไปแล้ว สร้าง Custom Column เพื่อแปลง Text ให้เป็น List ดังนี้ (อ่านเพิ่มเติมได้ที่นี่)

    =Text.ToList([ข้อความเดิม])
    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง 31

    จากนั้นเราก็เรียง List ย้อนกลับด้วย Custom Column เช่นเคย

    =List.Reverse([Custom])
    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง 32

    แล้วเราค่อยจับรวมกันด้วย Text.Combine

    =Text.Combine([Custom.1])

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

    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง 33

    ถ้าจะเขียนรวบทั้งหมดเลยใน Custom Column ช่องเดียวก็ได้เช่นกัน ซึ่งจะเขียนสั้นๆ ได้ว่า

    =Text.Combine(List.Reverse(Text.ToList([ข้อความเดิม])))
    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง 34

    แน่นอนว่าผมสามารถเอามาสร้าง Custom Function ก็ได้ เช่น

    = (originalText as text) as text=> 
    Text.Combine(List.Reverse(Text.ToList(originalText)))
    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง 35

    จากนั้นผมก็จะเอาฟังก์ชัน TENET ไปเรียกใช้กับข้อความอะไรก็ได้

    เช่น ผมเอารายชื่อจังหวัดจากใน Wikipedia มา แล้วเรียกใช้ฟังก์ชัน TENET ที่เพิ่งสร้างขึ้นโดยการกด Invoke Custom Function

    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง 36

    ก็จะเห็นว่าตัวอักษรเรียงย้อนกลับได้แล้ว 555

    วิธีเขียนสูตรย้อนเวลาแบบ TENET ให้ตัวอักษรกลับหน้าหลัง 37

    สรุป

    นี่ก็เป็นตัวอย่างแนวทางของการกลับตัวอักษรให้มองย้อนแบบใน TENET ครับ เพื่อนๆ ชอบแบบไหนก็แชร์กันได้นะ

    เราสามารถเอาเทคนิคนี้ไปประยุกต์ใช้ทำรหัสลับส่งให้เพื่อนเล่นๆ ได้นะ ยิ่งถ้า shift ตัวอักษรด้วยนี่ยิ่งยากเลย อิอิ

    ว่าแล้วก็ขอส่งท้ายด้วยคำนี้

    นา่ทกุทนา่อู้ผณุคบอข
    
    ์ลฟไ้ดไกายอา้ถ xslx.txetdrawkcab-tenet/retsam/war/daolnwod/lecxEpehT/moc.buhtig//:sptth ะน้ีนนใปไา้ขเ
    
  • วิธีคำนวณค่าเสื่อมราคาใน Excel (Depreciation)

    วิธีคำนวณค่าเสื่อมราคาใน Excel (Depreciation)

    มีแฟนเพจถามคำถามเกี่ยวกับวิธีคำนวณค่าเสื่อมราคาใน Excel มาครับ ผมเห็นว่าหลายคนน่าจะสนใจ เลยทำบทความตอบเลยละกัน

    ไม่ต้องพูดอะไรมาก จะคำนวณอะไรก็ตามได้เราควรต้องเข้าใจความหมายของมันก่อน ดังนั้นมาเริ่มกันจากคำถามที่ว่าค่าเสื่อมราคาคืออะไรกันแน่?

    ค่าเสื่อมราคาคืออะไร?

    ค่าเสื่อมราคา หรือ Depreciation คือ ค่าใช้จ่ายที่หักลบออกจากมูลค่าของสินทรัพย์ที่กิจการใช้ประโยชน์ประจำงวดบัญชี ซึ่งเจ้าค่าเสื่อมราคาเนี่ยไม่ใช่ค่าใช้จ่ายที่เป็นเงินสดนะครับ แต่เป็นค่าใช้จ่ายทางบัญชีแบบนึง

    ยกตัวอย่างเช่น กิจการของเราซื้อเครื่องจักรมาใช้งาน ตอนแรกเราซื้อเครื่องจักรที่มีมูลค่า 100,000 บาท ในทางบัญชีเราจะไม่ได้มีค่าใช้จ่ายตู้มเดียว 100,000 เลย (แม้ว่าในทางเงินสดจะจ่ายตู้มเดียว) แต่จะค่อยๆ แบ่งค่าใช้จ่ายไปตามระยะเวลาที่ใช้งาน

    สมมติว่าอายุการใช้งานของเครื่องจักรคือ 10 ปี แล้วสมมติพอครบ 10 ปีแล้วมันจะเจ๊งจนกลายเป็นเศษเหล็กที่มูลค่าซาก (Salvage Value) เหลือ 10,000 บาท แบบนี้ถ้าดูตาม Common Sense แล้วเจ้าเครื่องจักรเนี่ยต้องมีมูลค่าลดลงเรื่อยๆ ตามกาลเวลาใช่มั้ยล่ะครับ?

    ไอ้มูลค่าเครื่องจักรที่ลดลงเรื่อยๆ เนี่ยแหละ เกิดจากมูลค่าเครื่องจักรที่ถูกหักค่าเสื่อมราคาออกไปเรื่อยๆ นั่นเอง ซึ่งปกติก็จะคำนวณค่าเสื่อมราคาทุกปีๆๆ ไป แล้วก็สะสมกลายเป็น ค่าเสื่อมราคาสะสม

    ทีนี้วิธีคำนวณค่าเสื่อมราคานั้นจริงๆ มีหลายแบบมากเลย แต่แบบที่จะได้ยินบ่อยๆ จะมี 2 แบบ คือ มูลค่าลดลงแบบเป็นเส้นตรง (Straight Line) กับลดเยอะช่วงแรก (Double Decline)

    วิธีคำนวณค่าเสื่อมราคาแบบเส้นตรง (Straight Line)

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

    Depreciation ต่อปี (แบบเส้นตรง) = 
    ( มูลค่าตอนแรก - ค่าซาก )/จำนวนปี

    ซึ่งใน Excel ก็มีสูตรสำเร็จรูปให้ใช้ด้วย นั่นคือ SLN (Straight Line)

    SLN( cost, salvage, life )

    แปลว่าเราสามารถเขียนสูตรแบบใช้คณิตศาสตร์ง่ายๆ หรือจะใช้ฟังก์ชัน SLN นี้ก็ได้เช่นกัน ง่ายทั้งคู่เลยล่ะ

    วิธีคำนวณค่าเสื่อมราคาใน Excel (Depreciation) 38

    จะเห็นว่าพอสร้างตารางเพื่อดูมูลค่าคงเหลือของเครื่องจักรในแต่ละปี ก็จะเห็นว่ามูลค่าค่อยๆ ลดลงด้วยปริมาณที่คงที่ และสุดท้ายมูลค่าไปจบที่ค่าซากพอดีนั่นเอง นี่คือลักษณะของการคิดค่าเสื่อมแบบเส้นตรงครับ

    วิธีคำนวณค่าเสื่อมราคาแบบยอดลดลงทวีคูณ (Double Decline Balance)

    วิธีนี้จะมีหลักการคือ เป็นการมองว่าปีแรกๆ ควรจะมีค่าเสื่อมราคาเยอะสุด แล้วในช่วงหลังจะค่อยๆ น้อยลงเรื่อยๆ

    โดยจะคิดอัตรา % ค่าเสื่อมเป็น 2 เท่าของแบบเส้นตรง (เลยเรียกว่า Double Decline) แต่จะคิดจากมูลค่าสินทรัพย์คงเหลือในแต่ละปีที่จ่ายค่อยๆ ลดลงด้วยโดยที่ไม่ได้หักค่าซากก่อนเหมือนของแบบเส้นตรงนะ

    เช่น สถานการณ์เดิม ถ้าเป็นแบบเส้นตรง อัตราค่าเสื่อมจะเป็น 20% (เกิดจาก 1/5 ปี) แต่พอใช้ Double Decline Balance จะใช้อัตรา 2 เท่า นั่นคือ 2*20% = 40% นั่นเอง

    ซึ่งใน Excelก็มีฟังก์ชันสำเร็จรูปเช่นกัน นั่นคือ

    =DDB( cost, salvage, life, period, [factor] )

    ซึ่ง period จะทำให้เราสามารถแสดงได้เลยว่าจะดู Depreciation ณ ปีไหน (เพราะมันไม่เท่ากัน)

    สรุปแล้วสามารถทำออกมาเป็นตารางได้ดังนี้

    วิธีคำนวณค่าเสื่อมราคาใน Excel (Depreciation) 39

    จะเห็นว่าถ้าใช้สูตรคณิตศาสตร์ธรรมดา จะมีปัญหากับช่วงหลังที่จะได้ทำให้เหลือค่าซากพอดี ซึ่งอาจต้องใช้ IF หรือพวก MIN มาช่วยถึงจะถูกต้อง ดังนั้นหากใช้ฟังก์ชัน DDB ของ Excel จะไม่มีปัญหาเรื่องหักจนเกินค่าซากเลย

    อย่างไรก็ตาม มันก็จะยังมีกรณีที่ค่าเสื่อมไม่พอที่จะหักไปจนถึงค่าซาก เช่น ถ้าให้ค่าซากเป็น 100 จะเห็นว่าค่าเสื่อมพอครบ 5 ปีแล้วก็ยังไม่พออยู่ดี ซึ่งเจ้าฟังก์ชัน DDB ก็จะไม่ได้ Adjust ตรงนี้ให้เรานะครับ

    วิธีคำนวณค่าเสื่อมราคาใน Excel (Depreciation) 40

    ดังนั้นในชีวิตจริง หลายๆ เคสที่ต้องการใช้ Double Decline Balance จะมีแนวคิดเพิ่มเติมอีกนิดว่า จะลองเทียบกับการคำนวณค่าเสื่อมราคาแบบเส้นตรงด้วยแล้วเอาค่าที่มากกว่า เพื่อทำให้แน่ใจว่ามูลค่าคงเหลือจะจบที่ค่าซากได้อย่างที่ตั้งใจไว้

    ซึ่งใน Excel ก็จะมีฟังก์ชันสำเร็จรูปให้ใช้ นั่นคือ VDB (Variable Declining Balance) นั่นเอง

    =VDB( cost, salvage, life, start_period, end_period, [factor], [no_switch] )

    ดังนั้นแทนที่จะใช้ DDB เราจะใช้ VDB เพื่อจัดการเรื่องนี้แทนครับ ซึ่งต้องระบุเรื่องที่แปลกว่า DDB นิดหน่อย คือ Start_Period กับ End_Period ที่จะคำนวณค่าเสื่อม เช่น ถ้าจะคำนวณค่าเสื่อมของปีที่สองให้ใส่ Start เป็น 1 และ End เป็น 2 ครับ

    วิธีคำนวณค่าเสื่อมราคาใน Excel (Depreciation) 41

    สรุป

    เพื่อนๆ อ่านแล้วเป็นยังไงกันบ้าง? ใครทำงานบัญชี สามารถช่วยแชร์ความรู้ได้นะครับ ^^

    ความเห็นของผมคือ สาเหตุนึงที่ทำให้การคิดค่าเสื่อมแบบเส้นตรงเป็นที่นิยมกว่า เพราะมันง่าย ไม่ต้องมาเจอปัญหาปวดหัวแบบพวก Double Decline พวกนี้นั่นเองครับ แต่ถ้าจะใช้ Double Decline ใน Excel ผมก็แนะนำให้ใช้ VDB ดีกว่า DDB ครับ เพราะจะแก้ปัญหาตอนจบเรื่องค่าซากได้ด้วย

    สำหรับใครที่สนใจการคำนวณค่าเสื่อมแบบไม่เต็มปี สามารถอ่านต่อได้ที่นี่

  • สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters)

    สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters)

    ผมได้รับคำถามมาจากแฟนเพจหลายคนเกี่ยวกับวิธีการ Clean ข้อความขยะ หรือกำจัดเอาอักขระที่ไม่ต้องการออกจากข้อความ ซึ่งบางครั้งมันก็ง่ายมาก (แค่หลายคนยังไม่รู้ ) แต่บางทีมันก็ยากเอาเรื่องเลยล่ะ วันนี้ผมก็เลยถือโอกาสเอามาเขียนเป้นบทความดีกว่าว่าเรามีวิธีการจัดการยังไงได้บ้าง?

    ผมมีข้อมูลเป็นชื่อนามสกุลดังนี้ ปรากฏว่ามันไม่สามารถ lookup เทียบกับอีกค่าที่ผมเตรียมไว้ได้ พอเอามาเช็คก็พบว่าค่ามันไม่เท่ากันจริงๆ

    สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters) 42

    บางช่องก็เห็นชัดว่ามันไม่เหมือนกัน เช่น มีช่องว่างติดมา แต่บางช่องดูแล้วก็ไม่น่าติดอะไร ทำไมมันถึงไม่เท่ากัน?

    แนวทางการทำความสะอาดข้อมูล ผมแนะนำให้เริ่มจากวิธีที่ง่ายที่สุด 2 อย่างก่อน นั่นคือ CLEAN และ TRIM

    ตัดตัวประหลาดและการขึ้นบรรทัดใหม่ด้วย CLEAN

    ฟังก์ชันนี้มีหน้าที่ในการตัดอักระที่มองไม่เห็น 32 ตัวแรกของรหัส ASCII ออกไป (ซึ่งคือ Code 1-31) (รวมถึงการขึ้นบรรทัดใหม่ซึ่งคือ Code ตัวที่ 10 ด้วย) ถ้าอยากรู้ว่ารหัสแต่ละตัวคืออะไร สามารถใส่เลข Running 1-255 แล้วใช้ฟังก์ชัน CHAR สร้างอักขระดูได้ดังนี้

    สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters) 43

    ดังนั้นถ้าเราใช้ CLEAN กับข้อมูลของเราที่มีการขึ้นบรรทัดใหม่ด้วย CHAR(10) มันก็จะหายไป

    ตัดช่องว่างส่วนเกินออกด้วย TRIM

    TRIM เป็นฟังก์ชันที่ผมคิดว่าเจ๋งมากระดับที่สามารถช่วยให้ชีวิตของหลายๆ คนดีขึ้นหลายเท่าเลยล่ะ เพราะมันเกิดมาเพื่อจัดการปัญหาสุด Classic นั่นก็คือ มีการเว้นวรรคเกินมาข้างหน้าบ้างข้างหลังบ้าง รวมถึงเว้นระหว่างคำที่ดันเว้นไม่เป็นมาตรฐาน เช่น เคาะเท่ากันบ้างไม่เท่ากันบ้าง (หลายคนมักจะไม่ชอบการเคาะครั้งเดียวเพราะคิดว่าไม่สวย เลยหวังดีเคาะไป 2-3 รอบ ก็ทำให้เกิดปัญหาได้มากเหมือนกัน)

    หลายคนมักจะไม่ชอบการเคาะครั้งเดียวเพราะคิดว่าไม่สวย เลยหวังดีเคาะไป 2-3 รอบ ก็ทำให้เกิดปัญหาได้มากเหมือนกัน

    แต่ปัญหาเหล่านี้จะหมดไปหากใช้ TRIM ใน Excel เพราะมันจะตัดช่องว่างที่อยู่ข้างหน้าทั้งหมด ข้างหลังทั้งหมด แต่จะตัดช่องว่างตรงกลางที่เกิน 1 เคาะให้เหลือแค่เคาะเดียว

    สรุปแล้วหลังจากใช้ TRIM แล้วจะเหลือแบบนี้

    สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters) 44

    เอาอักขระออกแบบเจาะจงด้วย SUBSTITUTE

    จะเห็นว่า Clean กับ TRIM สามารถจัดการปัญหาไปได้ในหลายๆ เคสแล้ว แต่ก็ยังมีบางกรณีที่เราเอาไม่ออก เช่น สมมติว่ามี . เกินมา และสมมติว่าเราต้องการเอา . ออกไปจากคำของเรา (ไม่ว่ามันจะอยู่ตรงไหนก็ถาม)

    เราสามารถใช้ SUBSTITUTE ซึ่งความสามารถจริงๆ คือการแทนที่ คำเดิม ด้วย คำใหม่อีกคำนึง ได้ แต่คราวนี้เราจะเอาคำเดิมออก (“.”) แล้วไม่ใส่อะไรเข้าไปแทนเลย (ใส่แทนด้วย “”) เช่น

    สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters) 45

    ตรวจสอบจำนวนตัวอักษรด้วย LEN

    ทีนี้ก็เหลือตัวประหลาดตัวสุดท้ายที่เรายังจัดการไม่ได้ด้วยวิธีปกติธรรมดา ที่ดูด้วยตาเปล่าแล้วก็คงงงว่ามันผิดตรงไหน ช่องว่างก็ไม่มีแล้วแท้ๆ แต่ดันไม่ตรงกับคำที่ถูกต้องจริงๆ ซักที แสดงว่ามันต้องมีอักขระอะไรซักอย่างที่มองไม่เห็นด้วยตาเปล่าซ่อนอยู่แน่เลย (และไม่ใช่ตัวกระจอกๆ ที่สามารถจัดการได้ด้วย CLEAN ) ถ้างั้นเราลองมาพิสูจน์ด้วยการใช้ LEN นับจำนวนอักระใน Cell ดูดีกว่า

    สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters) 46

    โอ้ว จะเห็นว่ามีอะไรไม่รู้เกินมาตั้ง 2 ตัว เพราะ LEN ได้ 14 ซึ่งมากกว่าคำที่ถูกต้องซึ่ง LEN ได้แค่ 12 อยู่ 2 ตัวนั่นเอง

    ถึงเวลาท่ายาก

    Concept คือ เราไม่แน่ใจว่าตัวประหลาดคือตัวไหน งั้นเราจะใช้อีก Concept นึงแทน นั่นคือ เก็บเอาไว้เฉพาะตัวที่เรารู้จักเท่านั้น ซึ่งใช้ความรู้เรื่อง Code ของ Character ที่ผมบอกไปตอนต้นนี่แหละ นั่นคือ

    • เส้นวรรค คือ code 32
    • ตัวเลข คือ code 48-57
    • ตัวอักษรพิมพ์ใหญ่ภาษาอังกฤษ คือ code 65-90
    • ตัวอักษรพิมพ์เล็กภาษาอังกฤษ คือ code 97-122
    • ภาษาไทย คือ 161-249

    ซึ่งแนวทางในการเก็บตัวที่ต้องการไว้ จะทำได้ 2 แนว คือ ใช้สูตร (แนะนำว่าควรมี Excel 365 ไม่งั้นจะยากเกินไป) กับ ใช้ Power Query ผมขอแนะนำวิธี Power Query ก่อน ซึ่งง่ายกว่า

    วิธีใช้ Power Query

    เอาข้อมูลที่เรา TRIM แล้วเข้า Power Query ซะ จากนั้นให้กด Add Custom Column ขึ้นมาแล้วใช้ฟังก์ชัน Text.Select มาช่วย (ใครอยากรู้ว่าลึกๆ ทำงานยังไงอ่านได้ที่นี่)

    =Text.Select([TRIM],{"ก".."๙"}&{" "})
    สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters) 47

    แค่นี้มันจะเก็บไว้เฉพาะอักขระที่เราระบุใน List เท่านั้น แค่นี้จบละ Close & Load ออกมาได้เลย

    สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters) 48

    Tips : จริงๆ แล้ว Power Query ก็มี Clean กับ Trim นะ แต่ Trim แบบมาตรฐานของ Power Query ไม่ได้ตัด space ส่วนเกินระหว่างคำให้ (ถ้าจะให้ Trim ได้แบบ TRIM ของ Excel ต้องเขียน Custom Function อีกซึ่งน่าจะงงเกิน) ผมเลยแนะนำให้ตัดก่อนจะดีกว่า

    วิธีเขียนสูตรของ Excel 365

    ก่อนอื่น เราจะใช้ MID เพื่อสกัดเอาอักขระแต่ละตัวออกมาว่ามันเข้าเงื่อนไขที่อยากได้หรือไม่

    ปล. ใครที่งงกับสูตรที่สามารถสร้างผลลัพธ์ออกมาทีเดียวหลายๆ ช่องได้แบบนี้ (เรียกว่า Array Formula) และอยากเรียนรู้เพิ่ม ผมมีเขียนบทความที่สามารถอ่านได้ฟรีเอาไว้ในระดับนึง และมีรับรองว่าจะเข้าใจได้ดีมากขึ้นแน่นอน

    สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters) 49

    สมมติผมสนใจแค่ภาษาไทยกับ space ก็จะต้องมี Code เป็น 32 และ 161-249

    ดังนั้นผมจะใช้ Boolean Logic มาช่วย คือ * แทน AND และ + แทน OR

    =(CODE(MID(A12,SEQUENCE(LEN(A12)),1))>=161)*(CODE(MID(A12,SEQUENCE(LEN(A12)),1))<=249)+(CODE(MID(A12,SEQUENCE(LEN(A12)),1))=32)
    สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters) 50

    จากนั้นผมจะใช้ IF ใส่เข้าไป โดยถ้าค่าออกมาไม่ใช่ 0 จะเอาอักขระตัวนั้นๆ ไว้ แต่ถ้าได้ 0 จะปล่อยเป็น Blank (“”) ไปซะ

    =IF((CODE(MID(A12,SEQUENCE(LEN(A12)),1))>=161)*(CODE(MID(A12,SEQUENCE(LEN(A12)),1))<=249)+(CODE(MID(A12,SEQUENCE(LEN(A12)),1))=32),MID(A12,SEQUENCE(LEN(A12)),1),"")
    สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters) 51

    ตรงไหนเป็น FALSE ให้เป็น Blank text ซะ (“”)

    สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters) 52

    จากนั้นเราค่อยเอา TEXTJOIN มารวม

    =TEXTJOIN("",TRUE,IF((CODE(MID(A12,SEQUENCE(LEN(A12)),1))>=161)*(CODE(MID(A12,SEQUENCE(LEN(A12)),1))<=249)+(CODE(MID(A12,SEQUENCE(LEN(A12)),1))=32),MID(A12,SEQUENCE(LEN(A12)),1),""))

    พอเอามาเทียบกับคำที่ถูกต้อง มันก็ใช้ได้ละ (แต่ยากโคตรเห็นมะ 555)

    สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters) 53
    สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters) 54

    สรุป

    คิดว่าเป็นไงบ้างกับกำจัดอักขระที่ไม่ต้องการออกจากข้อความ ที่ผมแนะนำให้ครับ ใครอ่านแล้วได้ประโยชน์ อ่านแล้วทำตามไม่ได้ หรือว่ามีวิธีอะไรดีๆ อยากจะแชร์ก็ช่วย Comment บอกได้เลยนะครับ

  • List ฟังก์ชันทั้งหมดของ Excel ในทุก Version

    List ฟังก์ชันทั้งหมดของ Excel ในทุก Version

    คุณสงสัยหรือไม่ว่า Excel แต่ละ Version มีฟังก์ชันอะไรให้ใช้แตกต่างกันบ้าง? แม้ว่าทาง Microsoft จะมีเว็บบอกไว้ แต่มันช่างใช้งานยากเหลือเกินว่าตกลงแล้ว Excel แต่ละ Version มี Function อะไรกันแน่

    ผมก็เลยทำรายงาน Power BI และไฟล์ Excel ขึ้นมารวบรวมไว้ให้เผื่อคนที่อยากจะรู้นะครับ

    • 2022/08/22 Update Function ใหม่ๆ และใส่ Link
    • 2022/11/15 ทำเป็น Report Power BI
    • 2024/11/06 ทำให้ Report Power BI อัปเดทอัตโนมัติ

    แล้วเครื่องมืออื่นๆ ล่ะ?

    สำหรับเรื่องที่ Excel แต่ละ Version มีฟังก์ชันไม่เท่ากันนั้น จริงๆ แล้วนอกจาก Version แล้วก็ยังมีเรื่องของเครื่องมืออื่นๆ ด้วย ดังนั้นผมจึงสรุปออกมาเป็น Diagram ให้ด้วยดังนี้ครับ เพราะหลายคนก็สับสนอยู่ว่าอะไรใช้กับ Version ไหนได้บ้าง?

    List ฟังก์ชันทั้งหมดของ Excel ในทุก Version 55
  • เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX

    เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX

    เมื่อเราศึกษา DAX ใน Power BI/Excel Power Pivot ไปซักพัก บางทีก็จะเจอหลายฟังก์ชันที่ทำงานคล้ายกันมากๆ เช่น MAX กับ LASTDATE แต่การที่เราจะเข้าใจมันได้อย่างแท้จริงก็คือต้องลองหามุมคิดที่ว่า แต่ละฟังก์ชันที่คล้ายกันนั้น มีจุดเหมือนหรือจุดต่างกันอย่างไร

    ป.ล. เว็บ SQLBI เคยเขียนสรุปไว้ในนี้ ผมขอนำมาตีความเพิ่มเติม รวมถึงใส่ภาพประกอบและตัวอย่างให้เพื่อนๆ เข้าใจง่ายขึ้น

    โดยที่ช่วงแรกผมจะขอพูดการใช้งานในฐานะ Measure ซะก่อน แล้วอธิบายเวลาเอาไปใช้ใน Calculated Column ทีหลัง เพราะมีพฤติกรรมที่ซับซ้อนเกิดขึ้นกับ LASTDATE ในกรณี Column นะครับ

    เอาล่ะมาเริ่มจากฟังก์ชันพื้นฐานอย่างMAX ซะก่อน

    MAX แบบพื้นๆ

    MAX จะหาค่าสูงสุด โดยให้ผลลัพธ์ออกมาเป็นค่าแบบ Scalar ก็คือเป็น Value ตัวเลขธรรมดาๆ ไปเลย ซึ่งใช้ได้กับ Data Type ได้หลากหลาย

    • หากใช้กับเลขหรือวันที่ก็จะได้ค่ามากสุด (อันนี้ไม่แปลก )
    • หากใช้กับText จะมองตามตัวอักษร A-Z (ซึ่งตรงนี้ไม่เหมือน Excel )
    • แต่ถ้าใช้กับคอลัมน์ที่เป็น Logic จะได้ Error เลย

    การใช้ MAX จะใช้ได้ 2 แบบคือ

    • MAX (คอลัมน์) เพื่อให้ได้ค่าสูงสุดในคอลัมน์ที่เลือก
    • MAX ( ค่า1,ค่า2) เพื่อให้ได้ค่าสูงสุดระหว่าง 2 ค่า

    LASTDATE แบบพื้นๆ

    LASTDATE ( <Dates> ) จะหาค่าวันที่มากสุดของคอลัมน์วันที่ที่กำหนด (แปลว่าใช้ได้กับ Field ที่เป็นวันที่เท่านั้น)

    ซึ่ง LASTDATE เป็น Table Function ซึ่งจะให้ผลลัพธ์ออกมาเป็น Table ที่มี 1 Row และ 1 Column

    แต่ทว่าใน DAX จะมีกฎพิเศษอยู่ว่า ค่าใดที่เป็น Table ที่มี 1 Row และ 1 Column DAX จะสามารถตีความให้เป็นค่า Scalar ธรรมดาๆ โดยอัตโนมัติได้ด้วย (แต่ในทางกลับกัน คือทำจาก Scalar เป็น Table อัตโนมัติไม่ได้นะ)

    แปลว่า MAX ใช้ได้กับข้อมูลที่ต้องการผลลัพธ์เป็น Scalar เท่านั้น แต่ว่า LASTDATE ใช้ได้กับข้อมูลที่ต้องการ Scalar หรือ Table ก็ได้

    หากลองทดสอบดูจะเห็นได้ชัดเลย

    เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX 56

    สรุปความรู้ ณ ตอนนี้

    MAX

    • หาค่ามากสุดในคอลัมน์ที่กำหนด หรือระหว่างสองค่า
    • ใช้ได้กับคอลัมน์ตัวเลข วันที่ และข้อความ
    • ให้ผลลัพธ์กับ Scalar Value เท่านั้น

    LASTDATE

    • หาวันที่มากสุดในคอลัมน์วันที่ที่กำหนด
    • ใช้ได้กับคอลัมน์วันที่อย่างเดียว
    • ให้ผลลัพธ์เป็น Table หรือ Scalar ก็ได้

    ต่อไปจะทดสอบกับข้อมูลวันที่ทั้งคู่

    ใน Filter Argument ของ CALCULATE ต้องการ input ที่เป็น Table ซึ่งแปลว่าเราใส่ LASTDATE ได้ (เพราะมันให้ผลเป็น Table ได้) ดังนี้

    ยอดขายวันสุดท้าย = CALCULATE([ยอดขายรวม],LASTDATE(dDate[Date]))
    เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX 57

    แต่เราไม่สามารถใส่ MAX ในกรณีนี้ได้

    ยอดขายวันสุดท้ายMAX = CALCULATE([ยอดขายรวม],MAX(dDate[Date]))
    เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX 58

    แบบนี้ก็ไม่ได้

    ยอดขายวันสุดท้ายMAX = CALCULATE (
        [ยอดขายรวม],
        dDate[Date] = MAX ( dDate[Date] )
    )
    เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX 59

    ที่ทำแบบนี้ไม่ได้ เพราะ CALCULATE ไม่รองรับการเปรียบเทียบกับค่า Measure หรือ Expression ถ้าจะทำต้องใช้ VAR หรือไม่ก็หลบไปใช้ใน FILTER แทน ดังนี้

    ถ้าหลบไปใช้ VAR ให้มันคำนวณ MAX( dDate[Date] ) ให้เป็นค่าคงที่ไปก่อน แล้วค่อยเอาค่าคงที่ไปใช้ในเงื่อนไขเปรียบเทียบ (ซึ่งผมชอบใช้วิธีนี้เพราะสูตรเข้าใจง่ายกว่า)

    ยอดขายวันสุดท้ายMAX = 
    VAR CurrentMaxDate= MAX( dDate[Date] )
    RETURN
    CALCULATE (
        [ยอดขายรวม],
        dDate[Date] = CurrentMaxDate
    )

    หรือถ้าจะใส่ MAX ใน FILTER ก็จะทำได้ เนื่องจาก FILTER รองรับการเปรียบเทียบกับ Measure หรือ Expression ได้ คือต้องใช้ในฐานะที่เป็น Scalar Value เท่านั้น

    ยอดขายวันสุดท้ายMAX =
    CALCULATE (
        [ยอดขายรวม],
        FILTER ( ALL ( dDate[Date] ), dDate[Date] = MAX ( dDate[Date] ) )
    )

    และ LASTDATE สามารถรองรับคอลัมน์วันที่ที่เป็นสูตรได้ เช่น ถ้าเขียน LASTDATE ผสมกับ ALL ก็จะไม่มีปัญหาอะไร แต่ถ้าใช้ MAX จะไม่ได้ ดังนี้

    วันสุดท้ายLastDate = LASTDATE ( ALL ( 'dDate'[Date] ) )
    วันสุดท้ายMAX = MAX ( ALL ( 'dDate'[Date] ) )

    ที่ใช้ MAX ไม่ได้ เพราะ MAX ต้องใช้กับคอลัมน์ที่มีอยู่จริงตรงๆ เท่านั้น

    เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX 60

    ดูเหมือนว่าการใช้ LASTDATE จะดีกว่าในเกือบทุกกรณี แต่มีจุดที่ควรต้องระวังตรงที่ LASTDATE หากอยู่ใน Row Context จะทำให้เกิด Context Transition

    สิ่งที่หลายคนไม่รู้คือ

    LASTDATE ( 'dDate'[Date] )

    ภายใน DAX เอง จะตีความเป็นแบบนี้โดยอัตโนมัติ

    LASTDATE ( CALCULATETABLE ( DISTINCT ( 'dDate'[Date] ) ) )

    ซึ่ง CALCULATETABLE มีพฤติกรรมแบบเดียวกับ CALCULATE คือเมื่อเจอ Row Context จะทำให้เกิด Context Transition ทันที เช่นถ้าไปใช้ในฐานะ Calculated Column ก็จะเห็นผลลัพธ์เลยแบบนี้ (สังเกตว่า LASTDATE ไมได้ค่ามากสุดของตาราง แต่เป็นมากสุดในแต่ละวันที่แทน เพราะมีการเปลี่ยน Row Context เป็น Filter Context)

    LastDate = LASTDATE(dDate[Date])
    MaxDate = MAX(dDate[Date])
    เปรียบเทียบ MAX vs LASTDATE ในภาษา DAX 61

    จะเห็นวาส LastDate เจอ Context Transition เข้าเล่นงาน ทำให้มองไม่เห็นวันสุดท้ายจริง แต่ MaxDate เห็นวันสุดท้ายของคอลัมน์จริงๆ ดังนั้นถ้าจะใช้ LASTDATE ใน Row Context ต้องระวังจุดนี้ด้วย

    สรุปความรู้

    MAX

    • หาค่ามากสุดในคอลัมน์ที่กำหนด หรือระหว่างสองค่า
    • ใช้ได้กับคอลัมน์ตัวเลข วันที่ และข้อความ แต่ต้องเป็นคอลัมน์จริงๆ เท่านั้น
    • ให้ผลลัพธ์กับ Scalar Value เท่านั้น

    LASTDATE

    • หาวันที่มากสุดในคอลัมน์วันที่ที่กำหนด
    • ใช้ได้กับคอลัมน์วันที่อย่างเดียว แต่สามารถใช้ร่วมกับ Table Function อื่นๆ ที่ให้ผลเป็นวันที่ได้ เช่น ALL
    • ให้ผลลัพธ์เป็น Table หรือ Scalar ก็ได้
    • เวลาใช้ใน Row Context จะเกิด Context Transition เนื่องจากจริงๆ ตัวมันแฝงด้วย CALCULATETABLE อยู่ข้างใน

    สารบัญ Series Power BI

    ใครสนใจอยากเรียนเป็นคลิปวีดีโอ ผมมี

  • Power BI ตอนที่ 22 : การวิเคราะห์ Event ที่มีช่วงเวลาเริ่มต้นกับสิ้นสุดคนละวัน

    Power BI ตอนที่ 22 : การวิเคราะห์ Event ที่มีช่วงเวลาเริ่มต้นกับสิ้นสุดคนละวัน

    ในตัวอย่างที่ผ่านมาทั้งหมด มักจะเป็นเหตุการณ์ของวันนั้นๆ ที่เราสนใจเลย เช่น ถ้าเป็นการขายของ ก็จะสามารถวิเคราะห์ได้ว่า วันนั้นๆ มีการขายของอะไรไปเท่าไหร่บ้าง? แต่ถ้าหากเหตุการณ์ของเรามันเป็นช่วงเวลา ที่มีวันเริ่มต้นกับสิ้นสุดไม่ตรงกันล่ะ เราจะทำยังไงดี?

    เช่น บอกเป็นช่วงเวลาของเรื่องเหล่านี้ว่าเริ่มวันไหนจบวันไหน

    • การซื้อสินค้าที่มีเรื่องของวันสั่งซื้อกับวันส่งของที่ไม่ตรงกัน
    • Campaign การตลาด
    • ช่วงเวลาการซ่อมแซมเครื่องจักร
    • สัญญา/กรมธรรม์

    แบบนี้เราจะทำการวิเคราะห์ข้อมูลได้อย่างไร? คำถามนี้ผมเชื่อว่าหลายคนคงเจอกับการทำงานอยู่ และก็ไม่รู้จะทำยังไงกับมันดี ดังนั้นผมเลยเขียนบทความนี้ขึ้นมาช่วยแก้ไขปัญหาให้ครับ

    แนวทางแก้ปัญหา และ ไฟล์ประกอบ

    โชคดีที่ท่านอาจารย์ Alberto Ferrari แห่ง SQLBI ได้เขียนบทความแนวนี้ไว้แล้วด้วย ซึ่งเป็นทางแก้ที่น่าสนใจ ดังนั้นผมก็จะขออธิบายโดยใช้แนวทางของเค้า และเพื่อให้ง่ายกับทุกคน ผมก็จะใช้ไฟล์ประกอบของเค้าด้วยครับ (ซึ่งเป็นเรื่องของวันสั่งซื้อของกับวันส่งของ) แต่ผมก็จะมีการอธิบายเสริมด้วยความรู้ที่ผมมี เผื่อเพื่อนๆ จะเข้าใจมากขึ้นนะครับ

    ถ้าผูก Relationship แบบทื่อๆ

    หากเราใช้การผูก Relationship ตามปกติ เช่น ผูกแค่วันเริ่ม Event แบบปกติ

    Power BI ตอนที่ 22 : การวิเคราะห์ Event ที่มีช่วงเวลาเริ่มต้นกับสิ้นสุดคนละวัน 62

    การผูกแบบเส้นเดียวกับแค่วันเริ่มต้น จะทำให้เราสามารถสรุปข้อมูลตามวันเริ่มต้นได้เท่านั้น ไม่สามารถสรุปข้อมูลตามวันสิ้นสุดได้ (แน่นอนว่าวันระหว่างกลางก็ไม่ได้ด้วยเช่นกัน)

    เบื้องต้นผมจะแนะนำวิธีการที่ทำให้เราสามารถสรุปข้อมูลได้จากทั้งวันเริ่มต้นและสิ้นสุดให้ได้ก่อน แล้วเดี๋ยวค่อยไปดูวิธีสรุปข้อมูลในช่วงระหว่างกลางให้ได้อีกทีละกันครับ

    ผูก Relationship 2 เส้น

    เราต้องผูก Relationship ของตาราง Date เข้ากับ Orders ให้มีทั้งวันเริ่มวันจบ แปลว่าต้องมี Relationship 2 เส้น นั่นเอง แต่ Power BI จะยอมให้มี Relationship ที่ Active ได้แค่เส้นเดียวเท่านั้น ซึ่งก็ไม่เป็นไร เราจะให้มัน Active ที่วันเริ่มต้นคือ OrderDateKey ไว้ (เป็นเส้นทึบ) ส่วนวันสิ้นสุด ShipDateKey ปล่อยให้ inactive (เป็นเส้นประ) ไปซะ

    Power BI ตอนที่ 22 : การวิเคราะห์ Event ที่มีช่วงเวลาเริ่มต้นกับสิ้นสุดคนละวัน 63

    ทีนี้พอเราสร้าง Relationship แล้ว เราจะสามารถเขียนสูตรใน Measure โดยใช้ฟังก์ชัน USERELATIONSHIP เพื่อเลือกใช้ได้ว่าจะใช้ Relationship ตัวไหน Active หรือไม่ Active ตอนไหนก็ได้

    เช่น ถ้าเราลาก Amount หรือ SUM Amount เฉยๆ มันจะยึดตามวันที่ OrderDate เพราะว่า Relationship Active อยู่ แปลว่า Amount ที่คำนวณได้ก็คือ OrderAmount นั่นเอง ดังนั้นเราจะเขียนสูตร DAX ง่ายๆ ได้ว่า

    OrderAmount = SUM(Orders[Amount])

    แต่ถ้าเราอยากจะให้มันคำนวณ ShipAmount เราก็ต้องใช้ USERELATIONSHIP มาช่วย ซึ่งเราจะใช้ในฟังก์ชัน CALCULATE นะครับ

    ShipAmount =
    CALCULATE (
        [OrderAmount],
        USERELATIONSHIP ( Orders[ShipDateKey], 'Date'[DateKey] )
    )

    ซึ่งพอลาก Measure ทั้งสองตัวลงมาใน Visual คู่กับวันที่ก็จะได้แบบนี้

    Power BI ตอนที่ 22 : การวิเคราะห์ Event ที่มีช่วงเวลาเริ่มต้นกับสิ้นสุดคนละวัน 64

    ถึงตรงนี้ยังไม่มีอะไรพิสดารมากนัก แค่ทำความรู้จักเจ้า USERELATIONSHIP นิดหน่อยเท่านั้น ซึ่งถ้าอยากนับจำนวน Order ก็สามารถใช้ COUNTROWS แทนการ SUM ได้ เช่น

    จะนับจำนวน Order ตาม OrderDate

    OrderTX=COUNTROWS(Orders)

    นับจำนวน Order ตาม ShippingDate

    ShipTX =
    CALCULATE (
        [OrderTX],
        USERELATIONSHIP ( Orders[ShipDateKey], 'Date'[DateKey] )
    )

    ลากลง Visual ก็จะได้แบบนี้

    Power BI ตอนที่ 22 : การวิเคราะห์ Event ที่มีช่วงเวลาเริ่มต้นกับสิ้นสุดคนละวัน 65

    การคำนวณ ActiveOrder แก้ไขประเด็นช่วงเวลา

    คราวนี้มาถึงปัญหาของเราจริงๆ ละ ว่าถ้าเราอยากรู้ว่า แต่ละมัน มีจำนวน Order หรือ Amount ของ Order ที่ Active อยู่เท่าไหร่? นั่นคือ มีการ Order มาแล้ว แต่ยังไม่ได้ Ship (แม้ไม่ได้เริ่มต้นหรือสิ้นสุดวันนั้น)

    เช่น ถ้าดู ActiveOrder ที่ 8 Jan (สิ้นวัน) แปลว่า

    • ต้องเป็น Order ทั้งหมดที่ Order มาก่อนหน้านั้น คือ OrderDate <=8Jan
    • และต้องเป็น Order ที่ Ship ตั้งแต่ 8 Jan ด้วย นั่นคือ ShipDate >= 8Jan ด้วย (มองว่าถ้า Ship วันที่ 8 พอดีถือว่า Active อยู่)

    ปัญหา คือ ถ้าเราเขียนสูตรตามปกติ เราจะไม่เห็นข้อมูลของวันที่อยู่ระหว่างกลางเลย เช่น ถ้าสมมติ EventA เริ่ม 1 Jan แล้วจบ 10 Jan หากเราทำการ Filter Date[Date] ให้เป็นวันที่ 8 Jan เจ้า Power BI ก็จะใช้ Relationship เพื่อ Filter ข้อมูลไหลจาก Date[Date] ไป Order แล้วจะพบว่าไม่มี Row ของ Event A อยู่ ทั้งๆ ที่จริงๆ มันก็ยังคงเป็น Event ที่กำลังเกิดขึ้นอยู่แท้ๆ

    นอกจากนี้ เรายังต้องมาตกลงนิยามกันด้วยว่า ถ้าใน Visual ต้องแสดงข้อมูลเป็นระดับที่ใหญ่กว่าวัน เช่น Week Month Quarter หรือ Year อันนี้เราต้องมานิยามดีๆ แล้วว่าจะต้องการแสดงแบบไหน เช่น ถ้าดูทั้งเดือน Jan แปลว่า จะให้แสดง ActiveOrder ณ วันสุดท้ายของเดือน Jan หรือว่าจะเอา ActiveOrder ในทุกวันของเดือน Jan มาเฉลี่ยกัน เป็นต้น (ถ้าเป็นระดับวัน มันไม่มีปัญหาเรื่องการตกลงนิยาม)

    ทางแก้ไขมีอยู่ 2 แนวทาง

    • แนวทางแรกเน้นใช้สูตร DAX คำนวณขณะที่กดรายงานเล่น
    • แนวทางที่สองคือสร้างตารางไว้ใน Data Model ก่อนเลย เพื่อให้กดรายงานได้เร็วมากขึ้น แต่ข้อเสียคือไฟล์จะใหญ่ขึ้น

    ซึ่งในบทความนี้เราจะมาลองดูแนวทางแรกกันก่อนครับ เพราะง่ายกว่าพอสมควร และก็พอใช้งานได้ ไฟล์ไม่ใหญ่ด้วย

    ใช้สูตร DAX คำนวณขณะที่กดรายงาน

    ในบทความของคุณ Alberto ใช้การเฉลี่ย (Average) เพื่อแสดง ActiveOrder ในระดับที่ใหญ่กว่า ดังนั้นเพื่อไม่ให้เหมือนกัน ของผมจะเอา ActiveOrder ในวันสุดท้ายของเดือนมาแสดงแล้วกัน 555

    ดังนั้น ผมจะเขียน Measure ที่เรียกว่า ActiveTX ขึ้นมา โดยใช้การ FILTER ตามช่วงเวลามาช่วย หลักการ คือ

    • ผมมีการใช้ VAR มาดึงค่าวันที่ล่าสุดที่มองเห็น ณ Filter Context นั้นๆ ไว้ใน LastVisibleDate
    • ทีนี้เราอยากได้ Order ที่ยัง Active อยู่ ซึ่งแปลว่า มีการ Order มาแล้ว แต่ยังไม่ได้ Ship
    • จากนั้นใช้ FILTER สร้างตารางวันที่ขึ้นมา 2 อัน
      • อันแรกเป็นชุดวันที่ OrderDate ทั้งหมดที่ไม่เกินวัน LastVisibleDate
      • อันสองเป็นชุดวันที่ ShipDate ทั้งหมดตั้งแต่ LastVisibleDate เป็นต้นไป
    • ใช้ CALCULATE ปลด Filter ออกจากตาราง Date ทั้งหมดด้วย ALL แล้ว Filter เข้าไปใหม่ด้วยวันที่ตามที่สร้างไว้ทั้งสองชุด
      • แปลว่าเงื่อนไขในการ Filter ที่ได้คือ จะเหลือเฉพาะบรรทัดที่ตรงกับทั้ง 2 เงื่อนไขเท่านั้น คือ Orders[OrderDateKey] <= LastVisibleDate และ Orders[ShipDateKey] >= LastVisibleDate
    ActiveTX = 
        VAR LastVisibleDate = MAX('Date'[DateKey])
        VAR OrderedBeforeCurrentDate =
            FILTER (
                ALL ( Orders[OrderDateKey] ),
                Orders[OrderDateKey] <= LastVisibleDate 
            )
        VAR ShippedAfterCurrentDate =
            FILTER (
                ALL ( Orders[ShipDateKey] ),
                Orders[ShipDateKey] >= LastVisibleDate 
            )
        RETURN
            CALCULATE (
                [OrderTX],
                ALL ( 'Date' ),
                OrderedBeforeCurrentDate,
                ShippedAfterCurrentDate
                
            )

    ซึ่งพอใส่ลงไปใน Visual จะได้ดังนี้ (ถ้าสังเกตจะเห็นว่ากว่าตัวเลขจะขึ้นมา มันมี Delay พอสมควร เพราะการคำนวณหนักๆ มันเกิดขึ้นตอนที่สร้าง visual ตามแนวทางแรกนั่นเอง)

    คำนวณ Active Order ในช่วงเวลาที่กำหนด

    เอาเข้าจริงถ้าจะคำนวณโดยใช้ CALCULATE กับ FILTER แบบนี้เราไม่ต้องสร้าง Relationship 2 เส้นก็ยังทำงานได้ เช่น ถ้าจะใช้ Relationship เส้นเดียว ไปที่ OrderDate ผมก็ยังสามารถเขียนสูตร ShipTX2 เป็นดังนี้ได้ และมันยังทำงานได้ค่าถูกต้องด้วย

    ShipTX2 = 
    SUMX (
        VALUES ( 'Date'[DateKey] ),
        VAR CurrentDate = 'Date'[DateKey]
        VAR ShippedatCurrentDate =
            FILTER (
                ALL ( Orders[ShipDateKey] ),
                Orders[ShipDateKey] = CurrentDate 
            )
        RETURN
            CALCULATE (
                COUNTROWS ( Orders ),
                ALL ( 'Date' ),
                ShippedatCurrentDate
            )
    )

    จะเห็นว่า แม้มีเส้น Relationship เดียวก็ทำงานได้ แต่ทว่า การคำนวณจะค่อนข้างช้ากว่าการมี Relationship จริงๆ นิดหน่อยนะครับ

    Power BI ตอนที่ 22 : การวิเคราะห์ Event ที่มีช่วงเวลาเริ่มต้นกับสิ้นสุดคนละวัน 66

    สรุป

    ดังนั้นถ้าเลือกได้ ควรจะมีเส้น Relationship จริงๆ แล้วใช้ USERELATIONSHIP จะดีกว่านะครับ อย่าไปใช้การคำนวณ DAX ซับซ้อนโดยไม่จำเป็นเลย การใช้ CALCULATE กับ FILTER นั้นใช้กรณีที่ใช้ Relationship ปกติทำไม่ได้ เช่น ActiveOrder จะดีกว่าครับ

    ซึ่งเดี๋ยวบทความถัดไป ผมจะพาไปสำรวจแนวทางที่ 2 ที่สร้าง Table ขึ้นมาจริงๆใน Data Model ซึ่งจะช่วยให้ตอนกดรายงานทำงานเร็วขึ้นมาก แต่ต้องแลกมาด้วยขนาด Data Model ที่ใหญ่ขึ้นครับ

    สารบัญ Series Power BI

    ใครสนใจอยากเรียนเป็นคลิปวีดีโอ ผมมี

  • Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล)

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล)

    วันก่อนผมได้เจอบทความของพี่บิว วิศวกรรีพอร์ต ที่อธิบายเรื่องวิธีการสรุปข้อมูลแบบ TopN+Others ใน ใน Power BI ซึ่งก็คือการแสดง Top N ที่สนใจ แต่สามารถแสดงข้อมูลอื่นๆ ที่อันดับมากกว่า Top N ให้รวมกันเป็น Others ได้ด้วย

    ในบทความนั้นพี่บิวบอกว่าได้ดัดแปลงสูตร DAX จากบทความของฝรั่งชื่อ Gerhard Brueckl ที่เขียนแนวทางการทำการสรุปแบบนี้ไว้ ให้มีประสิทธิภาพมากขึ้น ซึ่งบทความของคุณ Gerhard และ พี่บิวก็มีเทคนิค DAX มากมายที่น่าสนใจ แนะนำให้ลองเข้าไปศึกษาดูครับ

    หลังจากได้อ่านบทความพี่บิว ผมก็เลยคิดว่า ถ้าผมจะลองทำวิธีอื่น ที่ไม่ซ้ำกับทั้งสองท่านเลยจะทำได้มั้ยนะ? (ซึ่งก็แทบไม่เหลือวิธีอะไรมากแล้วล่ะ… 555)

    หลังจากลองอยู่ซักพัก ผลลัพธ์ของมันก็คือบทความนี้นั่นเองครับ หวังว่า Concept ของผมจะทำให้เพื่อนๆ สามารถทำการสรุปแบบ Top N + Others ได้เช่นกันครับ

    ไฟล์ประกอบ

    ก่อนอื่นก็ต้องบอกว่า ไฟล์ตัวอย่างของผมก็ใช้ไฟล์เดิมที่ทำมาตลอดทั้ง Series นี้นั่นแหละครับ ซึ่งเราจะมาลองทำ ProductSubCategory ให้รองรับการทำ TopN +Others กัน

    เพิ่มตารางใน Data Model

    ขั้นตอนแรก หากเราต้องการสรุปข้อมูลให้มี ProductSubCategory ที่ชื่อว่า Others ให้โผล่มาใน Report ได้นั้น มันจะต้องมี Value นี้อยู่จริงๆ ซะก่อน ซึ่ง Data ปัจจุบันเรายังไม่มีตัวนี้เลย ดังนั้นเราจะต้องหาทางเพิ่ม Value ตัวนี้เข้าไปใน Field ชื่อ ProductSubCategory ครับ

    หากจะเพิ่มไปในตารางเดิม มันจะทำให้ข้อมูลเพี้ยนมากเกินไป ดังนั้นเราจะเขียนสูตร DAX เพื่อสร้างตารางใหม่ขึ้นมา ซึ่งตารางนั้นจะมีแต่ ProductSubCategory แค่นั้นก็พอ แต่จะเพิ่ม Row นึงลงไปเป็นคำว่า Others ด้วย

    วิธีเพิ่มแถวใน DAX นั้น เราสามารถใช้ฟังก์ชัน UNION ( <Table>, <Table>) มาทำการรวมตารางที่มีจำนวนคอลัมน์เท่ากันได้ ในขณะที่แถวที่เป็นคำว่า Others สามารถถูกสร้างด้วยฟังก์ชัน ROW ( <Name>, <Expression>) ได้ ซึ่งอันนี้เป็นเทคนิคที่คุณ Gerhard Brueckl ใช้ในบทความ Original เช่นกัน

    สรุปแล้วผมใช้ DAX สร้าง New Table ด้วยสูตรนี้

    ProductSubOther =
    UNION ( ALL ( dProduct[ProductSubcategory] ), ROW ( "ProductSub", "Others" ) )

    ซึ่งจะได้ตารางใหม่ที่มีหน้าตาดังนี้ ซึ่งจะ List รายการทุกอันของคอลัมน์ ProductSubCategory ทั้งหมดแบบไม่ซ้ำกันออกมา และต่อด้วยคำว่า Others

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 67

    จากนั้นทำการผูก Relationship ของ Data Model ของตารางใหม่นี้เข้ากับตาราง dProduct เดิมซะ เพื่อที่ให้มันสามารถ Filter ตาราง dProduct ได้ แล้ว dProduct ก็จะไป Filter ตาราง fSales ต่อได้

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 68

    พอทำแบบนี้ หากเราลาก ProductSubCategory จากตารางใหม่ลง Visual โดยให้คู่กับ Measure ที่ต้องการ มันก็จะสามารถแสดงผลลัพธ์ออกมาได้ โดยมีคำว่า Others โผล่มาด้วยแล้ว

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 69

    แต่ถ้าหากเราลาก Measure ที่สนใจลงมา เช่น TotalRevenue จะทำให้ Others หายไป เพราะปกติหาก Measure เป็น Blank มันจะไม่แสดง item นั้นออกมาเลย

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 70

    เริ่มเขียน DAX Measure ที่จำเป็นในการทำ Top N

    ซึ่งไม่เป็นไร เดี๋ยวเราจะเขียน Measure อีกตัว ให้แสดง Rank ของข้อมูลแต่ละ item ออกมา โดย Rank ตาม TotalRevenue

    RankSubCat =
    RANKX ( ALLSELECTED ( ProductSubOther[ProductSubcategory] ), [TotalRevenue] )

    หมายเหตุ : ในสูตรนี้ผมใช้ ALLSELECTED แทน ALL เผื่อว่ามีการ Filter จาก Visual อื่น จะได้แสดงเฉพาะผลที่เหลือจาก Filter นั้นๆ ไม่ปลดออกทั้งหมด

    ซึ่งถ้าลากลงมาใน visual จะได้ดังนี้ ซึ่งสังเกตว่า Others จะโผล่มาแล้ว เพราะ Rank แล้วไม่ Blank (Rank แล้วเป็นตัวสุดท้าย เพราะไม่มียอด TotalRevenue เลย)

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 71

    พอเรามี Measure ที่ Rank แต่ละ ProductSubcategory ได้แล้ว การสร้าง Measure เพื่อ ทำ TopN กับ Others ก็ไม่ยากแล้วล่ะ

    Concept คือ ตัวเลขที่จะแสดงออกมานั้นมี 3 กรณี และมีค่าดังนี้

    • ถ้า ProductSubcategory เป็น Others : เราจะแสดง TotalRevenue ของกลุ่ม Others ซึ่งผมจะตั้งชื่อว่า TotalRevenueOthers
    • ถ้า Rank <=TopN (ซึ่งจะได้ตัว Total ด้วย) : ก็จะแสดงค่า TotalRevenue ของแต่ละ ProductSubcategory นั้นๆตามปกติ นั่นคือ TotalRevenue
    • นอกนั้น: จะแสดงค่า Measure เป็น Blank ซะ

    ซึ่งสมมติว่าค่า TopN ที่ต้องการคือ 5 ก่อนเพื่อความง่าย (เดี๋ยวจะทำให้ Dynamic ตอนหลัง)

    เจ้า TotalRevenueOthers จะเขียนสูตรโดยใช้ CALCULATE เปลี่ยน Filter Context ได้ดังนี้

    TotalRevenueOthers =
    CALCULATE (
        [TotalRevenue],
        FILTER ( ALLSELECTED ( ProductSubOther[ProductSubcategory] ), [RankSubCat] > 5 )
    )

    หากลองลากมาลง Visual จะได้เลขเดียวกันหมดสำหรับทุก Rank เพราะเราใช้ CALCULATE เปลี่ยน Filter Context ไปแล้วนั่นเอง

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 72

    ทีนี้เรามาเขียนเงื่อนไขสำหรับ Measure ที่เราจะนำมาใส่ Visual จริงๆ ให้ครบ 3 เงื่อนไขที่เราคิดไว้ ซึ่งจะใช้ IF ซ้อนกันก็ได้ แต่ผมใช้ SWITCH จะง่ายกว่า ดังนี้

    TotalRevenueFinal =
    VAR CurrentSubCat =
        SELECTEDVALUE ( ProductSubOther[ProductSubcategory] )
    RETURN
        SWITCH (
            TRUE (),
            CurrentSubCat = "Others", [TotalRevenueOthers],
            [RankSubCat] <= 5, [TotalRevenue],
            BLANK ()
        )

    พอลากมาลง Visual จะได้ดังนี้ ซึ่งจะเห็นว่าผลลัพธ์ออกมาถูกต้องทุกกรณีเลย

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 73

    แปลว่าถ้าเราทำให้เหลือแค่ TotalRevenueFinal ก็จะเหลือเฉพาะ TopN กับ Others เท่านั้น

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 74

    ทำ TopN ให้ Dynamic

    เดิมทีเราใช้การใส่เลข 5 เป็นค่าคงที่สำหรับ TopN แต่คราวนี้เราจะให้คนใช้งานกำหนด N ได้ตามต้องการเลย

    ก่อนอื่นให้เราสร้าง DAX New Table ใหม่ ให้มีเลข 1-N ตัวตามต้องการ ซึ่งผมใช้ GENERATESERIES ตั้งแต่ 1- จำนวน ProductSubcategory มาช่วยดังนี้

    TopNSubCatTable =
    GENERATESERIES ( 1, DISTINCTCOUNT ( dProduct[ProductSubcategory] ) )

    ซึ่งตารางใหม่นี้เราไม่ต้องไปผูก Relationship ใดๆ ทั้งสิ้น

    จากนั้นให้สร้าง Slicer ที่ให้เลือกค่าจาก Field ของตารางใหม่ ซึ่งผมใช้แบบ Less than or Equal to เพื่อความเท่ (ให้เลื่อนได้ว่าจะเอา TopN คือเท่าไหร่)

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 75

    จากนั้นเราค่อยเขียน Measure เพื่อเอาค่าจาก Slicer โดยเอาค่า MAX มาก็ได้ เช่น

    SelectedN= MAX(TopNSubCatTable[Value])

    จากนั้นค่อนเอา SelectedN ไปแทนเลข 5 เดิมที่เราทำไว้ใน 2 สูตรเดิม ดังนั้นจะได้สูตรว่า

    TotalRevenueFinal =
    VAR CurrentSubCat =
        SELECTEDVALUE ( ProductSubOther[ProductSubcategory] )
    RETURN
        SWITCH (
            TRUE (),
            CurrentSubCat = "Others", [TotalRevenueOthers],
            [RankSubCat] <= [SelectedN], [TotalRevenue],
            BLANK ()
        )
    
    TotalRevenueOthers =
    CALCULATE (
        [TotalRevenue],
        FILTER (
            ALLSELECTED ( ProductSubOther[ProductSubcategory] ),
            [RankSubCat] > [SelectedN]
        )
    )

    ซึ่งจะทำให้ตารางเปลี่ยน N ได้ตามต้องการ เช่น ถ้า N เป็น 10 จะได้ดังนี้

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 76

    จัดการเรื่องการเรียงลำดับ

    อย่างไรก็ตาม หากอยากจะเรียงตามยอดมากไปน้อย แต่อยากเอา Others ไว้ท้ายสุดด้วย จะต้องสร้าง Measure อีกตัวมาช่วยเรียง ซึ่งใช้เงื่อนไขเหมือน Measure ที่แล้วเลย แต่แสดงผลลัพธ์เป็น Rank ที่ถูกต้องแทน เช่น ถ้าเป็น Others ให้เอา N ไปบวก 1 เลย ดังนี้

    RankSubcatwithOthers =
    VAR CurrentSubCat =
        SELECTEDVALUE ( ProductSubOther[ProductSubcategory] )
    RETURN
        SWITCH (
            TRUE (),
            CurrentSubCat = "Others", [SelectedN] + 1,
            [RankSubCat] <= [SelectedN], [RankSubCat],
            BLANK ()
        )

    จากนั้นกดเรียงคอลัมน์ RankSubcatwithOthers ก็จได้การเรียงที่ถูกต้อง

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 77

    ถ้าอยากแสดงตัวภายใต้ Others จะต้องแก้สูตรเพิ่ม

    วิธีของผมที่ทำมาตอนแรก ยังไม่เหมาะกับการแสดง item ภายใต้ Others เพราะถ้าลาก ProductSubcategory จากตาราง Product มาซ้อนกัน ภายใต้ใน Others มันจะแสดง TotalRevenueFinal เป็น Blank หมดเลย

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 78

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

    ก่อนอื่นเราทำการสร้าง Measure TotalRevenue อีกตัวที่ทำการปลด Filter จากตาราง ProductSub ที่สร้างใหม่ออกซะ เพื่อให้สามารถแสดงค่า TotalRevenue ของตัวลูกได้โดยไม่ Blank

    TotalRevenueAllSubCat =
    CALCULATE (
        [TotalRevenue],
        ALLSELECTED ( ProductSubOther[ProductSubcategory] )
    )
    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 79

    ทีนี้เราก็ทำRank ขึ้นมาใหม่อีกตัว โดยใช้ Measure ตัวใหม่นี้ของเราในการ Rank โดยที่จะ Rank ใน ProductSub ของตาราง Product Original ของเรา

    RankSubcatNoOthers =
    RANKX ( ALLSELECTED ( dProduct[ProductSubcategory] ), [TotalRevenueAllSubCat] )

    ซึ่งจะทำให้เห็นผลลัพธ์แบบนี้

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 80

    จากนั้นเราต้องหาวิธีแยกว่า เรากำลังดู Level ที่มี Others หรือ ดู Level ลูกอยู่ ซึ่งวิธีนึงที่ทำได้คือใช้ ISFILTERED ดังนี้

    IsChild = ISFILTERED(dProduct[ProductSubcategory])

    ซึ่งจะได้ผลออกมาดังนี้

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 81

    ทีนี้เราจะทำ RankFinal ขึ้นมา โดยที่ตัวลูกของ Other จะต้องเอามาเฉพาะ RankSubcatNoOthers >=RankSubcatwithOthers เท่านั้น นอกนั้นจะต้องไม่แสดงขึ้นมา

    ดังนั้นจะเขียนสูตรว่า

    RankFinal =
    SWITCH (
        TRUE (),
        [IsChild] = FALSE (), [RankSubcatwithOthers],
        [IsChild] = TRUE ()
            && SELECTEDVALUE ( ProductSubOther[ProductSubcategory] ) = "Others"
            && [RankSubcatNoOthers] >= [RankSubcatwithOthers], [RankSubcatNoOthers],
        BLANK ()
    )

    และก็แก้ไข TotalRevenueFinal ใหม่ ให้ครอบคลุมขึ้นดังนี้

    หลักการคือ เลือกเลขมาใช้ให้ถูกตัว ถูกเงื่อนไขเสมอ

    TotalRevenueFinal =
    VAR CurrentSubCat =
        SELECTEDVALUE ( ProductSubOther[ProductSubcategory] )
    RETURN
        SWITCH (
            TRUE (),
            CurrentSubCat = "Others"
                && [IsChild] = FALSE, [TotalRevenueOthers],
            ISBLANK ( [RankFinal] ), BLANK (),
            [RankFinal] > [SelectedN], [TotalRevenueAllSubCat],
            [TotalRevenue]
        )
    

    จากนั้นทำให้เหลือแค่ TotalRevenueFinal กับ RankFinal

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 82

    ซึ่งจะเห็นว่า สามารถแสดงรายละเอียดใน Others ได้แล้วล่ะ (ยุ่งยากจัง 555)

    ถ้าเราปรับ N เล่น ก็จะยังทำงานได้อยู่เช่นเดิมครับ

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 83

    และแน่นอนว่าใช้กับ Visual ไหนก็ได้ครับ

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 84

    เจาะดูตัวลูกได้ด้วยการ Expand อีก Level ออกมา

    Power BI ตอนที่ 21 : แสดงข้อมูลสรุปแบบ Top N + Others (ฉบับเทพเอ็กเซล) 85

    สารบัญ Series Power BI

    ใครสนใจอยากเรียนเป็นคลิปวีดีโอ ผมมี

  • วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File

    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File

    ช่วงนี้เพื่อนๆ หลายคนเริ่มใช้ Power Query กันเยอะมากขึ้นแล้ว ทำให้เริ่มเจอปัญหาการใช้งานมากขึ้น (ซึ่งเป็นเรื่องที่ดี) มีคำถามจาก Inbox ที่ช่วงนี้ผมได้รับมาบ่อยนั่นคือ จะสามารถ Export ข้อมูลที่สร้างจาก Power Query แล้วเยอะเกินล้านบรรทัดได้ยังไง? เพราะจะเอาออกมาเป็น Table ใน Sheet ของ Excel ก็ไม่ได้ เพราะมันรับได้แค่ 1,048,576 บรรทัด หรือ ล้านกว่าบรรทัด (ต่อ 1 Sheet) เท่านั้น

    ผมคิดว่าคงติดปัญหานี้กันหลายคนพอสมควร การเขียนบทความอธิบายน่าจะเกิดประโยชน์สูงสุดครับ

    แนวทางแก้ไขปัญหา

    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 86

    หลักการโดยรวมคือ เราจะเอาผลลัพธ์จาก Power Query Load เข้าสู่ Data Model ก่อน (เพราะมันรับข้อมูลได้ไม่จำกัด ต่างจาก Sheet Excel) แล้วค่อย Export ข้อมูลจาก Data Model ออกมาเป็น Text File ด้วยโปรแกรม DAX Studio ครับ

    วิธีนี้เรียกได้ว่าขี้โกงเล็กน้อย เพราะเราไม่ได้ Export จาก Power Query ตรงๆ พูดให้ถูกคือเป็นเอาข้อมูล Export จาก Data Model ซะมากกว่า แต่ใครจะสนล่ะ ขอแค่มันทำได้ได้ก็พอแล้วล่ะ จริงมั้ย?

    ติดตั้งโปรแกรม DAX Studio

    ก่อนอื่นต้องบอกว่าเราต้องไปโหลดโปรแกรมตัวนึงมาช่วยซะก่อนนั่นคือ DAX Studio ซึ่งสามารถโหลดมา install ได้ฟรีครับ เครื่องมือนี้มีความสามารถในการช่วยเขียน DAX ซึ่งเป็นภาษาของ Power Pivot กับ Power BI แต่เราจะใช้มันเพราะมันมีความสามารถในการ Export ข้อมูลออกมาเป็น Text File ได้ด้วย

    ให้โหลดมาแล้ว install ซะ ที่สำคัญคือต้องลง Excel Addin ด้วยนะ (ปกติก็ติ๊กไว้อยู่แล้ว อย่าไปติ๊กออกล่ะ)

    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 87

    พอ Install เสร็จแล้ว หากเราลองเข้า Excel จะเห็น Ribbon พิเศษขึ้นมา ดังนี้

    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 88

    ทำ Query ตามต้องการ

    จากนั้นก็ให้เราทำ Query ของเราตามต้องการได้เลย อันนี้ก็แล้วแต่งานของเพื่อนๆ ว่าจะเป็นยังไง ซึ่งจะมีบรรทัดเยอะหลายล้านบรรทัดก็ได้นะ

    ในที่นี้ผมสร้างเลข Running 1-5 ล้านใน Power Query ไว้ละกัน ใครอยากลองทำตามก็เขียน Query ใน Formula Bar ของ Power Query ว่า

    = {1..5000000}

    จากนั้นกด Enter มันจะสร้าง List ออกมาให้ก่อน แล้วเราก็กด Convert to Table ได้เลยครับ (ใครงงกับวิธีสร้าง List นี้ลองไปอ่านเพิ่มได้ที่นี่)

    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 89

    เอาผลลัพธ์จาก Query ออกไปยัง Data Model

    จากนั้นก็กด Close & Load to… เพื่อเอาผลลัพธ์ของ Query ที่เราทำออกมา

    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 90

    จากนั้นให้เลือก Connection Only และติ๊ก Add this data to the Data Model ด้วย
    ตรงนี้สำคัญมาก เพราะจะเป็นการส่ง Data ผลลัพธ์จาก Power Query ไปใช้งานต่อใน Data Model ล่ะครับ

    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 91

    จากนั้นจะเห็นว่า Data ถูกโหลดออกมา 5 ล้านบรรทัดจริงๆ (แต่โหลดเข้าไปใน Data Model นะ ไม่ใช่ Sheet ของ Excel)

    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 92

    เอา Data จาก Data Model เข้า DAX Studio

    พอเรามีข้อมูลใน Data Model แล้ว จากนั้นกดเรียกใช้โปรแกรม DAX Studio ได้เลย

    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 93

    จากนั้นมันจะเปิดโปรแกรม DAX Studio ขึ้นมา ให้เรากด Connect ได้เลย
    สังเกตว่า Data Source เอาจาก Data Model ของ Power Pivot ใน Excel ที่เป็นชื่อไฟล์ของเรา (ของผมไฟล์ชื่อ Book1)

    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 94

    ให้เราพิมพ์ DAX Query ว่า EVALUATE ตามด้วยชื่อ table (ที่เราเอาเข้าไปใน Data Model) เช่น

    EVALUATE Query1
    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 95

    จากนั้นให้เลือกว่าจะเอา Output ออกมาแบบ File

    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 96

    แล้วก็กดปุ่ม Run ได้เลย

    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 97

    จากนั้นเค้าจะให้เลือกว่า จะ Export ไปที่ไหน? ไฟล์ชื่ออะไร? รูปแบบ Format แบบไหน? ซึ่งเลือกได้ทั้ง Text และ CSV เลย

    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 98

    จากนั้นก็รอ จนมันบอกว่าเขียนไฟล์เสร็จแล้ว เป็นอันจบครับ

    วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 99
  • วิธี Append ต่อแถวจากตาราง 2 อัน แบบสลับแถว

    วิธี Append ต่อแถวจากตาราง 2 อัน แบบสลับแถว

    มีคน inbox มาถามว่า “โจทย์คือ มีข้อมูล 2 ชุด ชุด A and B จะทำการรวมข้อมูลโดยการที่ให้ ข้อมูล A 1 แถว แล้วต่อด้วยข้อมูล B 5 แถว แล้วทำสลับไปแบบนี้เรื่อยๆ สามารถทำยังไงได้มั่งครับ?” ผมเห็นว่าน่าสนใจดีเลย เขียนเป็นบทความนี้เพื่อตอบให้เลยครับ

    วิธีการทำที่ผมเห็นว่าง่ายที่สุด ก็คือใช้ Power Query ทำ เพราะมันคือการ Transform/Reshape Data ซึ่งเป็นสิ่งที่ Power Query เก่งที่สุด ซึ่งเดี๋ยวผมจะสร้างข้อมูล Dummy ขึ้นมา 2 ชุด เป็นชุด A กับ B ดังนี้นะครับ

    วิธี Append ต่อแถวจากตาราง 2 อัน แบบสลับแถว 100

    แนวคิด

    หากเราทำแบบตรงไปตรงมา คือเอาตาราง A มา 1 แถว เอาตาราง B มา 5 แถว จะยุ่งยากเกินไป ให้เราพลิกมุมคิดนิดนึงจะง่ายขึ้นเยอะมากๆ (การแก้ไขปัญหาหลายๆ อย่างก็แบบนี้แหละ พยายามหาวิธีที่ง่ายที่สุดเข้าไว้ ซึ่งบางทีอาจไม่ตรงไปตรงมา)

    ซึ่งแนวคิดที่เราจะใช้ คือ เราจะ Append 2 ตารางนี้เข้าด้วยกัน จากนั้นทำการ Sort ให้ได้ผลลัพธ์ตามที่ต้องการภายหลัง การจะทำแบบนั้นได้เราจะต้องสร้างคอลัมน์ใหม่ ซึ่งเป็นเลข Running ที่เอาไว้ Sort โดยเฉพาะครับ

    ใส่เลข Running ของตาราง A

    เอาตาราง A เข้าสู่ Power Query Editor แล้ว Add Index Column ให้เริ่มจาก 1

    วิธี Append ต่อแถวจากตาราง 2 อัน แบบสลับแถว 101

    จากนั้นกด Close & Load to ให้เป็น Connection Only ไว้

    วิธี Append ต่อแถวจากตาราง 2 อัน แบบสลับแถว 102

    ใส่เลข Running ของตาราง B

    จากนั้นก็เอาตาราง B เข้า Power Query Editor แล้วใส่ Index Column จาก 1 เหมือนเดิม

    แต่คราวนี้เราจะทำให้เลข 1 ซ้ำกัน 5 รอบ แล้วค่อยเลข 2 ซ้ำ 5 รอบ แบบนี้ไปเรื่อยๆ….

    วิธีทำคือเราจะสั่งให้เอา Index Column ไปหารด้วย 5

    วิธี Append ต่อแถวจากตาราง 2 อัน แบบสลับแถว 103

    แล้วเราก็สั่ง Round Up ซะ เพื่อให้เลขได้ตามต้องการ

    วิธี Append ต่อแถวจากตาราง 2 อัน แบบสลับแถว 104

    แค่นี้ก็ได้เลซ้ำกัน 5 ตัวตามต้องการแล้ว

    วิธี Append ต่อแถวจากตาราง 2 อัน แบบสลับแถว 105

    รวมข้อมูล 2 ตารางเข้าด้วยกัน

    จากนั้นเราก็สั่ง Append 2 ตารางเข้าด้วยกัน โดยให้ตาราง A เป็นหลัก

    วิธี Append ต่อแถวจากตาราง 2 อัน แบบสลับแถว 106

    จะได้หน้าตารางประมาณนี้

    วิธี Append ต่อแถวจากตาราง 2 อัน แบบสลับแถว 107

    Sort ให้ได้ตามต้องการ

    จากนั้นก็ Sort Index Column ซะ ก็จะได้หน้าตาตามที่ต้องการ

    วิธี Append ต่อแถวจากตาราง 2 อัน แบบสลับแถว 108

    ถ้าไม่อยากได้ Index Column แล้วก็ลบทิ้งไปได้เลย

    จากนั้นก็ Close & Load ออกมาเป็น Table หรือออะไรก็ได้ตามต้องการ จบ

    วิธี Append ต่อแถวจากตาราง 2 อัน แบบสลับแถว 109
  • 13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข)

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข)

    หลายครั้ง Excel แสดงอาการแปลกๆ ออกมาทำให้เรางง รู้หรือไม่เป็นเพราะว่าเรากำลังเจอกับกับดักอยู่โดยที่ไม่รู้ตัว ไม่ว่ากับดักนั้นจะถูกสร้างมาอย่างตั้งใจหรือไม่ตั้งใจก็ตาม (บางทีอาจเป็นคุณเองนั่นแหละที่เป็นคนวางกับดักตัวเอง…) ในบทความนี้คุณจะได้เรียนรู้อาการแปลกๆ หลายอย่างพร้อมทั้งวิธีแก้ไขด้วยอย่างแน่นอนครับ

    ปล. จริงๆ แล้วผมลังเลอยู่นานว่าจะเขียนบทความนี้ออกมาดีมั้ยเพราะอาจมีคนเกรียนๆ เอาวิธีสร้างกับดักเหล่านี้ใช้ทำอะไรแผลงๆ แต่คิดไปคิดมา มันก็เป็นอีกวิธีที่ทำให้ผู้อ่านได้ความรู้ Excel เพิ่มขึ้นได้เช่นกันเลยคิดว่าเขียนดีกว่า

    เอาล่ะ เพื่อไม่ให้เสียเวลา มาดูกันเลยดีกว่าว่ามีกับดักอะไรบ้าง?

    กับดัก 1 : ทำให้เพื่อนเขียนสูตรไม่ติด

    ปกติแล้วเราสามารถปรับ Number Format ให้แต่ละ Cell สามารถแสดงข้อมูลออกมาในรูปแบบที่แตกต่างกันได้ เช่น จะมีทศนิยมกี่ตำแหน่ง จะแสดงเป็น % หรือไม่ ซึ่งหนึ่งในรูปแบบมาตรฐานที่สามารถนำมาแกล้งเพื่อนได้คือ รูปแบบ Text

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 110

    ซึ่งหลังจากปรับ Format เป็น Text แล้วจะทำให้เมื่อพิมพ์อะไรลงไปใน Cell ก็ตาม Excel จะมองว่าข้อมูลนั้นเป็น Text ทั้งหมดเลย โดยไม่ต้องใส่เครื่องหมาย ‘ นำหน้าด้วยซ้ำ (แต่ต้องปรับเป็น Text ก่อนพิมพ์นะ)

    ซึ่งการทำให้เป็น Text นั้น Excel ก็จะมองว่าการเขียนสูตร ก็จะกลายเป็น Text ธรรมดาๆ ไปด้วย ทำให้เขียนสูตรไม่ติดนั่นเอง

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 111

    วิธีแก้ไข

    ต้องปรับ Format ให้กลับมาเป็น General หรือ Clear Format ทิ้งก็ได้ จากนั้นให้กระตุ้นให้มันคิดว่ามีการพิมพ์ข้อมูลใหม่ ซึ่งเราจะสามารถกระตุ้นให้สูตรกลับมาทำงานอีกครั้งได้ด้วยการ Replace (Ctrl+H) โดยแทนเครื่องหมาย = ด้วย = นั่นเอง

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 112

    พอแก้ไขแล้วสูตรก็จะกลับมาทำงานอีกครั้งนึง

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 113

    กับดัก 2 : ทำให้สูตรไม่อัปเดทด้วย Manual Calculation

    วิธีนี้เป็นวิธีที่โคตรเลวร้าย เพราะขณะที่เพื่อนเขียนสูตร สูตรมันจะทำงานอยู่ แต่ว่าถ้า input เปลี่ยนไป แทนที่ผลลัพธ์ของสูตรจะอัปเดท มันกลับไม่อัปเดท

    วิธีทำคือให้เลือก Formula -> Calculation Options ->Manual

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 114

    ทีนี้ตอนเขียนสูตรตอนแรกมันจะทำงานได้

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 115

    แต่พอไปแก้ input ต้นทาง ผลลัพธ์ของสูตรจะไม่อัปเดท

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 116

    วิธีสังเกตคือ Status Var ด้านซ้ายจะมีคำว่า Calculate ค้างอยู่ แปลว่ามันยังไม่ได้คำนวณอะไรบางอย่าง

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 117

    ทดสอบได้ว่า ถ้าลองกดปุ่ม F9 เพื่อบังคับให้มันคำนวณใหม่ คำว่า Calculate จะหายไป และผลลัพธ์การคำนวณจะถูกต้อง

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 118

    ความเลวร้ายของมันไม่ได้มีแค่นี้ เพราะถ้าเรา Save ไฟล์ที่ปรับแบบ Manual Calculation เอาไว้ แล้วเอาไปให้คนอื่นเปิด เพื่อนของเราก็จะติดอาการ Manual Calculate จากไฟล์นี้ไปด้วยเช่นกัน !

    วิธีแก้ไข

    ก็ให้ไปเลือก Calculation Options ให้เป็น Automatic ซะก็จบแล้ว

    กับดัก 3 : ทำให้มองไม่เห็นข้อมูลด้วยการถม Font สีเดียวกับพื้นหลัง

    วิธีแกล้งเพื่อนแบบง่ายๆ อีกอันก็คือ เราไปเปลี่ยน Font ของสีตัวอักษรให้มีสีเดียวกับ Background ซะเลย (ซึ่งมักจะเป็นสีขาว) เพียงเท่านี้เพื่อนก็จะมองไม่เห็นข้อความทีมีอยู่แล้วล่ะ เกรียนแบบทำง่ายมากๆ เลยอันนี้

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 119

    วิธีแก้ไข

    การสร้างกับดักอันนี้ง่ายมาก วิธีแก้ไขก็ง่ายมากเช่นกัน แค่เปลี่ยนสี Font เป็นสีอื่น เช่น Automatic หรือสีดำก็หายแล้ว

    กับดัก 4 : ทำให้มองไม่เห็นข้อมูลด้วย Custom Number Format

    ถ้าใครคิดว่าการใส่ Font สีขาวมัน Basic เกินไป มาดูการแกล้งด้วย Number Format แบบ Advance โดยให้เลือกข้อมูลแล้วใส่ Custom Format เป็น code ดังนี้

    ;;;
    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 120

    พอกด ok แล้ว ก็จะมองไม่เห็นข้อมูลทันที แต่ข้อมูลไม่ได้หายไปจริงๆนะ แค่มองไม่เห็นเฉยๆ สังเกตได้จากรูปข้างล่าง ตรง Formula Bar ยังมีคำว่า cat อยู่เลย แต่เรามองไม่เห็น

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 121

    การที่ Custom Format นี้ทำให้ข้อมูลหายไปได้เป็นเพราะว่า Custom Format แบบเต็มยศสามารถระบุได้ดังนี้

    Formatเลขบวก ; Formatเลขลบ ; Formatเลขศูนย์ ; Formatตัวหนังสือ

    แต่เราใส่แต่ ; ซึ่งเป็นตัวคั่นอย่างเดียว โดยไม่ใส่ code รูปแบบอะไรเลย ทำให้มองไม่เห็นข้อมูลเลยนั่นเองครับ

    ใครสงสัยเรื่อง Custom Number Format สามารถไปอ่านรายละเอียดได้ที่นี่เลย

    วิธีแก้ไข

    วิธีแก้ก็ให้ปรับ Format เป็น General หรือ Clear Format ทิ้งเช่นเดิมครับ

    กับดัก 5 : ถมดำพื้นหลังด้วย Conditional Format

    ปกติแล้วเครื่องมือ Conditional Format จะสามารถกำหนดได้ว่า หากข้อมูลใน Cell ตรงกับเงื่อนไขที่กำหนด ให้ใส่ Format ตามต้องการได้

    ถ้าจะแกล้งเพื่อนเราสามารถเลือกข้อมูลแล้วใส่เงื่อนไขประหลาดๆ เข้าไป เพื่อให้มันถมสีดำทั้ง Font และ Background แค่นี้ใครเจอก็เซ็งแล้วล่ะ เช่น ให้เลือก Highlight Cell Rules แบบ Greater Than

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 122

    จากนั้นใส่เลขติดลบเยอะๆ ไปเลย เช่น -1000000 แล้วเลือก Custom Format Fill สีดำซะ (สาเหตุที่ใส่เลขติดลบแล้วมันใช้งานได้ เพราะว่า Excel จะมองว่าข้อความจะมีค่ามากกว่าตัวเลขและตัวเลขปกติเราจะไม่ใส่ติดลบ แถมช่องว่าง Excel ก็จะมองว่าเป็นเลข 0 อีก มันจึงตรงเงื่อนไขหมดเลย)

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 123

    แค่นี้ฉากหลังจะหลายเป็นสีดำทันที แล้วถมสีแก้ไม่ได้ด้วย (เช่นในรูปผมกดถมสีเหลืองแล้ว มันก็ไม่เหลือง)

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 124

    วิธีแก้ไข

    ต้องเอา Conditional Format ออก ซึ่งเราอาจจะลบออกเฉพาะ Cell ที่เลือก หรือจะเอาออกทั้ง Sheet เลยก็ย่อมได้ (แต่ถ้าจะเลือกแบบละเอียด ให้ไปที่ Manage Rules แทน)

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 125

    กับดัก 6 : ซ่อนคอลัมน์แรกๆ ให้หายไปซะ

    อันนี้จริงๆ เป็นวิธีแกล้งที่เห็นง่าย แก้ง่าย แต่หลายคนแก้ไม่เป็น เช่น หากเราเลือกคอลัมน์แรกๆ แล้วคลิ๊กขวา Hide ซะ แค่นี้คอลัมน์ก็จะถูกซ่อนไป

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 126

    เนี่ย หายไปละ…

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 127

    วิธีแก้ไข

    เราจะเลือกคอลัมน์ที่มองเห็นอยู่ตามปกติแล้ว Unhide ธรรมดาๆ ไม่ได้ วิธีที่ถูกต้องคือ ต้องเลือกคอลัมน์แรกที่ยังมองเห็นอยู่แล้วลากไปทางซ้าย แล้วค่อนกดคลิ๊กขวา Unhide จึงจะได้

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 128

    กับดัก 7 : ทำให้เลื่อน Scroll หน้าจอไม่ได้ด้วยการ Freeze Pane

    ปกติแล้วเราจะสามารถ Lock หน้าจอบางส่วนให้ตรึงอยู่กับที่ แม้ว่าจะกด Scroll หน้าจอลงไปข้างล่างหรือไปทางขวาได้ วิธีการทำคือให้เลือกช่องแรกที่จะไม่ Lock แล้วกด View-> Freeze Pane

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 129

    จะพบว่าคอลัมน์ทางซ้าย และแถวข้างบนของ cell ที่เราเลือก (คอลัมน์ A-B และ Row 1) จะถูก Lock ให้อยู่กับที่ไว้ เมื่อทำการเลื่อนหน้าจอไปมา นี่คือการ Freeze Pane ที่ถูกต้อง

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 130

    แต่จะเกิดอะไรขึ้น ถ้าเราดันไป Freeze Pane ที่ Cell ขวาล่างมากๆ จนเกือบจะล้นหน้าจอ เช่น R22

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 131

    เพื่อนจะเลื่อนหน้าจอแทบไม่ไปเลย งงแน่นอน เกรียนสุดๆ

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 132

    กับดัก 8 : เปลี่ยน Format วันที่และเวลาให้เป็น General

    Excel นั้นมองวันที่และเวลาเป็นแค่ตัวเลขธรรมดาๆ ตัวนึง ดังนั้นหากเราเลือกข้อมูลที่เป็นวันที่ แล้วลองไปเปลี่ยน Number Format ให้เป็น General ดู พวกวันที่จะกลายเป็นเลข 4 หมื่นกว่าๆ ส่วนเวลาจะกลายเป็นทศนิยมไปเลย ดูแล้วปวดหัวมากมาย

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 133

    วิธีแก้ไข

    แค่เลือก Number Format กลับมาให้เป็นวันที่ก็จบแล้วครับ

    กับดัก 9 : เปลี่ยนความกว้างคอลัมน์ให้เหลือนิดเดียว

    สำหรับการแกล้งอันนี้เราจะมาเปลี่ยนความกว้างคอลัมน์ให้เหลือน้อยๆ กันครับ เพราะว่าเวลาที่ Excel มีพื้นที่แสดงข้อมูลไม่พอที่จะแสดงตัวเลขหรือวันที่ มันจะขึ้นเครื่องหมาย ### ขึ้นมา ทำให้หลายคนงงได้เลยล่ะ

    เราสามารถเปลี่ยนความกว้างคอลัมน์พร้อมกันหลายๆ คอลัมน์ได้เลย โดยเลือกหลายๆ คอลัมน์แล้วลากเปลี่ยนความกว้างทีเดียว

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 134

    วิธีแก้ไข

    วิธีแก้ไขก็ง่ายมาก แค่ปรับความกว้างคอลัมน์ให้เพียงพอก็จบแล้วครับ อาจใช้การดับเบิ้ลคลิ๊กที่ช่องแบ่งคอลัมน์ก็ได้

    กับดัก 10 : ทำให้พิมพ์อะไรไม่ได้เลยด้วย Data Validation

    ปติแล้วเครื่องมือ Data Validation จะสามารถช่วยให้เราสามารถกำหนดได้ว่าแต่ละ Cell จะยอมให้พิมพ์ข้อมูลแบบไหนลงไปได้บ้าง ซึ่งถ้าพิมพ์ผิดมันจะไม่ยอม

    วิธีแกล้งเพื่อน เราก็แค่เลือกพื้นที่แล้วใส่ Data Validation ที่เพื่อนไม่มีทางจะกรอกถูก เช่น ให้เลือกเป็น List แล้วใส่คำแปลกๆ ลงไป แต่ที่สำคัญให้เอา in-cell Dropdown ออก เพื่อนจะได้ไม่รู้ว่าต้องกรอกอะไร

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 135

    แค่นี้เพื่อนก็จะกรอกอะไรไม่ได้เลย

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 136

    วิธีแก้ไข

    แค่เลือกพื้นที่แล้วเลือก Data Validation แบบ Any Value (กรอกอะไรก็ได้) ก็จบเลยครับ

    กับดัก 11 : Protect Sheet แบบไม่ต้องใส่ Password

    วิธีอันนี้จะทำให้พิมพ์ข้อมูลไม่ได้ในช่องที่ทำการ Lock เอาไว้ ซึ่งตามปกติแล้วทุก Cell ใน Excel จะถูก Lockไว้ตั้งแต่ต้นอยู่แล้ว ดังนั้นเมื่อไหร่ที่ทำการ Activate การ Protect Sheet ขึ้นมาจริงๆ เราจะไม่สามารถแก้ไขอะไรใน Cell ได้เลย

    ดังนั้นวิธีการทำกับดัก ก็แค่ไปที่ Review -> Protect Sheet -> ok จบเลย

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 137

    แค่นี้เพื่อนก็จะไม่สามารถพิมพ์หรือแก้อะไรได้เลย

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 138

    วิธีแก้ไข

    แค่ไปที่ Review -> Unprotect Sheet ก็หายเลยครับ

    Tips : การ Protect sheet ในชีวิตจริง เราจะต้องมาเลือกบาง cell ที่ยอมให้เพื่อนกรอกได้ แล้วเอาการ Lock Cell ออกซะ ก่อนที่จะทำการ Protect Sheet จริงๆ

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 139

    กับดัก 12 : ทำให้แทรกคอลัมน์ แทรกแถวไม่ได้ด้วย Array Formula

    การเขียนสูตรแบบ Array Formula นั้น หากเราเขียนสูตรให้ผลลัพธ์แสดงออกมาหลายช่อง เวลาจะแก้ไขจะไม่สามารถแก้ช่องใดช่องหนึ่งได้ จะต้องแก้ไขโดยเลือกทั้ง Array แล้วแก้ไขเท่านั้น

    เช่น หากเราลองเลือกพื้นที่แล้วใส่สูตรว่า =1 แล้วกด Ctrl+Shift+Enter เพื่อเรียกใช้สูตรแบบ Array

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 140

    พอกด Ctrl+Shift+Enter แล้วจะมีเครื่องหมายปีกกามาครอบสูตรของเราเอง

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 141

    ซึ่งหากเราลองเลือกแค่บางส่วนของสูตร Array แล้วกด ปุ่ม del บน Keyboard เพื่อลบข้อมูล มันจะไม่ยอม โดยจะบอกว่าเราไม่สามารถแก้ไขบางส่วนของ Array ได้

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 142

    ซึ่งก็จะไม่สามารถแทรกแถว หรือ ลบแถว หรือคอลัมน์ เช่นกัน ยกเว้นว่าจะเลือกข้อมูลสูตร Array ทั้งหมดก่อนแล้วกดปุ่ม del บน Keyboard จึงจะลบได้

    ความเลวร้ายคือ หากเราใส่สูตรว่า =”” แล้วกด Ctrl+Shift+Enter เพื่อนจะมองไม่เห็นผลลัพธ์เพราะมันเป็น Array ของ Blank Text

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 143

    เพื่อนจะงงทันทีว่าทำไมเค้าถึงแทรกคอลัมน์ไม่ได้!

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 144

    วิธีแก้ไข

    ให้หา Array ว่างเปล่านั้นให้เจอแล้วลบทิ้งซะ ซึ่งการหา Array ให้เจอมันมีเทคนิคอยู่คือ ให้เลือกทั้งคอลัมน์(ที่เราลองแทรกแล้วไม่ได้) แล้วให้ใช้ Go to Special (Ctrl+g) –> Special ในการหาช่องที่เป็นสูตรก่อน

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 145

    มันจะเด้งมาเลือกช่องนึงที่มีสูตร Array อยู่

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 146

    ให้เรา Go to Special อีกทีแล้วเลือก Current Array (หรือกด Ctrl+/) มันจะเลือกพื้นที่ Array นั้นทั้งหมดให้เลย

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 147

    คราวนี้เราก็สามารถกดปุ่ม del บน Keyboard เพื่อลบ Array นั้นทิ้งได้แล้ว

    กับดัก 13 : ซ่อน Sheet แบบ Very Hidden

    ปกติแล้วเราจะสามารถซ่อน Sheet ใดๆ ที่ต้องการได้โดยกดคลิ๊กขวาที่ tab sheet แล้วเลือก Hide เพื่อซ่อน sheet ที่ต้องการได้เลย แต่วิธีนี้มันก็สามารถ Unhide ได้ง่ายๆ โดยกดคลิ๊กขวา Unhide ได้เลย

    วิธีที่แสบกว่าคือ กด Alt+F11 เพื่อเปิด Visual Basic Editor แล้วซ่อน Sheet แบบ Very Hidden ซะ ดังนี้

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 148

    จากนั้นก็กดปิดเจ้า Visual Basic Editor ซะ

    พอเราคลิ๊กขวาที่ sheet จะพบว่ามันไม่มีอะไรให้ Unhide แล้ว และเพื่อนก็งงทันที!

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 149

    วิธีแก้ไข

    วิธีแก้ก็ต้องกด Alt+F11 เข้าไปยัง Visual Basic Editor แล้วแก้กลับมาเป็น Visible เหมือนเดิม

    13 กับดักสุดเกรียนใน Excel ที่ใครโดนต้องกุมขมับ (พร้อมวิธีแก้ไข) 150

    จบแล้ว

    จริงๆ กับดักเกรียนๆ ยังมีอีกเยอะแยะเลย แต่ใครโดนกับดักแบบในบทความนี้ไปมีปวดหัวแน่นอน (แค่นี้เพื่อนก็จะเลิกคบแล้วล่ะ) พอดีกว่าเนอะ แต่ถ้าใครมีไอเดียเกรียนๆ จะแบ่งปันก็บอกมาได้นะครับ

  • วิธีเช็คว่าเลขแต่ละหลักเรียงจากน้อยไปมากหรือยัง

    วิธีเช็คว่าเลขแต่ละหลักเรียงจากน้อยไปมากหรือยัง

    อาทิตย์ก่อนหน้ามีแฟนเพจ inbox ถามมาว่า มีวิธีตรวจสอบอย่างไรว่าตัวเลข 5 หลักที่กรอกใน Cell นั้นเรียงจากน้อยไปมากแล้วหรือยัง? ผมคิดว่าเป็นเรื่องที่น่าสนใจ ดังนั้นมาดูวิธีทำกันครับ

    สมมติตัวอย่างเป็นแบบนี้

    วิธีเช็คว่าเลขแต่ละหลักเรียงจากน้อยไปมากหรือยัง 151

    วิธีทำมีได้หลายแบบ เช่น ถ้าใช้ Excel 365 ก็จะมีฟังก์ชันพิสดารให้ใช้เยอะแยะ แต่ถ้าใช้ Excel ที่เก่ากว่า 365 จะทำอะไรแปลกๆ ได้ยาก จึงเหมาะกับการเขียนเช็คทีละช่องให้ชัดเจนไปเลยเช่น

    ถ้าใช้ Excel 365

    ขั้นตอนแรกคือดึงข้อมูลแต่ละตัวมาพิจารณาด้วย MID เช่น

    =MID(A2,SEQUENCE(LEN(A2)),1)
    วิธีเช็คว่าเลขแต่ละหลักเรียงจากน้อยไปมากหรือยัง 152

    จากนั้นก็ลอง Sort ข้อมูลใหม่ ด้วย SORT

    =SORT(MID(A2,SEQUENCE(LEN(A2)),1))
    วิธีเช็คว่าเลขแต่ละหลักเรียงจากน้อยไปมากหรือยัง 153

    แล้วใช้ CONCAT หรือ TEXTJOIN รวมข้อความอีกที

    =CONCAT(SORT(MID(A2,SEQUENCE(LEN(A2)),1)))
    วิธีเช็คว่าเลขแต่ละหลักเรียงจากน้อยไปมากหรือยัง 154

    CONCAT แล้วจะเป็น Text ยังไงก็ไม่เท่าเลขเดิม ดังนั้นเราบังคับ Text ให้เป็น Number ด้วยการใส่ –นำหน้า แล้วค่อยเอามาเทียบกัน

    =--CONCAT(SORT(MID(A2,SEQUENCE(LEN(A2)),1)))=A2
    วิธีเช็คว่าเลขแต่ละหลักเรียงจากน้อยไปมากหรือยัง 155

    ตัวไหนที่เป็น TRUE คือตัวที่เรียงจากน้อยไปมากแล้วนั่นเอง

    ถ้าใช้ Excel version เก่ากว่า Excel 365

    ถ้าใช้ Excel version เก่า จะไม่มีฟังก์ชันเจ๋งๆ อย่าง SEQUENCE, SORT และ CONCAT ให้ใช้เลย ดังนั้นเราจะใช้แนวทาง คือ ดึงแต่ละคู่มาเทียบกันตรงๆ เลยน่าจะง่ายที่สุด เช่น

    =MID($A5,B$2,1)<=MID($A5,B$3,1)

    จากนั้น copy paste ทั้งตารางได้

    วิธีเช็คว่าเลขแต่ละหลักเรียงจากน้อยไปมากหรือยัง 156

    จากนั้นก็เขียนสูตรเช็คว่าทุกคู่เป็นจริงหรือไม่ด้วย AND ก็จบเลย

    วิธีเช็คว่าเลขแต่ละหลักเรียงจากน้อยไปมากหรือยัง 157

    ตัวที่เป็น TRUE ก็คือมีการเรียงแล้วนั่นเอง

    ชอบวิธีแบบไหนกัน?

    ทีนี้หลายคนอาจคิดว่าวิธีการของ Excel 365 ดูเหมือนจะยากกว่าซะงั้น จริงๆ เป็นเพราะว่ามันยืดหยุ่นมากกว่า เนื่องจากตัวเลขจะมีกี่หลักก็ได้ ในขณะที่วิธีแบบ Excel version เก่านี้ เหมาะกับจำนวนหลักที่แน่นอนมากกว่า

    ที่จริงแล้ว Excel version เก่าก็เขียนสูตรแบบ Array Formula เพื่อให้จำนวนหลักมัน Dynamic ได้แบบเดียวกับ Excel 365 ก็ได้ แต่สูตรที่เขียนจะซับซ้อนขึ้นมากเลยครับ ใครอยากลองฝึกของโหดก็ลองดูได้นะ ^^

  • Excel Array Formula ตอนที่ 2 : การใช้ Array Formula แบบมีเงื่อนไขด้วย IF

    Excel Array Formula ตอนที่ 2 : การใช้ Array Formula แบบมีเงื่อนไขด้วย IF

    ในตอนที่แล้ว เราได้เรียนพื้นฐานของการใช้ Array Formula กันไปแล้ว ในตอนนี้ผมจะใช้ IF และ Boolean Logic มาช่วยสร้างสูตร Array Formula แบบมีเงื่อนไขกันครับ

    ใช้ความเป็น FALSE ของ IF

    วิธีนี้เราจะใช้ IF เช็คเงื่อนไข ถ้ากรณีเป็นจริงจะทำตามที่กำหนด กรณีเป็นเท็จจะปล่อยให้เป็น FALSE ไปเพื่อ Ignore การคำนวณนั้นๆ เช่น กรณีสนใจแค่เพศหญิง ก็ใช้สูตรแบบนี้ได้ (สังเกตว่าเราจะไม่ใส่ value_if_false )

    =IF(C2:C16=E2,B2:B16)
    Excel Array Formula ตอนที่ 2 : การใช้ Array Formula แบบมีเงื่อนไขด้วย IF 158

    ถ้าหากอยากได้ค่าน้อยสุดก็เอา MIN ไปครอบซะ เช่น

    =MIN(IF(C2:C16=E2,B2:B16))

    แค่นี้เราก็สามารถเลียนแบบฟังก์ชัน MINIFS ได้แล้ว แต่มันเจ๋งกว่านั้น เพราะเราใช้ฟังก์ชันอะไรก็ได้

    เราจะใช้ MEDIAN ก็ยังได้ เช่น กรณีสนใจค่า MEDIAN กรณีเป็นผู้ชายก็เขียนสูตรดังนี้ได้

    =MEDIAN(IF(C2:C16=E2,B2:B16))
    Excel Array Formula ตอนที่ 2 : การใช้ Array Formula แบบมีเงื่อนไขด้วย IF 159

    กรณีมีหลายเงื่อนไขแบบ AND

    ใน Array Formula เราจะใช้ฟังก์ชัน AND ตรงๆ ไม่ได้ เพราะมันจะรวบเงื่อนไขทุกตัวเข้าด้วยกันแบบไม่แยก item พิจารณา ถ้ามีตัวใดตัวหนึ่งเป็น FALSE มันจะ FALSE ทันที และให้ผลออกมาค่าเดียวเลย

    เช่น ให้เงื่อนไขคือ เป็นผู้ชาย ที่สูงน้อยกว่า 160 ถ้าใช้ AND จะเป็นดังนี้

    =AND(C2:C16=E2,B2:B16<E5)
    Excel Array Formula ตอนที่ 2 : การใช้ Array Formula แบบมีเงื่อนไขด้วย IF 160

    ถ้าจะใช้เงื่อนไขแบบ AND เราจะใช้ Boolean Logic ด้วยหลักการคูณ ที่ว่า ถ้าตัวใดตัวหนึ่งเป็น FALSE มันจะคูณได้ 0 ทันที การจะออกมาเป็น 1 ได้จะต้องเป็น TRUE ทุกตัวเท่านั้น

    ดังนั้นเราจะเปลี่ยนเงื่อนไขเป็นดังนี้ได้

    =(C2:C16=E2)*(B2:B16<160)
    Excel Array Formula ตอนที่ 2 : การใช้ Array Formula แบบมีเงื่อนไขด้วย IF 161

    จากนั้นก็เอา IF ไปครอบได้ ซึ่งปกติแล้วตรง logical_test ของ IF สามารถเปลี่ยนเลข 0 เป็น FALSE และเลขอื่นเป็น TRUE ได้

    =IF((C2:C16=E2)*(B2:B16<E5),B2:B16)
    array formula condition if

    ที่นี้ถ้าอยากได้การสรุปแบบไหนก็ครอบลงไปอีกทีได้ เช่น หาค่า MEDIAN อีกก็ได้

    =MEDIAN(IF((C2:C16=E2)*(B2:B16<E5),B2:B16))
    Excel Array Formula ตอนที่ 2 : การใช้ Array Formula แบบมีเงื่อนไขด้วย IF 162

    กรณีมีหลายเงื่อนไขแบบ OR

    กรณีเป็นเงื่อนไขแบบ OR ถ้าหากเป็น Array Formula เราก็จะใช้ OR ไม่ได้เช่นกัน ด้วยเหตุผลเดียวกับ AND ว่ามันจะรวบให้เหลือตัวเดียว ดังนั้นเราจะใช้ Boolean Logic แบบบวก (ถ้ามีตัวใดตัวหนึ่งเป็น TRUE บวกกันแล้วจะต้องมากกว่า 0 แน่นอน) เช่น

    เป็นหญิง หรือ สูงน้อยกว่า 160

    =(C2:C16=E2)+(B2:B16<E5) 
    Excel Array Formula ตอนที่ 2 : การใช้ Array Formula แบบมีเงื่อนไขด้วย IF 163

    ทีนี้เราก็เอา IF มาใส่ได้ละ เลข 0 จะเป็น FALSE ส่วนเลขอื่่นจะเป็น TRUE ทั้งหมดเลย

    =IF((C2:C16=E2)+(B2:B16<E5),B2:B16)
    Excel Array Formula ตอนที่ 2 : การใช้ Array Formula แบบมีเงื่อนไขด้วย IF 164

    ทีนี้ถ้าจะหาค่า MEDIAN ก็ครอบลงไปอีกที

    =MEDIAN(IF((C2:C16=E2)+(B2:B16<E5),B2:B16))
    Excel Array Formula ตอนที่ 2 : การใช้ Array Formula แบบมีเงื่อนไขด้วย IF 165

    และนี่ก็คือตัวอย่างการใช้ Array Formula แบบมีเงื่อนไข เพื่อนๆ ลองเล่นกันดูนะครับ ว่าทำได้หรือไม่ ถ้าทำแล้วติดอะไรก็ Comment ถามได้เลยนะครับ

  • การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target

    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target

    การใช้ Pivot Table แบบปกตินั้นเวลาเราจะทำรายงานยอดขาย Actual vs Target เราจะทำต้องทำตาราง Pivot แยกกัน 2 อัน แล้วค่อยเอามาเทียบกันด้วยวิธีอะไรบางอย่าง ไม่ว่าจะ Copy Paste หรือ VLOOKUP มาอยู่ข้างๆ กัน แต่ถ้าหากเราใช้ Concept ของ Data Model เราจะสามารถทำรายงาน Actual vs Target ในตาราง Pivot เดียวได้เลย

    โหลดไฟล์ Target

    โหลดไฟล์ Target ได้ที่นี่

    วิธีการทำรายงาน Actual vs Target

    จากหลักการของ Data Model ที่เราเรียนมาในตอนที่แล้ว จะช่วยให้เราสามารถทำรายงาน Actual vs Target ได้โดยง่าย แค่หา Dimension Table ที่ Common กัน ระหว่าง Fact Table ที่เป็น Actual กับค่าตัวเลขของตาราง Target เราก็จะสามารถ Filter ข้อมูลจาก Field ที่อยู่ในตาราง Dimension ที่ Common กันนั้น แล้วส่งผลผ่าน Relationship ไปหาทั้งตาราง Actual และ Target พร้อมๆ กันนั่นเอง

    เช่นข้อมูลในตาราง Target ผมเป็นแบบนี้

    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 166

    จะเห็นว่าข้อมูลที่พอจะนำไปเชื่อมกับ Dimension ที่ Common กับตาราง Actual ได้ก็คือ สินค้า กับเรื่องของวันที่นั่นเอง

    ตอนนี้เรามีตารางสินค้าแล้ว ดังนั้นสิ่งที่เราควรจะทำคือ สร้างตารางวันที่ขึ้นมา

    ตารางวันที่

    เราสามารถสร้างตารางวันที่แบบที่ 1 บรรทัดคือ 1 วัน หรือ 1 บรรทัดคือ 1 เดือนก็ได้ แล้วแต่เราจะออกแบบ

    ซึ่งถ้าเอาละเอียดก็ควรเป็นแบบที่ 1 บรรทัดมี 1 วัน ซึ่งจะสร้างตารางวันที่ใน Excel แล้ว Import เข้า Data Model หรือจะใช้ Power Query สร้างแบบ Dynamic ขึ้นมาก็ได้ (แต่ถ้าใช้ Power BI จะสร้างมารถใช้ DAX แบบ New Table สร้างได้ซึ่งเป็นวิธีที่ง่ายที่สุด)

    ซึ่งหากใครอยากจะสร้างตารางวันที่ระดับวัน สามารถทำตามที่เคยได้แนะนำในบทความนี้ได้เลย

    แต่เพื่อความง่าย ในบทความนี้เราจะทำตารางวันที่ในระดับเดือนละกัน (สมมติว่าในรายงานของเราจะทำสรุปแค่ระดับเดือน)

    ดังนั้นเดี๋ยวผมจะเอาข้อมูลวันที่จาก Target ไปทำเป็นตารางวันที่ซะเลย โดยเดี๋ยวเราจะเปิดไฟล์หลัก (DataModel) แล้วทำการ Get Data จากไฟล์ Target แค่ปีกับเดือน แล้วแยกไปเป็น Query ใหม่ชื่อ DateTable ดังนี้

    มาถึง คอลัมน์ปีมันเว้นว่างไว้ ก็สั่ง คลิ๊กขวา -> Fill Down ซะ แล้ว Remove Other Columns

    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 167

    จากนั้นก็ Add Column -> Column from Example แล้วสร้าง Field ที่เชื่อมปีกับเดือนซะ แบบนี้ ซึ่งมันจะสร้างสูตรให้ว่า

    Text.Combine({Text.From([ปี], "th-TH"), Text.PadStart(Text.From([เดือน], "th-TH"), 2, "0")})
    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 168

    ผมตั้งชื่อคอลัมน์ใหม่นี้ว่า DateKey เป็นอันจบ

    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 169

    จากนั้นก็กด Close&Load to… แบบ Connection Only แต่ให้ติ๊ก Load เข้า Data Model ซะ

    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 170

    จัดการกับ Table Target

    ต่อไปเราจัดการกับไฟล์ Target ให้กลายเป็นข้อมูลเชิง Database ที่เรียบร้อยขึ้นด้วยการ Get Data ใหม่อีกที จากนั้น Fill Down ปี แล้ว Unpivot สินค้าลงมาให้หมด ได้ดังนี้

    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 171

    คราวนี้เราจะไปทำ DateKey ใน Data Model บ้าง ขี้เกียจใช้ Column From Example เหมือนเดิมละ (เปลี่ยนวิธีบ้าง จะได้เห็นวิธีทำหลายๆ แบบเนอะ) ดังนั้นเรา Load Data นี้เข้า Data Model ไปเลย

    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 172

    จากนั้นเราเข้าไปดู Target ใน Power Pivot จะเห็นแบบนี้ (ซึ่งเป็นผลลัพธ์ของ Power Query)

    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 173

    ต่อไปเราจะสร้างคอลัมน์ใหม่ให้เป็น DateKey ด้วย DAX ดังนี้

    DateKey:=Target[ปี]&FORMAT(Target[เดือน],"00")
    • ซึ่งเราจะอ้างอิงคอลัมน์ด้วย ชื่อตาราง[ชื่อคอลัมน์]
    • ฟังก์ชัน FORMAT จะเหมือนกับฟังก์ชัน TEXT ของ Excel มีความสามารถในการแปลง Value ตัวเลขให้เป็น Text ที่มีหน้าตาตาม Custom Number Format ที่กำหนดได้ (ซึ่งผมกำหนดให้เป็นเลข 2 หลัก ด้วย 00)
    • จากนั้นเอามาเชื่อมกันด้วย &
    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 174

    เราทำแบบนี้กับตารางหลัก ซึ่งก็คือ TXDate เช่นกัน

    DateKey:=TXData[ปี]&FORMAT(TXData[เดือน],"00")
    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 175

    จากนั้นมาดู Data Model ที่ Diagram View

    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 176

    0ากนั้นให้ทำการผูก Relationship เพิ่มเติมซะ

    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 177

    จากนั้น Add Measure Total Target เข้าไปในตาราง Target ซะ

    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 178

    แค่นี้เราก็พร้อมจะทำรายงาน Actual vs Target แล้ว

    แค่ต้องลาก Field จากตาราง Dimension ที่ Common กันระหว่างตาราง Actual กัย Target แค่นี้ก็ดูข้อมูลเทียบกันได้แล้ว

    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 179

    ถ้าอยากรู้ว่า Actual ทำได้กี่ % เมื่อเทียบกับ Target ก็สร้าง Measure เพื่อจับหารกันได้ แต่การหารแบบดัก Error ให้เป็น Blank ได้สามารถใช้ฟังก์ชัน DIVIDE ใน DAX มาช่วยได้เลยดังนี้

    =DIVIDE([TotalSales],[TotalTarget])
    การใช้ Excel Power Pivot ตอนที่ 5 : การทำรายงาน Actual vs Target 180

    แค่นี้ก็สามารถแสดง %Achievement ได้แล้ว ไม่ต้อง Copy Paste, ไม่ต้อง VLOOKUP อะไรทั้งสิ้น

    รายงาน actual vs target report

    และนี่ก็คือตัวอย่างการทำรายงานแบบ Actual vs Target ด้วย Power Pivot ครับใครทำตามแล้วสงสัยอะไรก็สามารถ Comment ถามได้นะครับ

    ศึกษา Power Query เพิ่มเติมได้ที่ไหน?

    ในบทความนี้มีการใช้ Power Query มาช่วยจัดการข้อมูลพอสมควร ใครเห็นแล้วสนใจ อยากจะศึกษาให้ลึกซึ้งกว่านี้ สามารถศึกษาได้จาก (เข้าไปดูเนื้อหาบางส่วนได้ฟรี)

    หรือถ้าชอบแบบอ่านหนังสือ ก็ศึกษาได้จาก หนังสือ Excel Power Upได้เลยครับ (สามารถอ่านเนื้อหาฟรีๆ บางส่วนได้ที่นี่)

    สารบัญซีรีส์ Power Pivot

    • การใช้ Excel Power Pivot ตอนที่ 4 : Data Model ทำงานอย่างไร

      การใช้ Excel Power Pivot ตอนที่ 4 : Data Model ทำงานอย่างไร

      ก่อนที่เราจะทำรายงาน Actual vs Target ได้นั้นเราจะต้องมีความเข้าใจเรื่องของ Data Model ซะก่อนว่ามันทำงานยังไง ซึ่งในตอนที่แล้วผมแค่ทำการสร้าง Relationship แล้วทำรายงานให้ดูเฉยๆ แต่ยังไม่ได้อธิบายการทำงานของมันเลย จึงคิดว่าเพื่อเป็นพื้นฐานที่ดี เราควรจะเข้าใจการทำงานของมันอย่างลึกซึ้งยิ่งขึ้นซะก่อน

      สาเหตุที่วิเคราะห์ข้อมูลข้ามตารางได้

      การที่เราสามารถลากข้อมูลจากคนละตารางมาวิเคราะห์ร่วมกันได้ เพราะมันมีการ Filter ข้อมูลข้ามตาราง ผ่านทิศทางของเส้น Relationship ซึ่งสังเกตว่ามันจะวิ่งจาก Dimension Table (ตารางอ้างอิง) ไป Fact Table (ตารางหลัก)

      data model

      เช่น ที่เราลากประเทศลงมา แล้วตัวเลขต่างๆ ใน Pivot สามารถแสดงออกมาได้ถูกต้องตามรูปนี้ มันมีหลักการดังนี้

      การใช้ Excel Power Pivot ตอนที่ 4 : Data Model ทำงานอย่างไร 181

      สมมติเราดูที่ประเทศลาว : การที่ได้เลข TotalSales 24,231 และ Count of TXID 49 มันมาจากอะไร?

      เราต้องอย่าลืม Concept ที่สำคัญที่สุดของการคำนวณทุกอย่างใน Pivot Table นั่นก็คือ

      ข้อมูลแต่ละช่องใน Pivot Table แท้จริงนั้นคำนวณมาจากการ Filter ข้อมูลตามสิ่งที่ระบุใน Rows Label, Column Label, และหัว Filter รวมถึง Slicer (เราเรียกบริบทการ Filter ทั้งหมดที่แต่ละช่องในรายงาน Pivot ต้องเจอว่า Filter Context) จากนั้นค่อยทำการคำนวณตามวิธีที่ระบุในช่อง Values (ซึ่งถ้าเป็น Power Pivot ก็สามารถคำนวณด้วยสูตรใน Measure)

      เทพเอ็กเซลพยายามเน้นเรื่องนี้ตลอดนะ สำคัญมากๆ

      ดังนั้นใน Row Label ที่เป็นของประเทศลาว จึงเปรียบเสมือนว่าเรา Filter ตาราง CustomerCountry ที่คอลัมน์ประเทศ ด้วยค่า “ลาว” ซึ่งจะทำให้เหลือ customer id แค่เบอร์ C00008, C00009, และ C00010 ดังนี้

      การใช้ Excel Power Pivot ตอนที่ 4 : Data Model ทำงานอย่างไร 182

      ซึ่งค่าเหล่านี้เป็ Key ที่เชื่อมไปยังตารางหลัก ซึ่งก็คือ TXData ของเรา ซึ่งมันจะไป Filter ตารางหลักในคอลัมน์ลูกค้าด้วยค่าเหล่านี้ด้วย ซึ่งได้ผลดังนี้

      การใช้ Excel Power Pivot ตอนที่ 4 : Data Model ทำงานอย่างไร 183

      จะเห็นว่าเลขที่คำนวณได้จาก Row ที่เหลือจากการ Filter นั้นตรงกับค่าใน Pivot เลย และนี่ก็คือที่มาที่ไปของเลขนั้น

      และถ้าใน Pivot เราลากสินค้า (จากตาราง ProductCost) ลงมาอีก เช่น

      การใช้ Excel Power Pivot ตอนที่ 4 : Data Model ทำงานอย่างไร 184

      หากดูที่ ประเทศลาว สินค้าเป็น dvd หนัง : จะเหลือ TotalSales 8,681 และ Count of TXID 10

      มันก็เปรียบเสมือนมีการ Filter สินค้า ในตาราง ProductCost ให้เป็น dvd หนัง แล้วมันก็จะส่งผลให้ไป Filter ตารางหลักให้เป็น dvd หนังไปด้วยนั่นเอง (เรียกได้ว่ามีการรุมกัน Filter จากทั้ง CustomerCountry และ ProductCost เลยล่ะ)

      การใช้ Excel Power Pivot ตอนที่ 4 : Data Model ทำงานอย่างไร 185

      Field สินค้ามี 2 ที่ ควรลากจากตารางไหน?

      Field สินค้านั้นมีอยู่ทั้งในตาราง ProductCost (Dimension Table) และ TXData (Fact Table) ซึ่งจริงๆ ก็เป็นงี้กับทุกตารางนั่นแหละ

      การจะลาก Field สินค้าจากตาราง ProductCost หรือลาก Field สินค้าจาก TXData ลงมาวิเคราะห์ ณ ตอนนี้จะมีค่าเท่ากัน… เพราะว่ามีการขายสินค้าใน ProductCost ทุกอย่างครบในตาราง TXData จริงๆ

      แต่ถ้าหากว่าในตาราง ProductCost (Dimension Table) มีประเภท Product เยอะกว่า เช่น มี Product บางตัวของบริษัทที่ยังขายไม่ออก (จึงยังไม่มีในตาราง TXData) แบบนี้ผลลัพธ์จะไม่เหมือนกันได้ การจะเห็นภาพชัดกว่าก็ควรลากจากตาราง Dimension มากกว่าที่จะลากจาก Fact Table

      เช่น เราไปเพิ่มสินค้าใน Product Cost ของ sheet Excel แล้ว Refresh ใน Data Model ดังนี้

      การใช้ Excel Power Pivot ตอนที่ 4 : Data Model ทำงานอย่างไร 186
      อันนี้เพิ่มใน Sheet Excel

      จากนั้นไปกด Data -> Refresh All เพื่อให้ Data Model มีการอัปเดท

      ทีนี้หากเราลองไปที่Pivot แล้ว ใส่สินค้าจากตาราง ProductCostไปที่ Row อย่างเดียว (อย่าเพิ่งใส่ Value) จะเห็น item เกมด้วย (ถ้าลากสินค้าจาก TXData จะไม่มีเกม)

      การใช้ Excel Power Pivot ตอนที่ 4 : Data Model ทำงานอย่างไร 187

      แต่พอเราลาก TotalSales ลงมา เกมจะหายไป เพราะปกติแล้วหากค่า Value เป็น Blank มันจะไม่แสดงออกมา

      การใช้ Excel Power Pivot ตอนที่ 4 : Data Model ทำงานอย่างไร 188

      หากเป็น Pivot Table ปกติ เราจะสามารถตั้งค่าให้แสดงแบบ Show item with no data ได้ แต่ใน Power Pivot มันจะติ๊ก option นี้ไม่ได้

      การใช้ Excel Power Pivot ตอนที่ 4 : Data Model ทำงานอย่างไร 189

      ทางนึงที่พอจะแก้ได้คือ ให้เราแก้สูตรใน Measure ให้มันไม่มีทางเป็น Blank ซะเลย เช่น จับบวกเลข 0 ลงไป แค่นี้ก็ไม่มีทาง Blank แล้ว

      ซึ่งเราสามารถไป Edit Measure ที่สร้างไว้แล้วใน Ribbon Power pivot ได้ โดยไปที่ Power Pivot -> Measures -> Manage Measures -> Edit แล้วแก้สูตรโดยบวก 0 เข้าไปซะ

      การใช้ Excel Power Pivot ตอนที่ 4 : Data Model ทำงานอย่างไร 190

      แค่นี้เราก็สามารถแสดงค่า 0 ออกมาได้สบายๆ แล้ว

      การใช้ Excel Power Pivot ตอนที่ 4 : Data Model ทำงานอย่างไร 191

      นอกจากนี้ บางทีเราต้องการจะนับ item แบบไม่ซ้ำด้วย DISTINCTCOUNT เราก็ต้องเลือกให้เหมาะสม

      • ถ้าจะนับสินค้าทุกอย่างที่มีให้ขายก็ควรจะนับจาก Dimension Table
        • =DISTINCTCOUNT(ProductCost[สินค้า])
      • ถ้าจะนับสินค้าที่มีให้ขายแล้วจริงก็ควรจะนับจาก Fact Table
        • =DISTINCTCOUNT(TXData[สินค้า])

      เช่นแบบนี้

      การใช้ Excel Power Pivot ตอนที่ 4 : Data Model ทำงานอย่างไร 192

      หวังว่าเพื่อนๆ จะพอเข้าใจหลักการทำงานของ Data Model มากขึ้นนะครับ ใครไม่เข้าใจตรงไหนก็ comment ถามได้นะ แต่อย่างที่บอกไปหลายครั้งว่า Concept ของ Power Pivot นั้นเหมือนกับ Power BI มาก ใครอยากเจาะลึกก็แนะนำ

      ตอนต่อไป

      ตอนต่อไป เราจะมาเรียนรู้เรื่องการทำรายงาน Actual vs Target กันจริงๆ ละ 555

      สารบัญซีรีส์ Power Pivot

      • ซีรีส์สอนวิธีใช้ Pivot Table ใน 5 นาที

        ซีรีส์สอนวิธีใช้ Pivot Table ใน 5 นาที

        คลิปนี้ผมจะมาสอนการใช้เครื่องมือสรุปผลข้อมูลที่เจ๋งที่สุดใน Excel อย่าง Pivot Table ให้เพื่อนๆ ที่ยังไม่เคยใช้มาก่อนได้รู้จักและใช้มันเป็นภายใน 5 นาทีครับ (ซึ่งน่าจะมีหลายตอนเลยล่ะ ติดตามกันไปยาวๆ นะ)

        สามารถโหลดไฟล์ประกอบได้ที่นี่ : https://github.com/ThepExcel/download… แล้วคลิ๊กคำว่า Download นะ

      • การใช้ Excel Power Pivot ตอนที่ 3 : ลาก่อน VLOOKUP สวัสดี Data Model

        การใช้ Excel Power Pivot ตอนที่ 3 : ลาก่อน VLOOKUP สวัสดี Data Model

        ในตอนนี้เราจะมาเรียนรู้เรื่องของการผูก Data Model ซึ่งก็คือการทำให้ข้อมูลหลายๆ ตารางมาผูกความสัมพันธ์กัน (Relationship) รวมกันเป็นสิ่งที่เรียกว่า Data Model ซึ่งจะช่วยให้เราสามารถดึงข้อมูลจากตารางอื่นมาใช้ Pivot ร่วมกับตารางหลักได้อย่างสบายๆ ไม่ต้องใช้ VLOOKUP อีกต่อไป

        เอาข้อมูลแต่ละตารางเข้าสู่ Data Model

        แนวทางที่ผมอยากแนะนำคือ ให้แปลงข้อมูลเป็น Table ก่อน แล้วตั้งชื่อ Table ซะ แล้วค่อย Add เข้า Data Model ครับ เราจะมาทำทีละตารางกัน (ตารางหลักเราทำไปแล้ว)

        เริ่มจากการ Convert เป็น Table (Ctrl+T) และ ตั้งชื่อ Table ซึ่งผมตั้งว่า SalesBio

        การใช้ Excel Power Pivot ตอนที่ 3 : ลาก่อน VLOOKUP สวัสดี Data Model 193

        Convert และตั้งชื่อให้ครบทุกตารางเลยนะครับ (ยกเว้นตาราง Commission ซึ่งยังยากไปขอข้ามไปก่อน) ตารางอื่นๆ ผมตั้งชื่อดังนี้

        • CustomerCountry
        • ProductCost

        พอตั้งชื่อครบทุกตารางแล้ว ก็ไปที่ Ribbon PowerPivot แล้วกด Add to Data Model ซะ

        การใช้ Excel Power Pivot ตอนที่ 3 : ลาก่อน VLOOKUP สวัสดี Data Model 194

        มันจะเปิดหน้าต่าง PowePivot ขึ้นมา และทำการ Add ตารางที่เราเลือกเข้าไป (ในขณะที่ตาราง TXData อยู่อีก tab นึงทางด้านซ้าย)

        การใช้ Excel Power Pivot ตอนที่ 3 : ลาก่อน VLOOKUP สวัสดี Data Model 195

        ให้เรากดปุ่มรูป Excel เพื่อ Switch to Workbook กลับมายัง Excel ปกติ

        การใช้ Excel Power Pivot ตอนที่ 3 : ลาก่อน VLOOKUP สวัสดี Data Model 196

        จากนั้นก็มา Add ตารางอื่นต่อจนครบ

        การใช้ Excel Power Pivot ตอนที่ 3 : ลาก่อน VLOOKUP สวัสดี Data Model 197

        Tips : จริงๆ แล้วเราสามารถ Add ตารางเข้า Data Model ผ่าน Power Query ก็ได้นะ (ตอน Close & Load to… จะมีให้ติ๊ก) ซึ่งการเอาข้อมูลเข้า Data Model จะไม่ได้ถูกจำกัดจำนวนแถวที่ล้านกว่าแถวเหมือน Excel นะ (เช่น Get Data มาจาก Source อื่นที่มีหลายล้านบรรทัด) แต่เผื่อบางคนยังไม่รู้จัก Power Query ผมยังไม่พูดถึงรายละเอียดละกัน

        สรุปว่าตอนนี้ผมมี 4 ตารางครบแล้วนะ

        การใช้ Excel Power Pivot ตอนที่ 3 : ลาก่อน VLOOKUP สวัสดี Data Model 198

        ผูก Relationship ให้ Data Model

        เมื่อเอาข้อมูลเข้าไปครบแล้ว เราจะไปผูก Relationship ให้กับ Data Model กัน โดยไปที่ Home -> Diagram View

        การใช้ Excel Power Pivot ตอนที่ 3 : ลาก่อน VLOOKUP สวัสดี Data Model 199

        จากนั้นให้เราจัดเรียงตารางหลักให้อยู่ตรงกลาง (จะได้ดูง่ายๆ) แล้วลากความสัมพันธ์เชื่อมแต่ละตารางเข้าด้วยกัน ผ่าน Field ที่เป็นตัวเชื่อม เช่น TXData กับ SalesBio จะเชื่อมกันด้วย “ผู้ขาย” (จะเริ่มการลากจากตารางไหนก็ได้)

        การใช้ Excel Power Pivot ตอนที่ 3 : ลาก่อน VLOOKUP สวัสดี Data Model 200

        จะได้ผลลัพธ์ดังนี้ ซึ่งมีเลข 1 กับ * โผล่มาที่เส้นของ Relationship

        การใช้ Excel Power Pivot ตอนที่ 3 : ลาก่อน VLOOKUP สวัสดี Data Model 201
        • เลข 1 (one) หมายถึง Field ตัวเชื่อมในฝั่งตารางนั้น มีค่าไม่ซ้ำกัน (แต่ละค่ามีตัวเดียว)
          • เราจะเรียกตารางฝั่งที่เป็นเลข 1 ว่าตาราง Dimension Table (หรือตารางอ้างอิง)
        • สัญลักษณ์ * (many) หมายถึง Field ตัวเชื่อมในฝั่งตารางนั้น มีค่าซ้ำกันได้ (แต่ละค่ามีหลายตัว)
          • เราจะเรียกตารางฝั่งที่เป็นเลข 1 ว่าตาราง Fact Table (หรือตารางหลัก ที่เก็บ Transaction จริงๆ ไว้)

        ดังนั้นความสัมพันธ์ระหว่าง SalesBio กับ TXData ก็จะเรียกว่า One-to-Many นั่นเองครับ (ถ้ามองอีกทิศก็เป็น Many-to-One)

        หมายเหตุ : Data Model ของ Excel จะไม่รองรับแบบ Many-to-Many นะครับ (จะต้องสร้าง Table มาเชื่อมตรงกลางอีกที ถึงจะใช้ได้) แนวทางการทำประมาณนี้

        ทีนี้เราก็ลากเชื่อมตารางอ้างอิงทุกอันเข้ากับตารางหลัก ได้ดังนี้

        • ผู้ขาย vs ผู้ขาย
        • สินค้า vs สินค้า
        • ลูกค้า vs customer id (สังเกตว่าชื่อ Field ไม่เหมือนกันก็ได้)
        การใช้ Excel Power Pivot ตอนที่ 3 : ลาก่อน VLOOKUP สวัสดี Data Model 202

        พอลากเชื่อมหมดแล้ว เราสามารถ Switch กลับไปที่ Excel ของเราที่ทำตาราง Pivot เอาไว้แล้ว และไปดูที่ All เพื่อให้มองเห็นทุกตารางได้

        การใช้ Excel Power Pivot ตอนที่ 3 : ลาก่อน VLOOKUP สวัสดี Data Model 203

        สมมติผมจะเอาประเทศลูกค้าลงมาวิเคราะห์ร่วมกันกับตารางหลัก ก็สามารถลากลงมาได้เลย โดยไม่ต้อง VLOOKUP มารวมในตารางเดียวกันเหมือนสมัยโบราณอีกต่อไป (เพราะเราเชื่อมความสัมพันธ์ผ่าน Relationship ของ Data Model แล้ว)

        การใช้ Excel Power Pivot ตอนที่ 3 : ลาก่อน VLOOKUP สวัสดี Data Model 204

        และนี่คือประโยชน์ของการใช้ Data Model ครับ ซึ่งจะช่วยเอาข้อมูลจากหลายๆ ตารางมาวิเคราะห์ร่วมกันได้ ซึ่งคำนวณได้รวดเร็วกว่า VLOOKUP เยอะมาก และรองรับข้อมูลจำนวนมหาศาลได้ด้วย ซึ่ง Concept ของ Data Model ก็แทบจะเหมือนกับใน Power BI เลยล่ะ (แต่ Power BI มีความสามารถมากกว่านิดหน่อย) ใครอยากลงลึกเรื่องนี้ก็ลองไปเล่นใน Power BI ได้นะครับ

        ตอนต่อไป

        ในบทความนี้จะเป็นแค่ Data Model พื้นฐานเท่านั้น ในตอนต่อไปจะเป็นการอธิบายการทำงานของ Data Model อย่างละเอียดมากขึ้นครับ

        สารบัญซีรีส์ Power Pivot

        • การใช้ Excel Power Pivot ตอนที่ 2 : ทำผลสรุป Value ให้เป็นข้อความด้วย DAX

          การใช้ Excel Power Pivot ตอนที่ 2 : ทำผลสรุป Value ให้เป็นข้อความด้วย DAX

          ตามปกติแล้ว ในช่อง Values ของ Pivot Table จะแสดงข้อมูลออกมาได้แค่ตัวเลขเท่านั้นไม่สามารถทำเป็นข้อความได้ ที่เป็นแบบนั้นเพราะมันถูกสรุปด้วยการ Sum, Count, Average, Max, Min ปกติไงล่ะ… แต่ใน Power Pivot เราสามารถเขียน Measure ได้ด้วยฟังก์ชัน DAX อะไรก็ได้ ดังนั้นเราก็สามารถสรุปผลลัพธ์ที่เป็น Text ได้แล้วล่ะ และในบทความนี้ก็จะสอนวิธีทำให้ครับ

          Warning : บทความนี้เริ่มมีความซับซ้อน

          ในบทความนี้อาจมีสูตรหลายตัวที่ค่อนข้างมีความซับซ้อน เพราะเกี่ยวข้องกับ Concept หลายๆ อย่างของ DAX ที่ใน Excel ไม่มี เช่นเรื่องของ Table Function หรือสูตรที่ให้ผลลัพธ์ออกมาเป็นตาราง รวมถึง Concept ของการคำนวณ ซ้ำๆ แต่ละแถวของตารางด้วย Expression ที่กำหนด (เรียกว่า Iterate) ซึ่งค่อนข้างใช้จินตนาการสูงพอควร

          การจะเข้าใจอย่างลึกซึ้งว่ามันทำงานยังไง คุณอาจต้องศึกษาการทำงานของ DAX เพิ่มเติมด้วยนะครับ เพราะมันอธิบายสั้นๆ ได้ยากพอควร

          ซึ่ง Tips ที่ผมอยากแนะนำ คือ เรียน DAX ผ่าน Power BI จะง่ายกว่า Excel เพราะใน Power BI มีตัวช่วยเยอะกว่า ซึ่งเรียนใน Power BI แล้วสุดท้ายก็เอามาใช้ใน Excel ได้อยู่ดี (ผมเองก็เรียน DAX จาก Power BI เหมือนกัน แล้วตอนนี้ผมก็เอามาใช้ใน Excel ได้)

          หากใครสนใจ ใครสนใจก็ลองไปดูได้ครับ (ตอนนี้กำลังลดราคาพิเศษอยู่ด้วย จาก 2290 เหลือ 1790 บาท หมดเขต 29 กค. 63)

          เอาล่ะ หมดช่วงขายของแล้ว มาเริ่มสิ่งที่น่าสนใจกันจริงๆ ดีกว่า 555

          มาดูกันว่าเราสามารถใช้ DAX เขียนสูตรเพื่อทำให้ช่องสรุปแสดงข้อความออกมาในลักษณะไหนได้บ้าง

          เอา Transaction ID ล่าสุดมาแสดง

          เราสามารถใช้ฟังก์ชัน LASTNONBLANK มาช่วยในกรณีนี้ได้ครับ

          LASTNONBLANK ( <ColumnName>, <Expression> )

          LASTNONBLANK จะทำงานแบบ Iterator เช่นเดียวกับพวก SUMX แต่มีความสามารถในการเช็ค Expression สำหรับแต่ละแถวของ <ColumnName> โดยเรียงตาม Sort Order ของ Column นั้นๆ แล้วเอาค่าสุดท้ายที่ <ColumnName> และ <Expression> ไม่ Blank กลับมา ซึ่งผลลัพธ์จะกลับมาเป็นตารางที่มี 1 แถว 1 คอลัมน์

          Tips : เมื่อ DAX ให้ผลลัพธ์เป็นตารางที่มี 1 แถว 1 คอลัมน์ มันสามารถถูกมองให้เป็นผลลัพธ์เป็น Scalar Value หรือค่าตามปกติได้ด้วย แปลว่าผมสามารถแสดงผลลัพธ์ด้วยค่านี้ได้เลย

          แปลว่าผมสามารถให้มันเอาเลข TXID ล่าสุดมาได้เพราะว่า TXID เราเรียงเป็นเลข Running อยู่แล้วจึงใช้ได้

          =LASTNONBLANK(TXData[TXID], TXData[TXID])

          หรือจะใส่ <Expression> เป็นเลข 1 ไปเลยก็ยังได้ครับ เพื่อให้มันเช็คแค่ TXData[TXID] อย่างเดียว

          =LASTNONBLANK(TXData[TXID],1)

          แค่นี้เราก็จะได้ Transaction ID ล่าสุดแล้วล่ะ 555

          การใช้ Excel Power Pivot ตอนที่ 2 : ทำผลสรุป Value ให้เป็นข้อความด้วย DAX 205

          ถ้าเกิดใครอยากได้ Transaction ID แรกสุด ก็จะมีตัวคล้ายๆ กันให้ใช้ นั่นก็คือ FIRSTNONBLANK ( <ColumnName>, <Expression> ) นั่นเองครับ

          เอา Product ล่าสุดมาแสดง

          สำหรับ “ชื่อProduct” เราไม่สามารถใช้ LASTNONBLANK มาช่วยได้ เพราะ คอลัมน์ “ชื่อProduct” มันเรียงตาม A-Z (เมื่อคอลัมน์นี้ไม่ได้เรียงตามเวลา คำว่า LAST เมื่อใช้กับชื่อProduct มันจึงไม่มี concept ของคำว่า “ล่าสุด” ) แต่เราจะเอาเจ้า [TXID ล่าสุด] ที่ได้จากข้อที่แล้วมาช่วยทำงานต่อไปด้วยการใช้ LOOKUPVALUE แบบนี้

          LOOKUPVALUE ( <Result_ColumnName>, <Search_ColumnName>, <Search_Value>)

          LOOKUPVALUE สามารถเอาผลลัพธ์ในคอลัมน์ <Result_ColumnName> ที่ต้องการกลับมา โดยค้นหาข้อมูล <Search_Value> ในคอลัมน์ <Search_ColumnName> นั่นเอง

          ซึ่งจะเห็นว่า Concept การเขียนสูตรคล้ายๆ ฟังก์ชัน LOOKUP ใน Excel เลย แต่ LOOKUPVALUE มันต้องเจอผลลัพธ์แบบเป๊ะๆ เท่านั้น ต่างจาก LOOKUP ใน Excel ที่ทำการค้นหาแบบ Approximate Match นะ

          สรุปแล้ว ใน เคสนี้เราเขียนได้ว่า

          =LOOKUPVALUE(TXData[สินค้า],TXData[TXID],[TXID ล่าสุด])

          แปลว่าให้เอา [TXID ล่าสุด]ไปหาในคอลัมน์ TXData[TXID] จากนั้นให้เอาค่า TXData[สินค้า] ในแถวเดียวกันกลับมา

          ซึ่งจะช่วยให้เราได้ผลลัพธ์ที่ต้องการได้แล้ว ซึ่งสามารถประยุกต์ใช้วิธีนี้กับคอลัมน์ไหนๆ ก็ได้ จริงมะ?

          สรุป Value ข้อความ Text

          เอาชื่อลูกค้าทุกคนมารวมกันแยกด้วยตัวคั่น

          เราสามารถใช้ฟังก์ชัน CONCATENATEX มาช่วยรวมข้อมูล Text แล้วใส่ Delimiter เป็น ได้ ซึ่งมันจะทำงานคล้ายๆ SUMX แต่ต่างกันที่ตอนจบ ตรงที่ SUMX เอาข้อมูลใน Expression ทุกตัวมา SUM กัน แต่เจ้า CONCATENATEX นั้นเอา Expression ทุกตัวมาเชื่อมเป็นข้อความเดียวกันแล้วคั่นด้วย Delimiter ซึ่งสามารถเรียงลำดับการเชื่อมได้ด้วยนะ

          CONCATENATEX ( <Table>, <Expression>, [<Delimiter>] , [<OrderBy_Expression>] , [<Order>] )
          • ฟังก์ชันนี้จะทำการ Iterate แต่ละแถวของ <table> ด้วยการเอา <expression> มาเชื่อมกันด้วย [delimiter]
          • สำหรับ <table> นั้นเราใช้อีกฟังก์ชัน นั่นคือ DISTINCT มาช่วย ซึ่งมีความสามารถทำให้เหลือเฉพาะ item ที่ไม่ซ้ำกันเท่านั้นแล้วคืนค่ากลับมาเป็นตาราง (เรียกว่า Table Function ซึ่งใน DAX มีหลายตัวมากๆ)
          • โดยในที่นี้ใส่เป็น DISTINCT(TXData[ลูกค้า]) เพื่อให้ได้รายชื่อลูกค้าแบบไม่ซ้ำกันนั่นเอง

          สรุปแล้ว เราจะเขียนสูตรแบบนี้

          =CONCATENATEX(DISTINCT(TXData[ลูกค้า]),[ลูกค้า],"/")
          การใช้ Excel Power Pivot ตอนที่ 2 : ทำผลสรุป Value ให้เป็นข้อความด้วย DAX 206

          ถ้าอยากให้เรียงตามคอลัมน์ลูกค้าเอง (ซึ่งก็เรียงตาม A-Z) ก็สามารถระบุคอลัมน์ที่ใช้ Sort ได้ และวิธีการ Sort ได้

          =CONCATENATEX(DISTINCT(TXData[ลูกค้า]),[ลูกค้า],"/",[ลูกค้า],ASC)
          การใช้ Excel Power Pivot ตอนที่ 2 : ทำผลสรุป Value ให้เป็นข้อความด้วย DAX 207

          List ชื่อลูกค้าที่สร้างยอดขายมากสุด Top3

          เราสามารถใช้ TOPN มาช่วยสร้างผลลัพธ์เป็น Table ที่ Filter ให้เหลือผลลัพธ์ N ตัวเรียงตาม <OrderBy_Expression> ได้ดังนี้

          TOPN ( <N_Value>, <Table> , [<OrderBy_Expression>] , [<Order>] )

          จากนั้นเอาไปใช้ในส่วนของ <table> ของ CONCATENATEX

          =CONCATENATEX(TOPN(3,DISTINCT(TXData[ลูกค้า]),[TotalSales],DESC),[ลูกค้า],"/",[TotalSales],DESC)

          และเราสามารถรวมยอดขายเฉพาะ TopN Customer ได้ด้วยการใช้ SUMX มาช่วยดังนี้

          =SUMX(TOPN(3,DISTINCT(TXData[ลูกค้า]),[TotalSales],DESC),[TotalSales])

          ตัว [TotalSales] จะถูกคิดสำหรับข้อมูลแต่ละแถวของ TOPN ซึ่งจะเกิด Effect ที่เรียกว่า Context Transition ที่จะช่วยให้คิดข้อมูลเป้นยอดขายของลูกค้าแต่ละคนนั้นๆ ได้

          สรุปออกมาได้ดังนี้

          การใช้ Excel Power Pivot ตอนที่ 2 : ทำผลสรุป Value ให้เป็นข้อความด้วย DAX 208

          อย่างไรก็ตามคำสั่ง TOPN ถ้าเกิดมีลูกค้ายอดขายเท่ากันเป๊ะ มันอาจจะออกมามากกว่า N ที่เรากำหนดก็ได้ เช่น

          Sales ค ขายของเล่น มีลูกค้าที่มียอดเท่ากันดังรูป

          การใช้ Excel Power Pivot ตอนที่ 2 : ทำผลสรุป Value ให้เป็นข้อความด้วย DAX 209

          ทำให้ Sales ค ขายของเล่น มัน List ออกมา 4 คน คือ C00004, C00011, C00012, C00013 และได้ยอดรวม TOPN 3,150 บาท

          ถ้าเราอยากได้ TOP3 แบบที่ได้ 3 จริงๆ ไม่ให้เกินมา

          จะต้องมีการจัดการเรื่องค่าซ้ำ เช่น วิธีที่ง่ายที่สุดคืออาจจะบวกค่า Random ที่น้อยมากๆ เข้าไปเพื่อให้ไม่มีเลขที่เท่ากันเป๊ะๆ เช่น

          Listลูกค้าTop3 (แบบได้ 3 จริงๆ)

          =CONCATENATEX(TOPN(3,DISTINCT(TXData[ลูกค้า]),[TotalSales]+RAND()/1000,DESC),[ลูกค้า],"/",[TotalSales],DESC)

          Top3CustSales (แบบมาจาก 3 คนจริงๆ)

          =SUMX(TOPN(3,DISTINCT(TXData[ลูกค้า]),[TotalSales]+RAND()/1000,DESC),[TotalSales])

          สรุปแล้วจะได้แบบนี้

          การใช้ Excel Power Pivot ตอนที่ 2 : ทำผลสรุป Value ให้เป็นข้อความด้วย DAX 210

          Sales ค ขายของเล่น จะได้แค่ 3 คน คือ C00004, C00011, C00012 (ซึ่งจะได้ 12 หรือ 13 มันสุ่มเอานะ…)

          และนี่คือตัวอย่างของการใช้ DAX เพื่อสรุปข้อมูลออกมาเป็นข้อความครับ จะเห็นว่าสามารถพลิกแพลงได้มากกว่า Pivot Table ธรรมดาๆ เยอะเลย และนี่แหละที่เป็นหนึ่งในสาเหตุที่บอกว่า Power BI นั้นเจ๋งมากๆ ก็เพราะมันมี DAX แบบนี้ยังไงล่ะ

          ตอนต่อไป

          ในตอนต่อไปเริ่มจะเริ่มทำงานกับตารางที่มากกว่า 1 อัน โดยที่ตารางหลายๆ อันนั้นจะมีการเชื่อมความสัมพันธ์กันเป็นสิ่งที่เรียกว่า Data Model นั่นเอง ใช่แล้วล่ะ เรากำลังจะได้เรียนสิ่งที่เป็น Data Model กันจริงๆ ซักที แล้วคุณจะได้เห็นพลังที่แท้จริงของสิ่งที่เรียกว่า Data Model ว่ามันเจ๋งแค่ไหนครับ

          สารบัญซีรีส์ Power Pivot

          • การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน

            คงปฏิเสธไม่ได้ว่า Pivot Table นั้นเป็นเครื่องมือสรุปข้อมูลที่ใช้ง่ายที่สุดของ Excel (จริงๆ ผมว่าถ้าเทียบกับโปรแกรมอื่น Pivot ก็ยังง่ายและเจ๋งกว่าอยู่ดี) ซึ่งการใช้ Pivot Table แบบทั่วๆ ไปก็สามารถตอบโจทย์การทำงานได้มหาศาลแล้ว อย่างไรก็ตาม ก็ยังมีงานบางอย่าง ที่ Pivot Table ธรรมดายังตอบโจทย์ไม่ได้ แต่ต้องใช้ Power Pivot แทน เช่น

            1. การนับข้อมูลแบบไม่ซ้ำ เช่น นับจำนวนลูกค้า, จำนวนวันที่ที่ขายของ, จำนวน sales, จำนวนประเภทสินค้า
            2. การทำ Calculated Field ที่ไม่ใช่การ SUM
            3. การแสดงข้อมูลสรุปในช่อง Value ออกมาเป็น Text เช่น แสดงชื่อลูกค้าคนล่าสุด แสดงรายการสินค้าออกมาคั่นด้วย comma แสดงสินค้าขายดี Top3
            4. การวิเคราะห์ข้อมูลเทียบกับช่วงเวลาก่อนหน้า
            5. การวิเคราะห์ข้อมูลจากหลายตาราง เช่น การเอาค่าจากอีกตารางมาโดยไม่ต้อง VLOOKUP, การคำนวณ Actual vs Target

            นี่คือตัวอย่างของสิ่งที่Pivot ธรรมดาๆ ทำไม่ได้…

            แต่ว่าไม่ต้องเสียใจไป เพราะจริงๆ แล้วถ้าเราใช้ Pivot Table อีกโหมดนึงที่เรียกว่าโหมด Data Model ซึ่งจะทำให้ Pivot Table ธรรมดากลายเป็น Power Pivot ซึ่งจะมีความสามารถเพิ่มขึ้นมหาศาลใกล้เคียงกับความสามารถของ Power BI เลยล่ะ

            อย่างไรก็ตาม Excel ที่จะใช้ Data Model และ Power Pivot ได้จะต้องเป็น Excel 2010 ขึ้นไปเท่านั้นนะครับ เก่ากว่านี้หมดสิทธิ์ ซึ่งถ้าเป็น 2013 ขึ้นไปจะมีโหมด Data Model ให้ใช้ในตัว แต่ถ้าเป็น Excel 2010 จำเป็นต้องโหลด Add-in Power Pivot มาใช้ซะก่อน

            ในบทความตอนนี้ผมจะทำความเจ๋ง 2 เรื่องข้างบนให้ดูก่อน เพราะง่ายมากและใช้งานจริงได้เยอะ ส่วนเรื่องที่เหลือรอต่อตอนถัดไปนะ

            เตรียมความพร้อม Data Model / Power Pivot

            คนที่ใช้ Excel 2010 ให้ไปโหลด Add-in Power Pivot นี่แล้ว Install ซะ มันจะมี Ribbon Power Pivot โผล่ออกมาให้ใช้ครับ

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 211

            คนที่ Version ใหม่กว่า 2010 ก็ให้ไป Enable Power Pivot add-in ซะก่อน โดยไปที่ File -> Options -> Add-in -> Com Add-ins -> Go

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 212

            จากนั้นก็เลือก Power Pivot ซะ

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 213

            หลังจาก ok ไปจนครบ ก็จะมี Ribbon Power Pivot มาให้ใช้แล้ว

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 214

            โหลดไฟล์ประกอบได้ที่นี่

            โหลดผ่าน GitHub

            ก่อนอื่นเรามาดูวิธีเรียกใช้ Pivot Table โหมด Data Model กันครับ

            วิธีเรียกใช้ Pivot Table โหมด Data Model

            การเอาข้อมูลเข้าสู่โหมด Data Model นั้นทำได้ 3 วิธี นั่นคือ

            1. เอาเข้าด้วย Pivot Table (ผ่านการติ๊กเลือก Option ล่างสุดตอนสร้าง Pivot)
            2. นำเข้าผ่านเครื่องมือ Power Pivot ในคำสั่ง Add to Data Model
            3. นำเข้าผ่าน Power Query โดย Load To.. Connection Only แล้วติ๊ก Add to Data Model
            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 215

            หากใช้ข้อมูลเพียงตารางเดียวจากชีท TXData การเอาเข้าผ่าน Pivot Table ไปเลยจะง่ายที่สุดเลย

            Tips : ก่อนจะเอาข้อมูลเข้าไปวิเคราะห์ใน Pivot Table เพื่อให้ในอนาคตชีวิตสบายขึ้น ควรแปลงข้อมูลนั้นให้เป็น Table ก่อน ด้วยการกด Insert -> Table เพื่อให้ตัว PivotTable สามารถอ้างอิงข้อมูลจาก Data Source ที่ขยายอาณาเขตตัวเองตามข้อมูลใหม่ที่ใส่เพิ่มได้โดยอัตโนมัติ ซึ่งผมตั้งชื่อ Table นี้ว่า TXData ละกัน (แต่ขั้นตอนนี้ไม่ได้จำเป็นกับการทำ Data Model นะ)

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 216

            การทำให้ข้อมูลเป็น Table จะทำให้ง่ายตอนเพิ่มข้อมูล เช่น ผมเพิ่มเดือนกับปีเข้าไป พื้นที่ตารางมันก็จะขยายมาคลุมให้เอง (แถม Copy สูตรลงไปให้เองจนครบทุกบรรทัดด้วย)

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 217

            พอแปลงเป็น Table แล้วให้เลือกข้อมูลที่จะเอาเข้า Pivot Table แล้วกด Insert -> Pivot Table ตามปกติ แต่ให้ติ๊ก Add this Data to the Data Model ด้วย (สำคัญมากกกกกก)

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 218

            พอกด ok เราจะได้ PivotTable โหมดพิเศษที่เป็น Mode Data Model ขึ้นมาแล้ว ซึ่งหน้าตาแทบจะเหมือน Pivot Table ธรรมดาๆ เลย แต่มีความต่างตรงที่ผมตีกรอบให้ดู

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 219

            เอาล่ะเรามาเริ่มทำอะไรเจ๋งๆ ที่ Pivot Table ปกติทำไม่ได้กัน

            ความเจ๋ง 1 : นับข้อมูลแบบไม่ซ้ำ

            ปกติแล้วเวลาเราลากข้อมูลเข้ามา Count ใน Pivot มันก็จะรับแค่ว่าคอลัมน์ที่เราเลือกมีข้อมูลอยู่กี่ตัว ไม่ได้สนว่าซ้ำรึเปล่า (ซึ่งส่วนใหญ่จะซ้ำกระจาย) เช่น ลากลูกค้าลงมาดูคู่กับสินค้าและผู้ขาย เพื่อดูว่ามีลูกค้ากี่คนที่ซื้อสินค้านั้นๆ โดยผู้ขายคนนั้นๆ (ผมกดเปลี่ยน Report Layout เป็น Tabular Form จะได้เห็นชื่อ Field ชัดๆ)

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 220

            จะเห็นว่าตรงช่องที่ผมทาสีเหลือง มัน Count ลูกค้าได้ 27 แบบนี้ หลายคนอาจตีความว่า มีลูกค้า 27 คนที่ซื้อของเล่นที่ขายโดย sales ง รึเปล่า?

            ถ้าเราดับเบิ้ลคลิ๊กที่เลข 27 จะเห็นชัดเลย ว่าลูกค้าที่มันเอามานับนั้นซ้ำกระจาย (แค่เบอร์ 14 ก็ซ้ำไป 3 รอบแล้ว)

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 221

            และถ้าเราอยากจะนับแบบไม่ซ้ำจะทำยังไงล่ะ?

            คำตอบง่ายมาก แค่กลับไปที่ Pivot แล้วเปลี่ยนวิธีสรุปข้อมูลจาก Count ธรรมดาๆ เป็น Distinct Count ก็จบเลย (แต่มันอยู่ใน More Options… นะ)

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 222
            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 223

            ซึ่งพอกด ok เราก็จะได้จำนวนลูกค้าแบบไม่ซ้ำกันแล้ว ซึ่ง PivotTable โหมดปกติจะทำอะไรแบบนี้ไม่ได้เลยนะ

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 224

            ซึ่งถ้าเราอยากจะนับคอลัมน์ไหนแบบไม่ซ้ำ ก็ไปปรับที่ตัวนั้นๆ ได้เลย เช่นจะนับว่ามีการขายของนั้นๆ ทั้งหมดกี่วัน ก็เอาวันที่มานับแบบ Distinct Count ได้ หรือจะดูว่ามีการขายครบทุกเดือนมั้ย ก็เอาเดือนมา Distinct Count ได้ ซึ่งเราสามารถใช้ร่วมกับการ Filter หรือ Row/Column ต่างๆ ได้อย่างอิสระเลย

            เช่นในปี 2020 หนังสือมีการขายแค่ 11 เดือน ในขณะที่ตัวอื่นขายครบ 12 เดือน

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 225

            ความเจ๋ง 2 : การทำ Calculated Field ที่ไม่ใช่การ SUM ด้วย Measure

            ปกติแล้วเวลาเราใช้ Calculated Field ใน Pivot Table นั้น สูตรที่เราเขียน มันจะใช้การสรุปผลด้วยการ Sum เท่านั้น ไม่สามารถเปลี่ยนเป็น Count, Max, Min อะไรได้เลย

            แต่ถ้าเราใช้ Mode Data Model แล้ว Calculated Field จะง่อยกว่าเดิม! เพราะมันใช้ไม่ได้เลยเนื่องจากหลายเป็นสีเทาไปแล้ว…

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 226

            แต่ไม่ต้องเสียใจไป ที่มันเป็นสีเทาเพราะมันมีตัวที่เจ๋งกว่าให้ใช้ นั่นก็คือ Measure นั่นเอง (ซึ่งคือตัวเดียวกับ Power BI)

            วิธีการเรียกใช้ Measure ให้คลิ๊กขวาที่ชื่อตารางใน Pivot Field List แล้วกด +Add Measure… (ถ้าคลิ๊กขวาแล้วไม่มีก็ไปเลือกใน Ribbon Power Pivot ตามวิธีถัดไป)

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 227

            นอกจากการกด +Add Measure เราจะไปกดใน Ribbon Power Pivot ก็ได้นะครับ (เมนูจะเจ๋งกว่าด้วย เพราะมีสีสวยงามตอนเขียนสูตร)

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 228

            ในที่นี้ผมจะกดสร้าง Measure ผ่านเมนูของ Power Pivot ละกันนะครับ เพราะมีตัวช่วยเยอะกว่า

            พอกดสร้าง Measure ปุ๊ป จะเห็นช่องให้ใส่สูตร ถ้าเรากดปุ่ม fx มันจะ List ฟังก์ชันที่ใช้ได้ขึ้นมาเพียบเลย ซึ่งไม่ได้มีแค่ SUM แล้วเนอะ

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 229

            ฟังก์ชันที่ใช้ได้นี้เป็นสูตรเฉพาะที่เรียกว่า DAX (Data Analysis eXpression) ซึ่งเป็นภาษาที่ใช้ใน PowerPivot กับ Power BI และพวก Analysis Service ต่างๆ ซึ่งมีความคล้ายกับฟังก์ชันใน Excel ของเรามากเลย หลายๆ ฟังก์ชันที่เรารู้จักใน Excel ก็สามารถนำมาใช้ในนี้ได้ และก็มีหลายๆ ฟังก์ชันถูกใส่เข้ามามากกว่าใน Excel ปกติ เพื่อใช้ในการวิเคราะห์ข้อมูลโดยเฉพาะ

            ยกตัวอย่างเช่น การนับลูกค้าแบบไม่ซ้ำ นอกจากใช้คำสั่ง Distinct Count ใน Summarize Value By… เราก็ยังสามารถใช้ฟังก์ชัน DISTINCTCOUNT ใน DAX มาช่วยได้

            วิธีเขียนสูตรคือ ให้พิมพ์ชื่อฟังก์ชันแล้วกด Tab เลือกเอา มันจะมีตัวช่วยขึ้นมาว่าจะ DISTINCTCOUNT คอลัมน์ไหน

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 230

            เราก็เลือกว่า DISTINCTCOUNT(TXData[ลูกค้า] แล้วอย่าลืมพิมพ์วงเล็บปิดด้วย สรุปได้สูตรนี้

            =DISTINCTCOUNT(TXData[ลูกค้า])

            พอกด ok มันก็จะสร้าง Measure ขึ้นมาใหม่ และ add เข้า Pivot ให้เราเลย (ถ้ามันยังไม่ add ให้ก็ลากมาใส่เองได้)

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 231

            นอกจากการ DistinctCount แล้ว มันยังทำเรื่องต่างๆ ได้อีกมากมาย เช่น เราจะสร้างยอดขายรวมขึ้นมาโดยไม่ต้องมีคอลัมน์ยอดขายในตารางจริง แต่จะใช้คอลัมน์จำนวนชิ้น * ราคาต่อชิ้น แล้ว SUM ด้วย SUMX

            เรียนรู้ SUMX

            SUMX(<table>, <expression>)

            SUMX จะใช้สูตร <expression> ที่ระบุลงไปในแต่ละแถวของตาราง <table> (เรียกว่า Iterate) แล้วสุดท้ายค่อย SUM ซึ่งจะคล้ายๆกับสูตร SUMPRODUCT ใน Excel แต่ยืดหยุ่นกว่ามากๆ

            เราจะให้ <table> เป็นตาราง TXData ของเรานี่แหละ ส่วน <expression> เราจะเอา จำนวนชิ้น * ราคาต่อชิ้น

            ดังนั้นสูตรออกมาจะเป็นดังนี้

            =SUMX(TXData,TXData[ราคาต่อชิ้น]*TXData[จำนวนชิ้น])

            ซึ่งเราสามารถเลือก Number Format ให้ Measure นั้นๆ ได้เลยด้วย

            Power Pivot

            แค่นี้เราก็จะได้ยอดขายรวมแล้ว

            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 232

            หายอดขายเฉลี่ยต่อลูกค้า

            ยกตัวอย่างเช่น หากเราต้องการจะแสดงยอดขายเฉลี่ยต่อลูกค้า 1 คน เราก็สามารถเขียนสูตรโดยเอาเลขสรุป 2 ค่ามาหารกัน

            • ให้ตัวเศษ = ยอดขายรวม
            • ตัวส่วน = จำนวนลูกค้า(แบบไม่ซ้ำ)

            ซึ่งความเจ๋งของ Measure คือ มันอ้างอิง Measure ที่มีอยู่แล้วได้ ด้วยการใส่ [ชื่อMeasure]

            ดังนั้นเราจะเขียนสูตรแบบนี้ได้เลย

            =[TotalSales] / [จำนวนลูกค้าแบบไม่ซ้ำ]
            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 233
            การใช้ Excel Power Pivot ตอนที่ 1 : การใช้งานพื้นฐาน 234

            และนี่ก็คือตัวอย่างของการเริ่มหัดใช้ Power Pivot แบบง่ายๆ เดี๋ยวตอนต่อไปจะเริ่มซับซ้อนขึ้นแล้ว

            ถ้าอยากปูพื้นฐานก่อน…

            ถ้าใครอ่านบทความนี้แล้วรู้สึกว่าอยากจะมีความรู้ PivotTable ให้ดีกว่านี้ เพราะยังไม่เข้าใจบางจุด ก็สามารถไปศึกษาคอร์สออนไลน์ของผมได้นะครับ ซึ่งดูตอนไหนก็ได้ กี่รอบก็ได้ ไม่มีหมดอายุ แถมยังอัปเดทเนื้อหาให้เรื่อยๆ อีก (ขอโฆษณาซะหน่อย 555)

            ตอนต่อไป

            จะมาดูวิธีทำให้ช่อง Value ของ Pivot สามารถแสดงข้อความได้กันครับ

            สารบัญซีรีส์ Power Pivot

            • เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด

              เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด

              ตอนก่อนหน้านี้เราได้เรียนรู้ทั้งเรื่องการหาอนุพันธ์และการอินทิเกรทไปแล้ว ในตอนนี้เราจะมาดูวิธีประยุกต์ใช้ความรู้เรื่องอนุพันธ์เพื่อทำ Optimization โดยการหาจุดสูงสุดต่ำสุดกันซักหน่อยครับ

              การทำ Optimization ด้วยการหาอนุพันธ์

              เวลาเรามีฟังก์ชันอะไรซักอย่าง แล้วอยากจะหาว่าจุดสูงสุดหรือจุดต่ำสุดในช่วงที่สนใจอยู่ที่ตำแหน่งไหน? เราจะทำยังไงกับมันได้บ้าง?

              ก่อนจะไปหาค่าที่ทำให้เกิด “จุดสูงสุด” หรือ “จุดต่ำสุด” เราไปรู้จักอีกคำนึงก่อน นั่นก็คือ Critical Value หรือ ค่า x ที่ทำให้เกิดจุดวกกลับ (Extreme Point) ของเส้นกราฟซะก่อน

              optimization maximize minimize

              ซึ่งจุดวกกลับก็จะมี 2 ลักษณะอีกคือ

              • ถ้าความชันของกราฟเปลี่ยนจากบวก ไป0 แล้ว ไปลบ แสดงว่าจุดวกกลับนั้นเป็นแบบตัว A ซึ่งก็น่าจะทำให้เกิดจุดต่ำสูงสุด
              • ถ้าความชันของกราฟเปลี่ยนจากลบ ไป0 แล้ว ไปบวก แสดงว่าจุดวกกลับนั้นเป็นแบบตัว U ซึ่งก็น่าจะทำให้เกิดจุดต่ำสุด

              แปลว่าถ้าเราหาสมการของอนุพันธ์ได้ แล้วเอามาเทียบกับค่า 0 ก็จะสามารถแก้สมการหาได้ว่า x ค่าใดทำให้เกิดความชันเป็น 0 บ้าง ซึ่งก็คือค่าที่ทำให้เกิดจุดวกกลับนั่นเอง

              จาก y=x^3-10x^2

              เมื่อ Diff แล้วจะได้แบบนี้

              y'=3x^2-20x

              เดี๋ยวผมลอง Plot กราฟดู

              เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 235

              จะเห็นชัดเลยว่าจุดวกกลับนั้นมีค่า y’ เป็น 0 จริงๆ

              ดังนั้นเราเอา 3x^2-20x=0 แล้วแก้สมการ

              แยกตัวประกอบเทียบกับ 0

              x(3x-20)=0

              จะได้ว่า

              • x=0 หรือ
              • 3x-20=0 ซึ่ง x=20/3 = 6.667 นั่นเอง

              ทีนี้ถ้าเราอยากจะ Test ว่า จุดที่เราแก้สมการมาได้ เช่น x=0, x= 6.6667 นั้น จุดไหนเป็นประเภทจุดวกกลับแบบไหน เป็นแบบจุดสูงสุด หรือ ต่ำสุด โดยไม่อยาก Plot กราฟออกมา หรือไม่อยากจะมานั่งดูค่าบริเวณใกล้เคียง เราก็สามารถทดสอบได้จากการหาค่า y” ที่จุด x นั้นๆ นั่นเอง

              เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 236
              • ถ้าค่า y” ที่ x นั้นๆ มากกว่า 0 =ความชัน (y’) มีอัตราการเปลี่ยนแปลงเป็นบวก (แปลว่า ความชันเพิ่มจาก – 0 + ) แสดงว่าเป็นจุดวกกลับแบบต่ำสุด (ชันจาก – 0 + คล้าย กับว่าถึงเวลาที่เป็นขาขึ้นแล้วนั่นเอง )
              • ถ้าค่า y” ที่ x นั้นๆ น้อยกว่า 0 =ความชัน (y’) มีอัตราการเปลี่ยนแปลงเป็นลบ (แปลว่า ความชันเพิ่มจาก + 0 – ) แสดงว่าเป็นจุดวกกลับแบบสูงสุด

              ในกรณีตัวอย่างของเรา ที่จุดที่แก้สมการมาได้ 2 ตัว

              • ที่จุด x=0 , y” =-20 ซึ่งเป็นลบ แสดงว่าเป็นจุดวกกลับแบบจุดสูงสุด
              • ที่จุด x=6.667, y”=20 ซึ่งเป็นบวก แสดงว่าเป็นจุดวกกลับแบบจุดต่ำสุด

              อย่างไรก็ตาม จุดวกกลับสามารถมีได้หลายแบบ และมีได้หลายจุดด้วย เรามารู้จักคำศัพท์ที่เกี่ยวข้องกันนิดนึง

              • จุดวกกลับที่เป็นประเภทสูงสุดทั้งหมด เรียกว่าเป็น จุดสูงสุดสัมพัทธ์ (Relative Maximum หรือ Local Maximum)
                • ในกราฟ y คือจุดที่ x=0,y=0
                • ในกราฟ y’ ไม่มี เพราะไม่มีจุกวกกลับรูปตัว A เลย
              • จุดวกกลับที่เป็นประเภทต่ำสุดทั้งหมด เรียกว่าเป็น จุดต่ำสุดสัมพัทธ์ (Relative Minimum หรือ Local Minimum)
                • ในกราฟ y คือ จุดที่ x=6.667, y=-148.148
                • ในกราฟ y’ คือ จุด x=3.333, y’= -33.33
              • คำว่าสัมพัทธ์ พูดง่ายๆ ก็คือ เมื่อลองเทียบกับบริเวณข้างๆ แล้วเป็นยังไง

              ทีนี้มาดูแบบสัมบูรณ์กันบ้าง

              • แต่ถ้าจุดใดที่ฟังก์ชันมีค่ามากที่สุดจริงๆ เมื่อเทียบกับทุกจุด แบบนี้เรียกว่า จุดสูงสุดสัมบูรณ์ (Absolute Maximum หรือ Global Maximum)
                • ในกราฟ y ไม่มี เพราะ x เพิ่มขึ้นเรื่อยๆ แล้ว y ก็เพิ่มขึ้นไปจนถึง infinity
              • แต่ถ้าจุดใดที่ฟังก์ชันมีค่าน้อยที่สุดจริงๆ เมื่อเทียบกับทุกจุด แบบนี้เรียกว่า จุดต่ำสุดสัมบูรณ์ (Absolute Minimum หรือ Global Minimum)
                • ในกราฟ y ไม่มี เพราะ x ลดลงเรื่อยๆ แล้ว y ก็ลดลงไปจนถึง -infinity
                • ในกราฟ y’ คือ จุด x=3.333, y’= -33.33
                • จะเห็นว่าจุดที่เป็น Absolute Max/Min ก็จะเป็น Relative Max/min ด้วยเสมอ แต่ในทางกลับกันไม่ใช่นะ

              นอกจากวิธีนี้แล้ว การหาค่าจุดสูงสุดต่ำสุดด้วยเครื่องมืออื่นๆ ก็มีดังนี้

              หาค่าจุดสูงสุดต่ำสุดด้วยเครื่องมืออื่นๆ

              ใช้ Excel Solver

              หากจะใช้ Excel ทำ Optimization เราจะใช้ Solver Add-in มาทำ เพราะมันเป็นเครื่องมือที่มีมากับ Excel อยู่แล้ว และเก่งกว่า Goal Seek ตรงที่หาค่า Min, Max ได้ และใส่ข้อจำกัดหรือ Constrain ได้ด้วย

              วิธีการเรียกใช้ Solver ให้ไปที่ File -> Excel Options -> Add-in -> Go… -> ติ๊ก Solver Addin

              เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 238

              เช่น เราสามารถให้ Solver ทำการ

              • Set Objective : หาค่า y (B3) น้อยสุด (Min)
              • By Changing Variable Cell : โดยที่ให้เปลี่ยนค่า x (A3) ไปเรื่อยๆ
              • Subject to the Constraints : โดยมีข้อจำกัดคือ x>=0
              เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 239

              Solving Method ให้เลือก GRG Nonlinear เพราะเราก็ได้เห็นแล้วว่าสมการระหว่างค่า x กับ y นั้นเป็นเส้นโค้ง ไม่ใช่เส้นตรง

              พอกด Solve : จะได้ว่า Solver ก็สามารถหาค่า x ที่ทำให้ y ต่ำสุดได้ 6.667 เช่นกัน

              เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 240

              หรือจะทำอีกแบบนึงคือ Solve หาค่า x ที่ทำให้ y’ เป็น 0 (Value of : 0) โดยที่ x>=0.1 ก็ได้เช่นกัน พอ Solve ก็จะได้คำตอบเดียวกัน

              เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 241
              เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 242

              ใช้เว็บ Wolfram Alpha

              เขียนสิ่งที่ต้องการรู้ในเว็บ Wolfram Alpha ซึ่งเป็นเว็บด้านการคำนวณทางคณิตศาสตร์โดยเฉพาะ บอกเลยว่าโคตรโกง!! เพียงแค่ใส่สมการแล้วมันแก้ให้เลยแบบนี้ก็ได้

              3x^2-20x=0

              เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 243

              เอาจริงๆ ใส่สมการดังเดิมแบบนี้ไปเลยยังได้ minimize maximize y=x^3-10x^2

              เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 244

              ตัวอย่างเชิงประยุกต์ : ออกแบบภาชนะที่ต้นทุนต่ำสุด

              ถ้าต้องทำทรงกระบอกบรรจุน้ำปริมาตร 1 ลิตรพอดี (แบบมีฝาปิดด้วย) ควรจะทำทรงกระบอกรัศมี (r) เท่าไหร่ สูง (h) เท่าไร่ จึงจะประหยัดวัตถุดิบที่ใช้ผลิตมากที่สุด

              เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 245

              จะเห็นว่าการที่จะประหยัดวัตถุดิบให้ได้มากที่สุด ก็คือ ต้องทำให้พื้นที่ผิวน้อยที่สุดนั่นเอง (นี่แหละคือการ Optimization)

              พื้นที่ผิว

              ซึ่งพื้นที่ผิวคิดจาก พื้นที่ฝาและก้น รวมกับพื้นที่ผิวทรงกระบอกด้านข้าง

              พื้นที่ฝาและก้น : เป็นพื้นที่วงกลม 2 อัน ฝาปิดบนกับฐานข้างล่าง

              = PI()*r^2 * 2 อัน

              พื้นที่ผิวรอบๆ : มาจากทรงกระบอกด้านข้าง = เส้นสอบรูปวงกลม *ความสูง

              =2*PI()*r*h
              พื้นที่ผิวรวม A(r,h) = 2* PI()*r^2 + 2*PI()*r*h

              ปริมาตร

              ปริมาตร V = PI()*r^2 *h

              ย้ายข้างให้เหลือ h ตัวเดียว

              h = V/(PI()*r^2)

              เราเอา h ที่เป็นข้อจำกัดนี่ เข้าไปแทนในสมการพื้นที่ A ซะ เพื่อให้ฟังก์ชันของพื้นที่เขียนอยู่ในรูปแบบของ r ตัวเดียว

              พื้นที่ผิวรวม A(r) = 2* PI()*r^2 + 2*PI()*r* V/(PI()*r^2)

              ตัดไปตัดมา จะได้ว่า

              A(r) = 2* PI()*r^2 + 2V/r

              หากเรา diff หา A’ จะได้ว่า

              A'(r) = 4* PI()*r - 2V/r^2

              ถ้าเรา Solve หา r ที่ทำให้ A'(r) เป็น 0 จะได้ว่า

              4* PI()*r = 2V/r^2
              V = 2 * PI()* r^3
              r = (V / 2 * PI() )^(1/3)

              V ในที่นี้ที่เราต้องการปริมาตรคือ 1000 cm3 ก็แทนค่าเลย

              r  = (1000 / (2 * PI()))^(1/3) = 5.419261 m นั่นเอง

              ส่วนความสูง h เรารู้ความสัมพันธ์ของมันอยู่แล้ว ก็แทนค่าตัวแปรเลย

              h = V/(PI()*r^2) = 1000/(PI()*5.419261^2) = 10.83852 cm

              หากเราลอง Plot กราฟด้วย Excel ที่ V=1000 จะได้เห็นภาพ ดังนี้

              เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 246

              ที่ r ประมาณ 5.4 ทำให้ Aต่ำสุดจริงๆ เพราะว่า

              A’ อยู่ที่ประมาณ 0 ส่วน A” มีค่าเป็น + แสดงว่า A’กำลังชันขึ้น แสดงว่าเป็นจุดวกกลับแบบต่ำสุดนั่นเอง

              สารบัญ Calculus

              • สารพัดวิธี Lookup หาค่าตัวสุดท้าย

                สารพัดวิธี Lookup หาค่าตัวสุดท้าย

                หลายๆ คนคงรู้จักการใช้พวก VLOOKUP หรือ MATCH เพื่อหาข้อมูลที่ต้องการแบบ Exact Match กันอยู่แล้ว ซึ่งมันจะได้ค่าของ lookup_value ตัวแรกที่เจอ (นับจากข้างบนลงล่าง) แต่ก็มีหลายสถานการณ์ที่เราอยาก Lookup หาค่าตัวสุดท้ายมากกว่า

                โดยเฉพาะเวลาที่ฐานข้อมูลเรียงตามวันที่/เวลาจากเก่าไปใหม่ เราย่อมอยากได้ข้อมูลที่อัปเดทล่าสุดมากกว่าอยากได้บรรทัดแรกจริงมั้ย? เช่นข้อมูลเป็นแบบนี้

                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 247

                ในบทความนี้ผมจะสอนวิธีการ Lookup หาค่าตัวสุดท้าย มาดูกันว่าทำยังไง เอาตั้งแต่แบบเข้าใจง่ายไปยาก (นิดๆ)เลย

                กรณีที่ 1 : กรณียอมให้เรียง Data ใหม่ได้ทั้งหมด

                ถ้าแบบนี้ก็ง่ายสุด ให้เรากด sort ใหม่ ให้เอาวันเวลาใหม่สุดมาอยู่ข้างบน

                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 248

                แบบี้เราจะ VLOOKUP แบบ Exact Match ได้เลย

                =VLOOKUP(G2,C:D,2,FALSE)
                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 249

                กรณีที่ 2 : กรณียอมให้เรียง Product ใหม่ได้ แต่ใน Product เดียวกันวันเวลาต้องเรียงจากเก่าไปใหม่

                สมมติเรียงแบบนี้ได้

                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 250

                แบบนี้เราจะใช้ VLOOKUP Approximate Match ได้เลย เพราะแบบ Approximate Match จะได้ตัวสุดท้ายอยู่แล้ว

                =VLOOKUP(G2,C:D,2,TRUE)
                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 251

                แต่สูตรข้างบนนี้จะใช้ได้ ต้องมั่นใจว่ามี lookup_value ที่หาใน database นะ เพราะไม่งั้นมันอาจจะผิดได้
                เช่น แม้ว่า lookup_value เป็นคำว่า “cนี้ไม่มีซะหน่อย” ซึ่งควรจะได้ #N/A ก็ดันเจออยู่ดี
                (แบบ Approximate Match มันจะเอาตัวสุดท้ายที่น้อยกว่าหรือเท่ากับค่า lookup_value มาให้เรา)

                ดังนั้นถ้าจะให้ชัวร์ ต้องลองดึงค่าคอลัมน์แรกกลับมาแล้วใช้ IF เช็คอีกที (คล้ายเทคนิค VLOOKUP เร็ว 100 เท่า) เช่น

                =IF(VLOOKUP(G2,C:D,1,TRUE)=G2,VLOOKUP(G2,C:D,2,TRUE),NA())
                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 252

                กรณีที่ 3 : กรณีห้ามเรียงอะไรทั้งสิ้น ต้องเรียงเหมือนเดิม คือตามวันเวลาอย่างเดียวจากเก่าไปใหม่

                ถ้าเป็น Excel Version เก่า (กว่า Excel 365)

                วิธีง่ายสุด คือ เราก็ต้องใช้ความรู้สูตรแบบ Array มาช่วย ดังนี้ ซึ่งจะค่อนข้างยืดหยุ่นมากๆ เพราะเขียนเงื่อนไขยังไงก็ได้

                =LOOKUP(lookup_value,lookup_vector,[result_vector])
                =LOOKUP(2,1/(เงื่อนไข),$D$2:$D$11)
                =LOOKUP(2,1/($C$2:$C$11=G2),$D$2:$D$11)

                LOOKUP นั้นจะทำงานแบบ Approximate Match เสมอ ซึ่งเรา Lookup ค่าเลข 2
                จากตาราง lookup_vector ที่เราสร้างให้ได้เลข 1 กับ Error จากการเขียนเงื่อนไขแบบนี้

                =1/($C$2:$C$11=G2)   
                ซึ่ง 1/TRUE ได้ 1, 1/FALSE ได้ Error
                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 253

                พอเรา lookup ด้วย 2 ก็จะได้บรรทัดที่มี 1 ตัวสุดท้ายอยู่ แล้วเราค่อยสั่งเอาผลลัพธ์ในคอลัมน์ D กลับมา (LOOKUP ดีตรงที่ว่า แยก Lookup_vector กับ Result_vector ออกจากกันได้)

                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 254

                ถ้ามี Excel 365

                ใช้ XLOOKUP ตัว LOOKUP สุดโกง

                =XLOOKUP(lookup_value,lookup_array,return_array,[if_not_found],[match_mode],[search_mode])

                match_mode

                • 0 – Exact match. If none found, return #N/A. This is the default.
                • -1 – Exact match. If none found, return the next smaller item.
                • 1 – Exact match. If none found, return the next larger item.
                • 2 – A wildcard match where *, ?, and ~ have special meaning.

                search_mode

                • 1 – Perform a search starting at the first item. This is the default.
                • -1 – Perform a reverse search starting at the last item.
                • 2 – Perform a binary search that relies on lookup_array being sorted in ascending order. If not sorted, invalid results will be returned.
                • -2 – Perform a binary search that relies on lookup_array being sorted in descending order. If not sorted, invalid results will be returned.

                ดังนั้นเราจะใช้แบบนี้

                =XLOOKUP(G2,$C$2:$C$11,$D$2:$D$11,"-",0,-1) จบเลย
                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 255

                ใช้ FILTER

                นอกจากนี้ใน Excel 365 เรายังใช้ FILTER มาช่วยก็ได้นะ โดย FILTER OrderID เฉพาะที่ product เป็น a ออกมาหลายๆ รายการเลย (เรียกว่า Spill Array)

                =FILTER(D2:D11,C2:C11=G2)
                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 256

                ซึ่งวิธีนี้ดีกว่าวิธีอื่นตรงที่เรากำหนดได้เลยว่าจะเอา item ลำดับที่เท่าไหร่กลับมาก็ได้ ด้วยสูตรนี้

                =INDEX(FILTER($D$2:$D$11,$C$2:$C$11=G2),เลขลำดับ)

                ถ้าอยากได้อันสุดท้ายอันเดียว ก็ใช้ INDEX มาช่วยก็ได้ แล้วใช้ COUNTA นับว่า Filter มาเหลือกี่ตัว (ใช้ COUNTIFS ก็ได้แล้วแต่ชอบ) แล้วเอาใช้ในเลขลำดับ

                =INDEX(FILTER($D$2:$D$11,$C$2:$C$11=G2),COUNTA(FILTER($D$2:$D$11,$C$2:$C$11=G2)))
                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 257

                หรือ

                INDEX(FILTER($D$2:$D$11,$C$2:$C$11=G2),COUNTIFS($C$2:$C$11,G2))
                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 258

                error #CALC คือมัน Filter แล้วไม่มีผลลัพธ์ออกมา ถ้าอยากให้ไม่ขึ้น Error ก็ใช้ IFERROR ดักไปก็ได้ เช่น

                =IFERROR(INDEX(FILTER($D$2:$D$11,$C$2:$C$11=G2),COUNTIFS($C$2:$C$11,G2)),"-")
                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 259

                ใช้ Power Query

                เราเอา transaction table เข้าไป แล้ว เรียงใหม่ใน power queryจะได้แบบนี้ (กดเรียงวันที่ก่อน และกดเรียงเวลา)

                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 260

                จากนั้นให้ add index column ก่อนจะ remove duplicates ไม่งั้นมันจะมี bug ไปใช้ลำดับก่อนจะ sort ในการเก็บตัวบนสุด

                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 261

                จากนั้นก็ remove duplicates ที่คอลัมน์ product ซะก็จะได้ตัวล่าสุด จบเลย

                สารพัดวิธี Lookup หาค่าตัวสุดท้าย 262

                พอได้ตารางนี้แล้ว เราจะเอาไป Merge กับตารางอื่นยังไงก็ได้แล้ว ไม่ขอทำให้ดูละกันนะครับ

                สรุปแล้วคุณชอบแบบไหนครับ?

                ทำให้ดูไปหลายแบบมากๆ ว่าแต่คุณชอบแบบไหนกันมั่งครับ comment บอกได้นะ หรือถ้าใครมีวิธีดีๆ แบบอื่นๆ ก็ comment มาได้เลยเช่นกันครับ

              • เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง

                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง

                ในตอนที่แล้วเราได้เรียนเรื่องพื้นฐาน Calculus และเรื่องการหา Derivative กันไปแล้ว ในตอนนี้เราจะมาเรียนอีกเรื่องนึงที่สำคัญมากๆ นั่นก็คือการ Integrate นั่นเองครับ

                ซึ่งเจ้า Integration หรือ การอินทิเกรต คือ กระบวนการที่ตรงข้ามกับการหาอนุพันธ์ หรือ Derivative นั่นเอง

                Integrate นั้นตรงข้ามกับ Differentiate

                รูปแบบทั่วไปคือ ถ้าสมมติ diff ฟังก์กัน F(x) แล้วได้ฟังก์ชัน f(x)

                \frac{d}{dx} F(x)= f(x)

                หาเรา integrate f(x) จะได้ F(x) + c

                \int f(x) dx = F(x) + c

                โดยที่

                • เครื่องหมาย ∫ คือเครื่องหมาย Integral
                • dx คือ ตัวที่บอกว่ามันย้อนการ diff ที่เทียบกับ dx มา
                • c คือค่าคงที่ (Constant) ซึ่งเดี๋ยวอ่านต่อข้างล่างจะรู้ว่าทำไมต้องใส่ +c ด้วย

                เช่น ตอนเรียนเรื่อง Derivative เราเรียนรู้ไปว่า

                \frac{d}{dx} x^n= nx^{n-1}

                ดังนั้น ตอน Integrate จะกลับกันเป็นแบบนี้

                \int nx^{n-1} dx = x^n + c

                เช่น หากถามว่า integrate 3x^2 จะได้เท่าใหร่ ต้องบอกว่า ได้ x^3 +c เพราะสามารถเป็นไปได้หลายแบบเช่น

                • x^3 เฉยๆ
                • x^3 +5 ก็ได้
                • x^3 – 2 ก็ได้
                • จะเห็นว่า c จะเป็นค่าคงที่อะไรก็ได้นั่นเอง

                ดังนั้นนี่คือสาเหตุที่เราต้องใส่ +c ไว้ในรูปสมการทั่วไปด้วย ซึ่งหลายๆ คนจะลืม +c ตลอด ถึงขนาดมีการทำ meme มาล้อประจำ

                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 263
                อย่าลืม +c ด้วยนะ แงๆๆๆ
                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 264
                meme อันนี้อย่างเท่เลย

                ความหมายที่แท้จริงของการ Integrate

                หากการหาอนุพันธ์ได้อัตราการเปลี่ยนแปลง ของกราฟ เช่น

                หากเรา Diff เทียบต่อเวลา เราจะแปลงระยะทาง เป็นความเร็ว เป็นความเร่ง ได้

                ระยะทาง --> ความเร็ว --> ความเร่ง

                ดังนั้นถ้าเรา Integrate เทียบกับเวลา เราก็สามารถย้อนกลับได้เช่นกัน

                ความเร่ง --> ความเร็ว --> ระยะทาง

                สมมติว่าเรารู้ฟังก์ชันของความเร็วของ รถวิเศษที่เรานั่ง ณ เวลาต่างๆ เป็นดังนี้

                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 265

                หาถามว่าเมื่อเวลาผ่านไป 10 วินาที รถวิเศษวิ่งไปได้ระยะทางไกลกี่เมตร? เราจะหาคำตอบยังไง??

                แน่นอนว่าถ้าเราวิ่งด้วยความเร็วคงที่ตลอดที่ 5 m/s ถ้าวิ่งแบบนี้ไป 10 วินาที ก็คือ 5 m/s *10 s = 50 m จริงมั้ยครับ ซึ่งเอาจริงๆ มันก็คือการหาพื้นที่ใต้กราฟนั่นเอง

                ถ้าเราถามว่า ระหว่างวินาทีที่ 2 ถึง 8 วิ่งได้ระยะทางเท่าไหร่ เราก็หาพื้นที่ใต้กราฟเฉพาะวินาทีที่ 2-8

                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 266

                เรื่องของเรื่องคือ เจ้าพื้นที่ใต้กราฟเนี่ย หาเจ้าเส้นฟังก์ชันของความเร็วมันดันไม่ใช่เส้นตรงทื่อๆ มันจะคำนวณยากแล้ว เช่นแบบนี้

                สมมติฟังก์ชันของความเร็วเป็น v= 3t^2+5 เราจะหาพื้นที่ใต้กราฟของเส้นโค้งนี่ได้ยังไง???

                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 267

                แนวคิดก็คือ เราจะแบ่งพื้นที่ใต้กราฟเป็นสี่เหลี่ยมผืนผ้าเล็กๆ แล้วเอามารวมกัน เช่น

                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 268

                หลักการ คือ ถ้าเราแบ่งสี่เหลี่ยมให้แคบๆ มากๆๆๆๆ (เรียกว่า dt ละกัน) การหาพื้นที่ย่อยๆ (ds) จะได้ว่า

                พื้นที่ย่อยสี่เหลี่ยมผืนผ้า ds = สูง*กว้าง = v(t)*dt

                ส่วน พื้นที่รวม เราจะใช้การ integreate มาช่วย เพราะเป็นการรวมแบบที่ dt เล็กมากๆๆ เข้าใกล้ 0 นั่นเอง

                Total Area = \int v(t)dt

                อย่าลืมว่า integrate ความเร็ว จะได้ ระยะทาง ซึ่งเราคิดไว้แล้วว่าพื้นที่ใต้กราฟของความเร็วคือระยะทาง นั่นแปลว่า integrate ก็คือพื้นที่ใต้กราฟนั่นเอง! (แต่พื้นที่ใต้กราฟสามารถมีส่วนเหนือแกน x เป็น +, ใต้แกน x เป็น – ได้ด้วยนะ ซึ่ง integrate แล้วจะ net หักกัน)

                สรุปแนวคิด

                หากเราจะเปรียบเทียบความหมายของการหาอนุพันธ์ vs การอินทิเกรต จะเป็นแบบนี้ครับ

                • การหาอนุพันธ์ นั้น เราจะได้อัตราการเปลี่ยนแปลง หรือ ความชันของกราฟ ของจุดที่สนใจ
                • การอินทิเกรต นั้น เราจะได้พื้นที่ใต้กราฟ (แบบ net กัน ระหว่างพื้นที่บน กับ ล่าง)

                การคำนวณหาระยะทางด้วยความรู้ Integrate

                สมมติ v(t)= 3t^2+5

                แบบนี้ระยะทาง s ก็คือ

                s(t) = \int v(t)dt = \int (3t^2+5 )dt

                จะได้ว่า ระยะทาง s ณ วินาที่ที่ t คือแบบนี้

                s(t) = t^3+5t+c

                ถ้าจะหาระยะทางตั้งแต่วินาทีที่ 2-8 ให้ใส่ t เป็น 8 จะได้ระยะทาง ณ วินาทีที่ 8, และใส่ t เป็น 2 ได้ระยะทางวินาทีที่ 2

                จากนั้นเอามาลบกัน

                • ระยะทาง วินาทีที่ 8 =8^3 + 5*8 + c
                • ระยะทาง วินาทีที่ 2 =2^3 + 5*2 + c
                • ระยะทาง วินาทีที่ 2 ถึง 8 =(8^3 + 5*8 + c) – (2^3 + 5*2 + c)
                • ซึ่ง +c จะตัดกันเสมอ
                • = 534 นั่นเอง

                แปลว่า ระยะทาง หลังวิ่งไป 10 วินาที ก็จะได้เป็น ระยะทาง วินาทีที่ 10 – ระยะทาง วินาทีที่ 0

                • ระยะทาง วินาทีที่ 10 =10^3 + 5*10 + c
                • ระยะทาง วินาทีที่ 0 =0^3 + 5*0 + c
                • ระยะทาง วินาทีที่ 0 ถึง 10 =(10^3 + 5*10 + c) – (0^3 + 5*0 + c) ซึ่ง +c จะตัดกันเสมอเช่นกัน
                • แปลว่าเราใช้ระยะทางวินาทีที่ 10 ได้เลย แบบไม่ต้องมี + c เนอะ
                • = 10^3 + 5*10 = 1050 m นั่นเอง

                การคำนวณหาระยะทางด้วยความรู้ Excel

                ถ้าใช้ Excel เราแค่แบ่งระยะเวลาให้ย่อยมากๆ จนได้ dt เล็กๆๆๆๆ แล้วเอาไปคูณความเร็วของแต่ละ dt นั้นๆ ก็จะได้พื้นที่สี่เหลี่ยมผืนผ้าเล็กๆ จากนั้นเอาสี่เหลี่ยมผืนผ้าเล็กๆ มารวมกันก็จะได้พื้นที่ใต้กราฟ เช่น

                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 269

                ซึ่งจะได้ 1050.0155 ซึ่งใกล้เคียงกับ 1050 แต่ไม่เป๊ะหรอกนะ เพราะ dt เราไม่ได้เล็กพอ (แค่นี้ก็อัดไปแสนบรรทัดแล้ว)

                และนี่ก็คือ Concept ของการ Integrate ครับ หวังว่าเพื่อนๆ จะพอเห็นภาพนะ

                ความรู้แถม : ถ้าไม่อยากเสียพื้นที่ Excel ในการทำตาราง

                ถ้าเราไม่อยากมานั่งทดบรรทัดเยอะๆ แบบตารางข้างบนนี้ (เป็นแสนเป็นล้านบรรทัด แถมช้าอีก) ก็ใช้ความรู้ Array Formula หรือ Power Query มาช่วยก็ได้ (อันนี้ค่อนข้าง Advance นะ ใครไม่รู้เรื่องไม่เป็นไรครับ) เช่น

                ใช้ความรู้ Array Formula ของ Excel 365

                อยากหาระยะทาง ณ เวลา 2 วินาที

                ใช้ SEQUENCE สร้างเลข Running ระยะเวลา เช่น

                =SEQUENCE(rows,columns,start,step)
                =SEQUENCE(A2/E1+1,1,0,E1)
                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 270

                ต่อไปก็คำนวณ v ออกมาจาก v(t)= 3t^2+5 ได้

                =3*SEQUENCE(A2/E1+1,1,0,E1)^2+5
                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 271

                ต่อไปเอาไปคูณกับ dt 0.0001 แล้วหาผลรวม

                =SUM((3 * SEQUENCE(A2/E1+1,1,0,E1)^2+5) * E1)

                lock $ เล็กน้อย ให้ copy สูตรได้

                =SUM((3 * SEQUENCE(A2/$E$1+1,1,0,$E$1)^2+5) * $E$1)
                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 272

                ใช้ Array Formula ของ Excel verison เก่า

                Excel เก่าไม่มี SEQUENCE สามารถใช้ ROW+INDIRECT มาพลิกแพลงเอา เช่น

                =(ROW(INDIRECT("1:"&A2/E1+1))-1)*E1

                version เก่าจะไม่มี effect spill แบบนี้ แต่ไม่เป็นไร เดี๋ยวจะทำ step ต่อไปได้อยู่ดี

                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 273

                Tips : การใช้ฟังก์ชัน INDIRECT นั้นเป็น Volatile ฟังก์ชัน ถ้าเลี่ยงได้ก็ควรจะเลี่ยง ดังนั้นเราสามารถใช้ฟังก์ชัน INDEX มาช่วยสร้าง Dynamic Range แทนได้ แล้วค่อยใช้ ROW ครอบ เช่น

                =(ROW(A1:INDEX(A:A,A2/E1+1))-1)*E1
                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 274

                จากนั้น lock $ ซะหน่อยเป็นแบบนี้

                =(ROW($A$1:INDEX($A:$A,A2/$E$1+1))-1)*$E$1

                สุดท้ายก็เหมือนกัน แต่ใช้ SUMPRODUCT มารวมเลยดีกว่า จะไม่ได้ต้องกด Ctrl+Shift+Enter

                =SUMPRODUCT((3 * ((ROW($A$1:INDEX($A:$A,A2/$E$1+1))-1)*$E$1)^2+5) * $E$1)
                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 275

                ใช้ความรู้ Power Query มาสร้างฟังก์ชัน

                สร้าง Parameter secPara ว่าจะเอา ณ เวลาวินาทีที่เท่าไหร่

                จากนั้นสร้าง Query MyArea มาคำนวณพื้นที่รวม โดยอ้างอิงถึง Parameter secPara ที่สร้างไว้

                let
                    dt=0.0001,
                    NumItem = secPara/dt+1,
                    Source = List.Numbers(0, NumItem,  dt), //สร้าง Sequence ด้วย List.Number
                    ConvertTable = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
                    RenameColumns = Table.RenameColumns(ConvertTable,{{"Column1", "MyTime"}}),
                    AddVel = Table.AddColumn(RenameColumns, "MyVel", each 3*Number.Power([MyTime],2)+5),
                    AddArea = Table.AddColumn(AddVel, "SmallArea", each [MyVel]*dt),
                    SumArea = List.Sum(AddArea[SmallArea])
                in
                    SumArea

                แล้วเอา Query นี้แปลงเป็นฟังก์ชันโดยคลิ๊กขวา Create Function แล้วใช้ชื่อ MyAreaFx ซึ่งรับ input คือ secPara ว่าจะคำนวณระยะทาง ณ วินาทีที่เท่าไหร่

                จากนั้นเราก็เอา Table ที่ต้องการหาระยะทาง ณ เวลาต่างๆ เข้าไป แล้วเรียกใช้ฟังก์ชัน MyAreaFx ที่สร้างไว้ ก็จบเลย

                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 276
                เรียน Calculus ด้วย Excel ตอนที่ 2 : Integrate กับพื้นที่ใต้กราฟพิศวง 277

                ตอนต่อไป

                เดี๋ยวตอนหน้าจะเป็นการประยุกต์มากขึ้นอีกหน่อยนะ เช่น คำนวณหาจุดสูงสุดต่ำสุดด้วยการใช้ Diff หรือคำนวณหาปริมาตร ด้วยการ Integrate เป็นต้น

                สารบัญ Calculus

                • เรียน Calculus ด้วย Excel ตอนที่ 1 : พื้นฐานแคลคูลัส

                  เรียน Calculus ด้วย Excel ตอนที่ 1 : พื้นฐานแคลคูลัส

                  วันก่อนผมได้ถามแฟนเพจว่าอยากให้สอนเรื่องอะไรเป็นพิเศษ มีคำตอบนึงทำให้ผมสนใจมาก นั่นคือ อยากให้สอนพื้นฐาน​ Calculus แบบใช้​ Excel​ มาช่วยคำนวณ ตั้งแต่​ Limit, Differential, Integral etc.

                  ดังนั้น นี่คือบทความที่จะตอบเรื่องนั้นครับ ไม่แน่ใจเหมือนกันว่าจะมีซักกี่ตอน (เพราะเรื่องนี้อาจไม่มีคนสนใจมากนัก ถ้าไม่ใช่สายวิทย์) แต่คิดว่าคงไม่ค่อยมีใครเขียนถึงอะไรแบบนี้เท่าไหร่ และถือเป็นการทบทวนความรู้ Math ผมไปด้วยในตัว ก็เลยทำซะเลย 555

                  เอาล่ะ เรามาเริ่มกันเลยดีกว่าว่า Calculus คืออะไร ความหมายของการ Diff จริงๆ คืออะไร แล้วใช้ใน Excel ยังไง?

                  Calculus คืออะไร?

                  มันคือหลักการทางคณิตศาสตร์ที่ใช้ศึกษา “อัตราการเปลี่ยนแปลง” ซึ่ง ไอแซค นิวตัน ได้คิดต้นขึ้นเพื่อใช้อธิบายปรากฏการณ์ทางฟิสิกส์ต่างๆ เช่น กฎการเคลื่อนที่ กฎแห่งแรงโน้มถ่วง ที่คณิตศาสตร์สมัยนั้นอธิบายไม่ได้ (จริงๆ มีอีอกคนนึงก็คิดค้น Calculus ในแง่สัญลักษณ์ที่พวกเราใช้กันเหมือนกัน แต่ดันไม่ดังเท่านิวตัน)

                  ตามปกติแล้ว หากความสัมพันธ์ระหว่างค่า x กับ y เป็นเส้นตรง เราจะสามารถหาอัตราการเปลี่ยนแปลงของ y เทียบกับ x (หรือ ความชัน) ได้ง่ายๆ แบบนี้

                  ความชัน = การเปลี่ยนแปลงของ y / การเปลี่ยนแปลงของ x = ∆y /∆x = (y2-y1) / (x2-x1)

                  ซึ่งไม่ว่าคิดที่ตรงจุดไหน ความชันก็เท่ากันทั้งเส้น

                  เรียน Calculus ด้วย Excel ตอนที่ 1 : พื้นฐานแคลคูลัส 278

                  แต่ถ้าความสัมพันธ์ระหว่าง x กับ y ดันไม่ใช่เส้นตรง แปลว่าแต่ละจุดของเส้นนั้นอาจมีความชันไม่เท่ากันก็ได้ ดังนี้

                  เรียน Calculus ด้วย Excel ตอนที่ 1 : พื้นฐานแคลคูลัส 279

                  ซึ่งแนวคิดของ Calculus ก็คือ การที่เราจะสามารถคำนวณหาอัตราการเปลี่ยนแปลง หรือหาความชันของจุดที่เราสนใจได้นั่นเอง (เพราะแต่ละจุดมันไม่เท่ากัน)

                  ทีนี้ Concept ของมันคือ เราจะหาความชันของจุดที่เส้นความชันมีการสัมผัสกับเส้นโค้งเป๊ะๆ เลยก็ไม่ได้อีก เพราะว่าที่จุดสัมผัสนั้นไม่มีความยาว ไอ้ความชัน ∆y /∆x เดี๋ยวตัวส่วน ∆x เป็น 0 แล้วจะได้ infinity คำนวณไม่ได้

                  เค้าก็เลยคิด Concept อันนึงขึ้นมาเรียกว่า Limits เพื่อคำนวณสิ่งที่เข้าใกล้ค่าที่กำหนด เช่น แทนที่จะหาความชันของจุดเป๊ะๆ ก็ไปหาความชันของรูปสามเหลี่ยมเล็กๆ แถวๆ จุดนั้นแทน โดยใช้สัญลักษณ์ x แทนจุดเริ่มของ x และเพิ่มระยะไป h จะได้ x+h (บางตำราก็ใช้ ∆x แทน h ซึ่งก็คือสิ่งเดียวกัน)

                  ทำให้ความชันของสามเหลี่ยม = ∆y /∆x = f(x+h)-f(x) / h
                  calculus excel

                  คราวนี้ค่า h มันก็อาจจะเยอะหรือน้อย ขึ้นอยู่กับสามเปลี่ยมใหญ่แค่ไหน ถ้าเราอยากได้สามเหลี่ยมเล็กๆๆๆ เพื่อให้เราสามารถหาความชันของจุดที่เราต้องการที่จุด x ได้พอดี เราก็ต้องทำให้ระยะ h นั้นสั้นๆๆๆๆ ที่สุดเท่าที่จะทำได้ แต่ห้ามเป็น 0 เราก็จะเรียกว่า limit เมื่อ h เข้าใกล้ 0

                  เราเรียกการเปลี่ยนแปลงแบบน้อยมากๆๆๆๆๆ ว่า Differentials เช่นเจ้า ∆x เล็กๆ หรือ h ของเราเนี่ย

                  • เช่น เรียกการเปลี่ยนแปลง x น้อยๆๆ ว่า Differentials ของ x หรือ dx นั่นเอง
                  • เรียกการเปลี่ยนแปลงของ y น้อยๆ ว่า Differentials ของ y หรือ dy

                  เราเรียกอัตราการเปลี่ยนแปลงของ dy เทียบกับ dx เล็กๆ ที่เปลี่ยนไป ว่า การหา Derivative (อนุพันธ์) ของ y เทียบกับ x หรือชื่ออื่นๆว่า

                  • dy/dx (ซึ่งแน่ล่ะ เพราะมันเอาค่า y เล็กๆ หาร x เล็กๆ ไง)
                  • y’
                  • f'(x)

                  ซึ่งมีสูตรคือ

                  \frac{dy}{dx} = lim_{h \to 0} \frac{f(x+h) – f(x)}{h}

                  ลองหาอนุพันธ์ของสมการ y=x^2 + 10

                  สมมติว่าสมการ y ของเรา หรือ f(x) คือ y=x^2 + 10 จะได้ว่า

                  \frac{dy}{dx} = lim_{h \to 0} \frac{ ((x+h)^2+10 )- (x^2+10)}{h}

                  กระจายตัวยกกำลังสองออกมา ด้วยสูตร (a+b)^2 = a^2+2ab+b^2

                  \frac{dy}{dx} = lim_{h \to 0} \frac{ (x^2+2xh+h^2+10 )- (x^2+10)}{h}

                  x2 +10 เหมือนกันตัดกัน แล้ว ดึง h ออกมานอกวงเล็บ

                  \frac{dy}{dx} = lim_{h \to 0} \frac{ (2x+h )h}{h}

                  h เศษกับส่วนตัดกันได้ เพราะว่า h ไม่ใช่ 0 แน่ๆ พอ h เข้าใกล้ 0 ทำให้ 2x+h เข้าใกล้ 2x เฉยๆ

                  \frac{dy}{dx} = lim_{h \to 0} (2x+h ) = 2x

                  สรุป เมื่อ y=x^2 + 10 แล้ว dy/dx คือ 2x นั่นเอง

                  แปลว่า เมื่อ y=x^2 + 10 แล้ว
                  สมการของการเปลี่ยนแปลงของ y เทียบกับ x หรือ dy/dx หรือ Derivative ของ y เทียบกับ x จะได้ 2x นั่นเอง

                  หากเราเอา x กับ y’ มา Plot กราฟ จะได้เส้นสีส้มแบบนี้ ซึ่งค่า y’ คือความชัน ณ จุดที่ x มีค่าต่างๆ กัน เช่น

                  • ที่ x =-5, y’ =-10 คือความชันเป็น -10 (ลบเยอะ)
                  • ที่ x =0, y’ =0 คือความชันเป็น 0 (ศูนย์)
                  • ที่ x =5, y’ =10 คือความชันเป็น 10 (บวกเยอะ)

                  ซึ่งจะเห็นว่าตรงกับที่เราวาดรูปวิเคราะห์ไว้เลย

                  เรียน Calculus ด้วย Excel ตอนที่ 1 : พื้นฐานแคลคูลัส 280

                  มาลองพิสูจน์กันว่า หากเราทำให้ ∆x น้อยลงแล้วหาความชันจะได้เหมือนกัน limits มั้ย?

                  ทดสอบเรื่อง Limits เมื่อ ∆x เข้าใกล้ 0 ด้วย Excel

                  ถ้าเราใช้สมการลองทำให้ ∆x มันถี่ๆ มากๆ หน่อย ก็จะยังได้กราฟเส้นเดิมเนอะ ซึ่งเราจะมีค่า y’ เฉลยเอาไว้เทียบกับสิ่งที่เราจะทดสอบ

                  เรียน Calculus ด้วย Excel ตอนที่ 1 : พื้นฐานแคลคูลัส 281

                  คราวนี้เราจะลองมาหา y’ โดยใช้วิธีการคำนวณความชันระหว่าง ∆x ที่มีค่าต่างๆ กัน

                  เริ่มที่ ∆x เป็น 1

                  จะเห็นว่าค่า y’ ยังต่างจาก y’=2x พอสมควร ลอง plot trend line ออกมาได้ y’=2x+1 เฉยเลย (เพราะว่าค่า h หรือ ∆x ยังมากอยู่ ซึ่งยังไม่ถือว่าเข้าใกล้ 0)

                  เรียน Calculus ด้วย Excel ตอนที่ 1 : พื้นฐานแคลคูลัส 282

                  คราวนี้ลอง ∆x เป็น 0.1

                  จะเห็นว่าค่าเริ่มใกล้เคียง y’=2x ขึ้น โดยเพี้ยนแค่ 0.1 แทนที่จะเพี้ยน 1 เหมือนเดิม 555

                  เรียน Calculus ด้วย Excel ตอนที่ 1 : พื้นฐานแคลคูลัส 283

                  คราวนี้ลอง ∆x เป็น 0.0001

                  ยิ่งถ้า ∆x =0.0001 ยิ่งใกล้ๆๆๆ กับ 2x เข้าไปอีก

                  เรียน Calculus ด้วย Excel ตอนที่ 1 : พื้นฐานแคลคูลัส 284

                  นี่แหละความหมายของ dy/dx ล่ะครับ ยิ่ง ∆x มันเข้าใกล้ 0 มันก็จะให้ค่าที่เป็นความชัน หรืออัตราการเปลี่ยนแปลง ณ จุดนั้นๆ ให้เราเลย ซึ่งในทางคณิตศาสตร์เค้าก็พยายามหาความสัมพันธ์สำเร็จรูปออกมาให้พวกเราได้ใช้แบบไม่ต้องไปใช้ limits อีกต่อไป

                  สรุปสูตรของเรื่องการหา Derivative หรือ อนุพันธ์

                  สูตรหลักที่ 1 : การ diff x^n

                  \frac{d}{dx} x^n= nx^{n-1}

                  สูตรนี้สูตรเดียวใช้ได้หลายเรื่องมาก เช่น

                  หาก diff ค่าคงที่ c ก็จะเปรียบเหมือนลองมองสูตรบนสุดให้ n เป็น 0 : จะทำให้ 0*X^(0-1) = 0 ไปด้วย

                  \frac{d}{dx}c = 0

                  หาก diff x ก็จะเปรียบเหมือนมองสูตรบนสุดให้ n เป็น 1 : จะทำให้ 1*X^(1-1) = 1 นั่นเอง

                  \frac{d}{dx}x = 1

                  สูตรหลักที่ 2 : กระจายการบวกลบได้ตรงๆ

                  \frac{d}{dx} [f(x) \pm g(x)]= f'(x) \pm g'(x)

                  จากสูตรนี้ทำให้เรารู้ว่า เราสามารถดึงค่าคงที่ออกมาได้

                  \frac{d}{dx} cf(x) = c \frac{d}{dx}f(x)

                  สาเหตุเพราะว่า

                  cf(x) = f(x)+f(x)+f(x)+… c รอบ

                  สูตรหลักที่ 3 : กระจายการคูณ = หน้า diff หลัง + หลัง diff หน้า

                  \frac{d}{dx} [f(x) \cdot g(x)]= f(x) \cdot g'(x) + g(x) \cdot f'(x)

                  สูตรหลักที่ 4 : กระจายการหาร = (ล่าง diff บน – บน diff ล่าง) / ล่าง^2

                  \frac{d}{dx} [\frac {f(x)} {g(x)}]= \frac{g(x)f'(x)-f(x)g'(x)}{[g(x)]^2}

                  Higher-order Derivatives (อนุพันธ์อันดับสูง)

                  หาก y=f(x)

                  อนพันธ์ปกติ หรือ อันดับ 1 คือ diff ไป 1 รอบ

                  \frac{dy}{dx} = y’ = f'(x)

                  อนพันธ์อันดับ 2 คือ diff y ไป 2 รอบ

                  \frac{d^2y}{dx^2} = y” = f”(x) = f^{(2)}(x)

                  อนพันธ์อันดับ n คือ diff y ไป n รอบ

                  \frac{d^ny}{dx^n} = f^{(n)}(x)

                  Calculus กับโจทย์การคำนวณเรื่องการเคลื่อนที่

                  หากเราสามารถ Plot ความสัมพันธ์ระหว่างระยะทาง (s) กับ เวลา (t) ได้ด้วยฟังก์ชัน s = f(t)

                  เราจะสามารถคำนวณอัตราการเปลี่ยนแปลงของระยะทาง เทียบกับ เวลา หรือ “ความเร็ว (v) “ ว่า

                  v = \frac{ds}{dt}

                  เราจะสามารถคำนวณอัตราการเปลี่ยนแปลงของความเร็ว เทียบกับ เวลา หรือ “ความเร่ง (a) “ ว่า

                  a = \frac{dv}{dt}

                  เช่น สมมติว่าเราสามารถคำนวณตำแหน่งของการเคลื่อนที่ได้จากฟังก์ชันนี้ (assume ว่า ความเร่ง a คงที่)

                  s(t) = s_0+v_0t+\frac{1}{2}at^2
                  • s(t) = ระยะทาง ณ เวลาที่ t
                  • s0 = ระยะทางจุดเริ่มต้น
                  • v0 = ความเร็วจุดเริ่มต้น
                  • t = เวลาที่ผ่านไป
                  • a = ความเร่ง

                  จากกฎ Calculus เราจะคำนวณหาฟังก์ชันของความเร็วกับเวลา คือ v หรือ s'(t) ได้จากกฎการกระจายการบวก

                  v=s'(t) = v_0+at

                  เพราะว่า

                  \frac{d}{dt}s_0 = 0 \spaceและ\space \frac{d}{dt}v_0t = v_0 \spaceและ \frac{d}{dt}\frac{1}{2}at^2 = 2*\frac{1}{2}at

                  คำนวณหาฟังก์ชันของความเร่งกับเวลา คือ a หรือ s”(t) หรือ v'(t)

                  a=v'(t) = a

                  ซึ่งก็ถูกต้องเพราะเคสนี้ สมการการเคลื่อนที่ที่ผมใช้ ต้องใช้กับกรณีที่มีค่า a คงที่นั่นเอง

                  สูตรพวกนี้ คือสูตรฟิสิกส์ที่เรียนกันใน ม.ปลาย ซึ่งจริงๆ ก็เป็นการหา Derivative มาให้แล้วแบบสำเร็จรูปนั่นเองล่ะครับ

                  เช่น กรณีที่เราปล่อยลูกบอกจากตึกที่สูง 200m ถามว่า ถ้าผ่านไป 3 วินาที บอลจะมีความเร็วเท่าไหร่

                  จากสูตรนี้

                  v=s'(t) = v_0+at
                  • v0= ความเร็วเริ่มต้น = 0 m/s
                  • a = ความเร่ง = แรงดึงดูดของโลก = 9.81 m/s^2
                  • t = 3 วินาที

                  ดังนั้นความเร็วที่วินาทีที่ 3 หลังจากปล่อย คือ =0+9.81*(3) = 29.4300 m/s

                  หากเราลองทำใน Excel ดูแบบไม่พึ่งพา Calculus แต่ใช้การเปลี่ยน t ที่ละ 0.0001 แทน ก็จะเป็นแบบนี้

                  เรียน Calculus ด้วย Excel ตอนที่ 1 : พื้นฐานแคลคูลัส 285

                  จะเห็นว่าได้ค่าใกล้เคียงกับการใช้ Calculus มากๆ เลย และนี่แหละคือหลักการของการคำนวณ Change แบบเล็กๆ ของ Calculus ครับ

                  แปลว่าถ้าถามว่าวินาทีที่ 4 ความเร็วเป็นเท่าไหร่ ผมก็เอาระยะทางที่วินาทีที่ 4 กับวินาทีที่ 4.000001 ลบกัน หารด้วย 0.000001 ก็จบเหมือนกัน เช่น

                  v วินาทีที่ 4 =( 1/2*9.81*4.000001^2  -  1/2*9.81*4^2 )/0.000001 = 39.240005 
                  ซึ่งถ้าคิดจาก Calculus จะได้ v วินาทีที่ 4 =9.81*4 = 39.240 ซึ่งก็ถือว่า Excel ก็คำนวณได้ใกล้เคียงล่ะ 555

                  ตอนต่อไป

                  ตอนต่อไปจะมาดูเรื่องที่ตรงข้ามกับ Derivatives นั่นก็คือการ Integrate นั่นเอง

                  สารบัญ Calculus

                  • Power BI ตอนที่ 20 : การคำนวณต้นทุนแบบ FIFO ด้วย DAX

                    Power BI ตอนที่ 20 : การคำนวณต้นทุนแบบ FIFO ด้วย DAX

                    ตอนนี้จะเป็นเนื้อหาที่ประยุกต์ใช้ความสามารถของ DAX ที่เราเรียนมา ในการคำนวณสิ่งที่ค่อนข้างซับซ้อน นั่นก็คือ ต้นทุนแบบ FIFO นั่นเองครับ ซึ่งวิธีในบทความนี้จะสามารถทำให้คุณสามารถคำนวณสิ่งนี้ได้แบบอัตโนมัติ ไม่ต้องทน Manual อีกต่อไป 555 แต่ก่อนอื่นเรามาทบทวนหลักการของ FIFO กันนิดนึงก่อนจะไปดูวิธีทำใน DAX

                    ( Edit 30/6/2020 14:20 : ผมมีแก้ Code ที่ Error เรื่องเครื่องหมาย & ให้แล้วนะครับ รบกวนลอง refresh หน้าเว็บด้วย)

                    FIFO คืออะไร?

                    FIFO หรือ First In, First Out คือวิธีการทางบัญชี ที่จะใช้ต้นทุนสินค้าชิ้นที่ซื้อเอาไว้เก่าที่สุดก่อนแล้วค่อยไล่ไปชิ้นใหม่ขึ้นเรื่อยๆ ซึ่งผลของมันจะเห็นได้ชัดเลยกับสินค้าที่มีราคาซื้อเปลี่ยนแปลงไปเยอะๆ

                    เช่น เราซื้อสินค้าไป 3 รอบ จากเก่าไปใหม่ คือ

                    • 2 ชิ้น @ 4บาท/ชิ้น
                    • 5 ชิ้น @ 7 บาท/ชิ้น
                    • 3 ชิ้น @5 บาท/ชิ้น

                    ถามว่าถ้าเราขายสินค้าไป 2 รอบ คือ

                    • ขายรอบแรก : 4 ชิ้น @ 6 บาท/ชิ้น
                    • ขายรอบสอง : 5 ชิ้น @ 8 บาท/ชิ้น

                    แต่ละรอบจะได้กำไรเท่าไหร่?

                    การขายรอบแรก 4 ชิ้น

                    • ต้นทุนจะใช้ของสินค้า 2 ชิ้น @ 4บาท/ชิ้น + 2 ชิ้น @ 7 บาท/ชิ้น (เพราะขายทั้งหมดแค่ 4) = 8+14 = 22 บาท
                    • แปลว่ากำไร 4*6 – 22 = 2 บาท

                    การขายรอบสอง 5 ชิ้น

                    • ต้นทุนจะใช้ของสินค้า 3 ชิ้น @ 7บาท/ชิ้น (เพราะราคา 7 บาทเหลือแค่ 3 ชิ้น) + 2 ชิ้น @ 5 บาท/ชิ้น = 21+10 = 31 บาท
                    • แปลว่ากำไร 5*8 – 31 = 9 บาท

                    จะเห็นว่าวิธีการคำนวณนั้นยุ่งยากมาก เพราะต้องนั่งไล่ดูว่าใช้สินค้าเดิมไปถึงตัวไหนแล้ว จะได้เอาราคามาถูกอัน และถ้าสินค้ามีหลายชนิดอีก ยิ่งยากเข้าไปใหญ่เลย!!

                    เดี๋ยวทั้งหมดนี้เราจะมาทำด้วย Power BI กันนะครับ แต่สำหรับคนที่อยากใช้ Excel สามารถไปดูที่ Link เหล่านี้ได้

                    วิธีคำนวณ FIFO ด้วย Excel

                    มีหลายท่านที่ได้ทำวิธีการคำนวณ FICO ด้วย Excel ไปแล้ว ผมจึงไม่ขอทำซ้ำอีก แต่ละแบบก็มีข้อดีข้อเสียต่างกันไป

                    • QQ15 Calculate FIFO cost (สูตรโดย Excel Wizard) : อันนี้เป็นวิธีใช้สูตรกรณีเป็นสินค้าเดียว
                    • วิธีใช้สูตรแบบสินค้าหลายตัว (สูตรโดย Excel Wizard) เป็น post ในกลุ่ม Excel Super Fan ที่ถามมาโดยคุณ Nattaporn Chamwong : สามารถคำนวณได้จากสินค้าหลายตัว และดูผลลัพธ์พร้อมกันได้ทุกตัว [แต่บอกไว้ก่อนว่าซับซ้อนมากๆ]
                    • FIFO Costing with Excel Data Table using inward and outward table (อ. สมเกียรติ ฟุ้งเกียรติ แห่ง Excel Expert Training) : ใช้ concept ของ Data Table คำนวณได้จากสินค้าหลายตัว แต่ดูผลลัพธ์ได้ทีละตัว [วิธีนี้ผมชอบตรง concept ไม่ซับซ้อนดี และตรวจสอบผลลัพธ์ได้ง่าย]

                    วิธีคำนวณ FIFO ด้วย DAX ของผม

                    สำหรับวิธี DAX ของผม จะสามารถคำนวณได้จากสินค้าหลายตัว และแสดงผลลัพธ์ได้พร้อมกันทั้งหมด แถมเอาไปหมุนดูในมุมไหนก็ได้ (เพราะเอาไปสร้าง DAX Measure ได้) ดังนั้นมันจะยืดหยุ่นสุดๆ ไปเลยครับ โดยที่ผมประยุกต์เอา concept แนวคิด วิธีตาราง Data Table ของ อ. สมเกียรติ มาดัดแปลงให้ดีขึ้น โดยใช้ความสามารถของเครื่องมือยุคใหม่อย่าง DAX

                    ซึ่งผมใช้ concept ของ การสร้างตารางจำลองด้วย FILTER ผสมผสานกับการใช้ Iterator อย่าง SUMX ทำให้สามารถสร้างตารางจำลองในอากาศได้เลย ทำให้มันเป็นวิธีที่ทรงพลังมากๆ

                    ถ้าใครงงกับคำศัพท์เหล่านี้ก็ไปอ่านบทเก่าๆ เรื่อง SUMX กับ FILTER ได้นะครับ ส่วนใครไม่เคยเห็น VAR กับ RETURN ก็ไปอ่านได้ที่นี่

                    ดังนั้นเพื่อเป็นการให้เกียรติ อ.สมเกียรติ ผู้คิด Logic ในไฟล์เดิม และเพื่อให้ทุกคนสามารถเห็นภาพได้ชัด ผมจะใช้ Data เดียวกับของ อ.สมเกียรติ เลย แต่มีการแก้หัวตารางให้อ่านง่าย และเพิ่มราคาขายเข้าไป จะได้คิดกำไรไปได้เลย ดังนั้นทุกคนจะสามารถลองเปลี่ยนค่าในไฟล์ Excel เล่นตามได้ เพื่อให้เข้าใจว่าแต่ละขั้นตอนมันเกิดอะไรขึ้นบ้าง

                    สรุปแล้ว Data มีดังนี้

                    Power BI ตอนที่ 20 : การคำนวณต้นทุนแบบ FIFO ด้วย DAX 286

                    ก่อนอื่นผมเอาตารางการซื้อขายเข้าสู่ Power BI ก่อนแบบ Get Data จาก Excel ที่ผมเตรียมไว้ต่างหากอย่างตรงไปตรงมา ดังนี้

                    Power BI ตอนที่ 20 : การคำนวณต้นทุนแบบ FIFO ด้วย DAX 287

                    เอาล่ะ เรามาเริ่มเขียน DAX เพื่อสร้างคอลัมน์ใหม่ขึ้นมาช่วยคำนวณกันได้เลย (ผมสร้างเป็นคอลัมน์ใหม่ เพื่อให้ทุกคนเห็นภาพชัดเจนขึ้น ซึ่งจริงๆ บางขั้นตอนไม่ต้องออกมาเป็นคอลัมน์ใหม่ก็ได้นะ)

                    สิ่งแรกเพื่อให้การคำนวณ FIFO ง่ายขึ้น จะต้องมีจำนวน Unit ที่ซื้อ และขาย แบบสะสมซะก่อน ซึ่งสามารถใช้คำสั่ง SUMX + FILTER มาช่วย จะเห็นว่า DAX ใช้การอ้างอิงแบบ Cell Reference ของ Excel ไม่ได้ การเขียนเพื่ออ้างบรรทัดก่อนหน้าแบบสะสมก็จะยากกว่า Excel พอสมควรเนอะ

                    กด New Column แล้วใส่สูตรของแต่ละตัว โดยที่ผมมี comment อธิบายการทำงานให้ในสูตรด้วย // นะครับ

                    AccumBuy = ยอดซื้อสะสม

                    AccumBuy = 
                    VAR CurrentProductID = TXData[ProductID]
                    VAR CurrentNum = TXData[Num]
                    //ใช้ VAR เก็บค่าของข้อมูล ProductID กับ Num ของตาราง TXData 
                    //เอาไว้ใช้อ้างอิงอีกทีภายใน SUMX (ซึ่งมีการเปลี่ยนตาราง)
                    RETURN
                    // ใช้ SUMX เพื่อรวมค่าจากตารางจำลองที่สร้างขึ้นมา
                    // ใช้ Filter สร้างตารางในแถวก่อนหน้าทั้งหมดเฉพาะ ProductID ปัจจุบัน
                        SUMX (
                            FILTER (
                                TXData,
                                TXData[ProductID] = CurrentProductID
                                    && TXData[Num] <= CurrentNum
                            ),  
                            TXData[UnitBuy]
                        ) 
                    

                    AccumSell = ยอดขายสะสม

                    AccumSell = 
                    // หลักการเดียวกับ AccumBuy แค่เปลี่ยนเป็นการขาย
                    VAR CurrentProductID = TXData[ProductID]
                    VAR CurrentNum = TXData[Num]
                    RETURN
                        SUMX (
                            FILTER (
                                TXData,
                                TXData[ProductID] = CurrentProductID
                                    && TXData[Num] <= CurrentNum
                            ),
                            TXData[UnitSell]
                        )

                    แค่มี 2 ตัวนี้ จริงๆ เราก็สามารถคำนวณจำนวน Unit Balance ณ แต่ละขณะได้แล้ว ดังนี้

                    UnitBalance = TXData[AccumBuy]-TXData[AccumSell]

                    สรุปได้ข้อมูลทั้ง 3 คอลัมน์ดังนี้

                    Power BI ตอนที่ 20 : การคำนวณต้นทุนแบบ FIFO ด้วย DAX 288

                    Concept การคำนวณเรื่อง FIFO ในไฟล์ของ อ. สมเกียรติ

                    ทีนี้ Concept การคำนวณเรื่อง FIFO ในไฟล์ของ อ. สมเกียรติ คือ เอาจำนวนขายที่มีค่อยๆ มาหักลบจำนวนซื้อไล่จากเก่าไปใหม่ โดยเทียบเอาตัวต่ำกว่าระหว่างจำนวนซื้อแต่ละครั้งนั้นๆ กับจำนวนขายที่ยังค้างอยู่ ซึ่งจะได้จำนวนขายที่มาจับคู่กับจำนวนซื้อจริงๆ

                    เช่น ในรูปนี้ จะเห็นว่ามีจำนวนขาย 150,000 ชิ้น มันก็จะค่อยๆ เอามาหักลบ 50,000 10,000 70,000 และสุดท้ายเหลือ จับคู่กับตัวที่ซื้อ 100,000 ชิ้นแค่ 20,000 เท่านั้น

                    จากนั้นก็เอาจำนวนชิ้นที่คำนวณได้ไปคูณ UnitCost เพื่อให้ออกมาเป็น Cost of Goods Sold (ผมจะเรียกย่อๆ ว่า COGS) ของการซื้อแต่ละครั้งที่จับคู่กับจำนวนขายจริง (ในช่อง K6:K24)

                    จากนั้นเอา COGS ของการขายทุกครั้งมารวมกัน ได้ช่อง K25 ตัวล่างสุดของตารางกลาง

                    ทีนี้เอาค่า K25 ที่ได้จากตารางกลางไปโปรยในตารางขวาในคอลัมน์ Q ด้วย Data Table ในฐานะของ Cost of Goods Sold รวมของแต่ละ Transaction ที่มีการขายจริง

                    เช่น

                    • ขายสะสม 30,000 ชิ้น มี COGS 300,000
                    • ขายสะสม 70,000 ชิ้น มี COGS 750,000
                    • แปลว่าที่ขายเพิ่มมา 40,000 ชิ้น ต้องมี COGS 750,000-300,000 คือ 450,000 นั่นเอง

                    นี่คือ Concept วิธีคิด FIFO ของ อ. สมเกียรติ ซึ่งคุณควรทำความเข้าใจ Concept นี้ใน Excel ให้เข้าใจก่อน จึงจะสามารถเข้าใจสิ่งที่ผมจะทำด้วย DAX แทนได้ครับ ใครอยากอ่านวิธีคิดแบบละเอียดไปดูได้ที่นี่

                    Power BI ตอนที่ 20 : การคำนวณต้นทุนแบบ FIFO ด้วย DAX 289

                    คำนวณด้วย DAX (ตรงนี้ค่อนข้างซับซ้อนเลยล่ะ)

                    ทีนี้เพื่อให้คำนวณ COGS สะสมได้ เพื่อให้ง่าย เราจะคำนวณจำนวนซื้อสะสมในบรรทัดก่อนหน้าซะก่อน ดังนี้

                    PrevAccumBuy = 
                    VAR CurrentProductID = TXData[ProductID]
                    VAR CurrentNum = TXData[Num]
                    // เอาค่า AccumBuy ใน Transaction ก่อนหน้า เฉพาะของ ProductID ปัจจุบันมา
                    // ใช้ MAXX เพื่อเอาค่ามากสุดจากตารางจำลองที่สร้างขึ้นมา (ก็จะได้ตัวสะสมอันล่าสุด)
                    // ใช้ Filter สร้างตารางในแถวก่อนหน้าทั้งหมดเฉพาะ ProductID ปัจจุบัน
                    VAR MyResult =
                        MAXX (
                            FILTER (
                                TXData,
                                TXData[Num] < CurrentNum
                                    && TXData[ProductID] = CurrentProductID
                            ),
                            TXData[AccumBuy]
                        )
                    RETURN
                    // ให้แสดงค่าเฉพาะบรรทัดที่เป็นการซื้อเท่านั้น นอกนั้นเป็น 0 ไป
                        IF ( TXData[UnitBuy] > 0, MyResult ) + 0

                    จะได้ตารางหน้าตาแบบนี้ ซึ่งผมจะเอา PrevAccumBuy นี้ไว้ใช้หักลบออกจาก AccumSell เพื่อที่จะได้รู้ว่า ยังมีจำนวนขายให้มาเทียบกับจำนวนซื้อได้อีกกี่ตัว

                    ซึ่ง PrevAccumBuy ของผมจะคล้ายกับส่วนนี้ในสูตรใน Excel เลย (สมมติดูในช่อง J10)

                    IF(AND(@Id=IdKey,@Date>=From,E10>0),MIN(E10,TotalUnit-SUM($J$5:J9)),0)
                    Power BI ตอนที่ 20 : การคำนวณต้นทุนแบบ FIFO ด้วย DAX 290

                    ทีนี้เราจะสามารถใช้สูตรนี้เพื่อคำนวณ COGS สะสมได้

                    CostFIFOAccum = 
                    VAR CurrentNum = TXData[Num]
                    VAR CurrentProductID = TXData[ProductID]
                    VAR AccumSell = TXData[AccumSell]
                    VAR PrevAccumBuy = TXData[PrevAccumBuy]
                    VAR FIFOBuytable =
                    //สร้างตารางจำลอง โดยคัดมาแต่รายการก่อนหน้าที่เป็นการซื้อเท่านั้น
                        FILTER (
                            TXData,
                            TXData[UnitBuy] > 0
                                && TXData[Num] < CurrentNum
                                && TXData[ProductID] = CurrentProductID
                        )
                    VAR FIFOBuytableAdd =
                    // สร้างคอลัมน์ "ActualDeduct" เพิ่มใน FIFOBuytable เพื่อให้รู้ว่าแต่ละจำนวนซื้อนั้นๆ มีจำนวนขายให้หักจริงเท่าไหร่
                    // เพื่อสร้างคอลัมน์ J ในตารางกลางของไฟล์ Excel
                        ADDCOLUMNS (
                            FIFOBuytable,
                            "ActualDeduct", MIN ( TXData[UnitBuy], MAX ( AccumSell - TXData[PrevAccumBuy], 0 ) )
                        )
                    VAR CalCost =
                    // เอาจำนวน unit ที่หักจริงสำหรับ Transaction นั้นๆ * ราคาซื้อ แล้ว SUM (ตรงนี้จะเหมือนคอลัมน์ K ในตารางกลางของไฟล์ Excel)
                        SUMX ( FIFOBuytableAdd, [ActualDeduct] * TXData[UnitPrice] )
                    VAR CostFIFOAccum =
                    // เอาค่า COGS สะสมมาแสดงเฉพาะรายการที่เป็นการขาย ตรงนี้จะเหมือนคอลัมน์ Q ในตารางขวาของไฟล์ Excel
                        IF ( TXData[UnitSell] > 0, CalCost )
                    RETURN
                        CostFIFOAccum

                    จะเห้นว่าส่วนของ “ActualDeduct” ที่มีสูตร

                    MIN ( TXData[UnitBuy], MAX ( AccumSell - TXData[PrevAccumBuy], 0 ) )

                    นั้นจะใช้หลักการของสูตรใน Excel อันนี้เลย

                    IF(AND(@Id=IdKey,@Date>=From,E10>0),MIN(E10,TotalUnit-SUM($J$5:J9)),0)

                    ตอนนี้ผมก็ได้คอลัมน์ Q ของ ไฟล์ Excel แล้ว แต่ของผมดีกว่าตรงที่ออกมาพร้อมกันทุก Product เลย!!

                    Power BI ตอนที่ 20 : การคำนวณต้นทุนแบบ FIFO ด้วย DAX 291

                    ต่อไปก็คำนวณยอด COGS ของแต่ละรายการจริงๆ โดยเอายอดสะสมปัจจุบันหักด้วยยอดสะสมก่อนหน้า

                    CostFIFO = 
                    VAR CurrentNum = TXData[Num]
                    VAR CurrentProductID = TXData[ProductID]
                    VAR PrevFICOAccum =
                    // คำนวณยอด COGS สะสมของ Transaction ก่อนหน้า เฉพาะของ ProductID ปัจจุบัน
                        MAXX (
                            FILTER (
                                TXData,
                                TXData[Num] < CurrentNum
                                    && TXData[ProductID] = CurrentProductID
                            ),
                            TXData[CostFIFOAccum]
                        )
                    VAR CurrentFIFOCost = TXData[CostFIFOAccum] - PrevFICOAccum
                    // เอาที่สะสมปัจจุบัน - สะสมก่อนหน้า = ได้ยอด COGS ปัจจุบัน
                    RETURN
                    // ให้แสดงค่า COGS เฉพาะรายการที่เป็นการขายเท่านั้น
                        IF ( TXData[UnitSell] > 0, CurrentFIFOCost )

                    เท่านี้ผมก็ได้คอลัมน์ R ของไฟล์ Excel แล้ว (แต่ของผมออกมาพร้อมกันทุก Product เลยเช่นเคย)

                    Power BI ตอนที่ 20 : การคำนวณต้นทุนแบบ FIFO ด้วย DAX 292

                    หลังจากนี้ง่ายมากๆ แล้ว

                    หลังจากนี้ก็คำนวณ Revenue กับ Profit ได้ง่ายๆ ดังนี้

                    Revenue = TXData[UnitPrice]*TXData[UnitSell]
                    ProfitFIFO = TXData[Revenue]-TXData[CostFIFO]
                    Power BI ตอนที่ 20 : การคำนวณต้นทุนแบบ FIFO ด้วย DAX 293

                    พอได้พวกนี้ครบแล้ว ก็สามารถสร้าง DAX Measure ที่ต้องการเช่น TotalUnitBuy, TotalUnitSell, ToTotalRevenue, TotalCost, TotalProfit ได้แบบง่ายๆ ด้วย SUM ได้เลย

                    TotalUnitBuy = SUM(TXData[UnitBuy])
                    TotalUnitSell = SUM(TXData[UnitSell])
                    TotalRevenue = SUM(TXData[Revenue])
                    TotalCost = SUM(TXData[CostFIFO])
                    TotalProfit = SUM(TXData[ProfitFIFO])

                    จากนั้นเราก็สามารถเอาไปสร้าง Report ยังไงก็ได้แล้วล่ะ ตรงนี้ไม่มีอะไรยากแล้ว อยากดูรวมทุก Product หรือดูทีละอัน Power BI ทำได้หมด และทำให้ Interactive กันได้ด้วย

                    Power BI ตอนที่ 20 : การคำนวณต้นทุนแบบ FIFO ด้วย DAX 294

                    จบแล้ว

                    ใครทำตามแล้วสงสัยอะไรตรงไหนก็สามารถ comment ถามได้นะครับ บอกเลยว่าวิธีนี้มันทรงพลังมากๆ เพราะเราอยากดูมุมไหน อยาก Filter อะไรก็สามารถทำได้หมด

                    สารบัญ Series Power BI

                    ใครสนใจอยากเรียนเป็นคลิปวีดีโอ ผมมี

                  • Power BI ตอนที่ 19 : การปรับ Cross Filter Direction เพื่อคำนวณค่าในตาราง Dimension

                    Power BI ตอนที่ 19 : การปรับ Cross Filter Direction เพื่อคำนวณค่าในตาราง Dimension

                    บทความนี้จะสอนเรื่องการปรับค่า Cross Filter เพื่อให้สามารถคำนวณข้อมูลที่อยู่ในตาราง Dimension จากตารางอื่นได้ แต่ก่อนจะไปดูเรื่องนั้น มาทวนเรื่องการคำนวณกรณีที่ Measure หลักอยู่ใน Fact Table กันซะก่อนครับ

                    เมื่อ Measure หลัก คำนวณจากข้อมูลใน Fact Table

                    ในตอนที่ 14 เรื่องของ Context Transition ผมมีเขียนสูตรอธิบายการใช้ CALCULATE ผสมกับพวก SUMX AVERAGEX MAXX (เรียกว่า Iterator) ซึ่งจะสามารถเพิ่มการคำนวณมุมมองใหม่ๆ ให้กับ Measure หลัก ซึ่งคำนวณจากข้อมูลในตาราง Fact ผ่านมุมมองต่างๆ ของตาราง Dimension เช่น

                    Power BI ตอนที่ 19 : การปรับ Cross Filter Direction เพื่อคำนวณค่าในตาราง Dimension 295
                    TotalRevenue = 
                    SUMX(fSales,fSales[SalesQuantity]*RELATED(dProduct[UnitPrice])) 

                    จะเห็นว่า TotalRevenue คำนวณจากตาราง fSales ดังนั้นจึงสามารถ Filter จากตารางอื่นได้เมื่อเราใช้ พวก SUMX AVERAGEX MAXX สร้างตารางจำลองขึ้นมา แล้วเกิด Context Transition ขึ้น

                    TotalRevenue เฉลี่ยรายร้านค้า

                    AverageStoreRevenue = 
                    AVERAGEX(DISTINCT(dStores[StoreKey]),[TotalRevenue])

                    TotalRevenue เฉลี่ยราย Category สินค้า

                    AvgProductCategoryRevenue = 
                    AVERAGEX( DISTINCT(dProduct[ProductCategory]) , [TotalRevenue] )

                    TotalProfit ที่มากสุดรายสินค้า

                    MaxProductCategoryProfit = 
                    MAXX( DISTINCT(dProduct[ProductCategory]) ,[TotalGrossProfit] )

                    ซึ่งจะเห็นว่าเราสามารถสร้างมุมมองต่างๆ เพิ่มได้ไม่จำกัด หาก Measure หลักนั้นคำนวณจากข้อมูลซึ่งอยู่ที่ Fact Table แต่ถ้า Measure หลักไม่ได้คำนวณจากคอลัมน์ใน Fact Table ล่ะ? ในบทความนี้เราจะมาดูวิธีจัดการกันครับ

                    เมื่อ Measure หลัก คำนวณจากข้อมูลใน Dimension Table

                    ใน Data Model ด้านบน สมมติผมต้องการคำนวณ Max UnitPrice ก็เลยสร้าง Measure ขึ้นมาว่า

                    MaxUnitPrice = MAX(dProduct[UnitPrice])

                    ซึ่งจะเห็นว่ามันคำนวณจากข้อมูลในตาราง dProduct เต็มๆ เลย

                    ดังนั้นมันจึงไม่สามารถถูก Filter ได้ด้วยตารางอื่นเลยนอกจาก dProduct ตัวเดียวเท่านั้น (ทั้งนี้เพราะว่าทิศทางของ Relationship มันย้อนศรไม่ได้)

                    เวลาเราเอา Measure นี้ไปใช้ใน Visual mี่มีการ Filter จากตารางอื่น (เช่น dDate) ผลลัพธ์ก็จะผิดทันที ซึ่งจะเห็นชัดว่า ค่าทุกตัวเท่ากันหมดเพราะว่าไม่ได้มีการ Filter เกิดขึ้นเลย นั่นเอง

                    Power BI ตอนที่ 19 : การปรับ Cross Filter Direction เพื่อคำนวณค่าในตาราง Dimension 296

                    แนวทางแก้ไขมีอยู่ 2 วิธี คือ

                    1. ปรับทิศทาง Cross Filter ในเส้น Relationship ของ Data Model เป็น Both Direction เสมอ (ไม่แนะนำ)
                    2. ใช้ฟังก์ชัน CROSSFILTER มาช่วยใน CALCULATE เพื่อปรับเป็น Both เฉพาะการคำนวณ Measure นั้นๆ (แนะนำ)

                    ปรับทิศทาง Cross Filter ในเส้น Relationship ของ Data Model เป็น Both Direction

                    วิธีนี้ไม่ต้องเขียนสูตรอะไรทั้งสิ้น เพราะเป็นการไปปรับที่เส้น Relationship ใน Data Model เองเลย โดยให้ดับเบิ้ลคลิ๊กที่เส้นตัวเจ้าปัญหา

                    Power BI ตอนที่ 19 : การปรับ Cross Filter Direction เพื่อคำนวณค่าในตาราง Dimension 297

                    จากนั้นเลือก Cross Filter Direction เป็น Both เพื่อให้มันสามารถ Filter ได้ทั้ง 2 ทิศทาง

                    Cross Filter Direction

                    พอปรับเป็น both แล้ว ลูกศรก็จะหันไปทั้ง 2 ทิศทาง แปลว่ามันยอมให้เรา Filter จากตารางอื่นได้แล้ว

                    Power BI ตอนที่ 19 : การปรับ Cross Filter Direction เพื่อคำนวณค่าในตาราง Dimension 298

                    หากไปดูผลลัพธ์ใน Visual ก็จะถูกต้องแล้ว

                    Power BI ตอนที่ 19 : การปรับ Cross Filter Direction เพื่อคำนวณค่าในตาราง Dimension 299

                    อย่างไรก็ตามผมไม่แนะนำวิธีนี้ เนื่องจาก Data Model อาจเกิดความกำกวมได้ ว่าจะให้ Filter จากทิศไหนไปไหนกันแน่ ดังนั้นเรามาดูอีกวิธีกัน

                    ใช้ฟังก์ชัน CROSSFILTER มาช่วยใน CALCULATE เพื่อปรับเป็น Both เฉพาะการคำนวณ Measure นั้นๆ

                    วิธีนี้ ใน Data Model เราจะยังคงเป็นทิศทางเดียว คือ Single อยู่ แต่คราวนี้เราจะเขียน Measure ตัวใหม่ ให้รองรับการ Filter แบบ 2 ทิศทางได้ โดยใช้ CALCULATE+CROSSFILTER

                    CROSSFILTER ( <LeftColumnName>, <RightColumnName>, <CrossFilterType> )

                    โดยที่ CROSSFILTER มีความสามารถในการเปลี่ยนรูปแบบการ Cross Filter หรือ <CrossFilterType> จาก Relationship ที่มีอยู่แล้วให้เป็น Both, None, OneWay ได้ ซึ่งจะต้องใช้ฟังก์ชันนี้คู่กับ CALCULATE ในฐานะของ Filter เช่น

                    MaxUnitPriceV2 = 
                    CALCULATE(MAX(dProduct[UnitPrice]),
                            CROSSFILTER(dProduct[ProductKey],fSales[ProductKey],Both)
                            )

                    ซึ่งแม้ว่าใน Data Model เส้น Relationship จะยังเป็น Single อยู่ แต่ใน Measure MaxUnitPriceV2 นี้จะสามารถใช้ Relationship แบบ Both ได้ แบบนี้จะไม่ทำให้ตัว Model เสีย และยังสามารถคำนวณได้ถูกต้องอีกด้วย แบบนี้สิ แนะนำเลย!

                    Power BI ตอนที่ 19 : การปรับ Cross Filter Direction เพื่อคำนวณค่าในตาราง Dimension 300

                    สารบัญ Series Power BI

                    ใครสนใจอยากเรียนเป็นคลิปวีดีโอ ผมมี

                  • Power Query Speed Up Tips : รวมเทคนิคแก้ปัญหา Power Query ช้า ให้ทำงานเร็วขึ้น

                    Power Query Speed Up Tips : รวมเทคนิคแก้ปัญหา Power Query ช้า ให้ทำงานเร็วขึ้น

                    ในบทความนี้จะเป็นการรวบรวมเทคนิคและความรู้ความเข้าใจในการที่จะแก้ปัญหา Power Query ช้า ให้ทำงานเร็วขึ้น เพราะหากคุณเริ่มใช้ Power Query เป็น คุณจะเริ่มใช้มันกับทุกสถานการณ์ หากคุณเริ่มทำมันเยอะพอ คุณคงต้องเคยเจอปัญหาว่าบางทีมันทำงานช้ามากตอนที่กด Refresh All เพื่ออัปเดทข้อมูล ไม่ว่าจะเป็นใน Excel หรือ Power BI ก็ตาม เพื่อไม่ให้เสียเวลา เรามาเริ่มกันเลยครับ

                    ตั้งค่า Data Load ให้เหมาะสม

                    ปกติแล้วเวลาเราทำงานกับ Power Query เรามักจะสร้าง Query Step ย่อยๆ ขึ้นมาระหว่างทาง แล้วสุดท้ายก็เอามาใช้จริงแค่บาง Query เท่านั้น นอกนั้นเป็นตัวทด ซึ่งตัวทดควรจะ Load ออกมาแบบ Connection Only จริงมั้ยครับ?

                    ทีนี้ถ้าเราต้องมานั่งกด Close & Load to… Connection Only ทุกอันก็คงเสียเวลาแย่เลย ดังนั้นเราสามารถตั้งค่า Default การ Load เอาไว้ให้เป็น Connection Only ไว้ก่อน โดยไปที่ File –>Option & Settings –> Query Options –> Data Load

                    ตรงนี้มีจุดที่ปรับได้ 3อันคือ

                    Power Query Speed Up Tips : รวมเทคนิคแก้ปัญหา Power Query ช้า ให้ทำงานเร็วขึ้น 301

                    1.Default Load ซึ่งผมแนะนำให้กดแบบ Specific custom default แล้วเอาติ๊กออกไปให้หมด เพื่อให้มันออกมาเป็น Connection Only นั่นเอง (ถ้าอยากจะ Load Query ไหนออกมาเป็นอย่างอื่น ก็กดคลิ๊กขวาที่ Query แล้วกด Load to… ได้)

                    2. โหมด Fast Data Load : ถ้าติ๊กอันนี้ ไอ้เครื่องหมาย i เค้าบอกว่า Query จะ Load ผลลัพธ์ออกไปใช้งานเร็วขึ้น แต่ระหว่างโหลดเครื่องอาจจะนิ่งๆ แฮงๆ ไปชั่วครู่ (เพราะว่ามันทุ่มเทพลังทั้งหมดไปที่การ Load ละมั้ง) แต่ที่ผมเคยลองผลลัพธ์ก็ไม่เห็นจะต่างกันเท่าไหร่เลยครับ 555

                    3. ตั้งค่า Cache : ตัวนี้จริงๆ ไม่ควรเกี่ยวกับการ Load โดยตรง แต่เกี่ยวกับการ Preview Data ให้ดูใน Query Editor มากกว่า (เพราะการ Preview มันเอามาจาก Data ที่เก็บใน Cache) แต่ตรงนี้ผมลองตั้งเยอะๆ แล้วทำให้เร็วขึ้นเล็กน้อยเฉยเลย… ดังนั้นใครมี Hdd เหลือก็ตั้งเยอะหน่อยก็ได้ครับ ไม่เสียหาย

                    ตั้งค่า Allow data preview to download in the background ให้เหมาะสม

                    คำสั่ง Allow data preview to download in the background นี้อยู่ใน Query Option -> Data Load

                    Power Query Speed Up Tips : รวมเทคนิคแก้ปัญหา Power Query ช้า ให้ทำงานเร็วขึ้น 302

                    คำสั่งนี้เอาไว้ทำอะไร?

                    ปกติแล้วเวลา Power Query Get Data มาเตรียมให้เรา Transform เล่น ใน Power Query Editor มันจะเอาข้อมูลมา 1000 แถว ให้เราเห็นภาพผลลัพธ์ก่อน อันนี้แหละที่เรียกว่า Data Preview (ที่เอาจากข้อมูล Cache ที่เก็บในข้อที่แล้ว)

                    หากเราติั๊ก Allow data preview to download in the background เอาไว้ มันจะเป็นการบอกให้ Power Query คอย Update ตัว Preview สำหรับทุกๆ Query และที่สำคัญเวลาที่เรากด Refresh All มันก็จะ Load Preview สำหรับทุก Query ใหม่ด้วย!! ซึ่งตรงนี้แหละที่มันเสียเวลา

                    ข้อสรุปคือ

                    • หากคุณมี Query เยอะๆ โดยเฉพาะ Query ที่ไม่ได้ Load Data ออกมาจริงๆ การไม่ติ๊กจะทำให้ Load เร็วกว่า
                    • อย่างไรก็ตาม ข้อเสียของการเอาออก คือ เวลากดเปลี่ยน Step หรือกดไปดู Query ตัวอื่นใน Query Editor เจ้า Data Preview จะโหลดช้ากว่าเดิม

                    รายละเอียดเคสที่ disable option นี้ช่วยได้ สามารถอ่านได้ในนี้

                    ใช้ Power Query ใน Power BI แทน Excel !

                    ไม่รู้เหมือนกันว่าทำไม เหมือน 2 ตัวนี้มันจะทำงานไม่เหมือนกัน 100% ถ้าใช้ Power Query ใน Power BI มันจะ Load เร็วกว่า Excel นิดหน่อย

                    ซึ่งถ้าเราเคยทำงานใน Excel อยู่แล้ว ไม่จำเป็นต้องไปสร้าง Query ใน Power BI ใหม่ทั้งหมดนะ เราสามารถคลิ๊กขวา Copy Query จาก Excel ไป Power BI ได้เลย

                    Power Query Speed Up Tips : รวมเทคนิคแก้ปัญหา Power Query ช้า ให้ทำงานเร็วขึ้น 303

                    จากนั้นไป Paste ใน Power Query Editor ของ Power BI

                    Power Query Speed Up Tips : รวมเทคนิคแก้ปัญหา Power Query ช้า ให้ทำงานเร็วขึ้น 304

                    ผลลัพธ์ : เคสผมลองแล้วเร็วขึ้น 10% ครับ

                    อย่างไรก็ตาม หาก Query มีการดึงไฟล์จาก Workbook ตัวเองไว้ มันจะเอามาลง Power BI ตรงๆ ไม่ได้ เพราะใน Power BI มันไม่มี Excel.CurrentWorkbook ครับ มีแต่ Excel.Workbook

                    เข้าใจหลักการของการ Reference / Duplicate Table

                    หลายๆ คนอาจจะคิดว่า หากเราเขียน Query1 ไว้แล้ว จากนั้นทำการ Reference Query1 ไปใช้ใน Query2,3,4,… อีกหลายๆ อัน แล้วต้องการ Load ผลลัพธ์ออกหมดทุกอัน มันจะคำนวณ Query1 แค่ครั้งเดียวตอนแรก หลังจากนั้นไม่ต้องคำนวณอีกแล้ว อันนี้เป็นความเข้าใจที่ผิดนะครับ

                    เพราะการ Reference Query จริงๆ มันก็คือเหมือนเอา Code ของ Query1 มาใส่ใน Query อื่นๆ ที่อ้างอิงมันไปด้วยอยู่ดี แต่เหมือนเป็น Let…in… ซ้อนใน Let…in… ของ Query อื่น เช่น

                    Query1 ผมเขียนว่า

                    let
                        Step1 = 3+2,
                        Step2 = Step1*100
                    in
                        Step2

                    จากนั้นผมสร้าง Query 2 แล้ว Reference ข้อมูลจาก Query1 จะได้สูตรใน Query2 ว่า

                    let
                        Source = Query1
                    in
                        Source

                    จากนั้นผมก็ทำนู่นนี่ใน Query 2 ไปอีก เช่น

                    let
                        Source = Query1,
                        Step1 = Source+55,
                        Step2 = Step1/10
                    in
                        Step2

                    แบบนี้เวลามันทำงานจริง มันจะเหมือนว่า Copy Code ใน Query1 มาใส่ใน Query 2 ก่อนจะทำงาน เช่น

                    let
                        Source = 
                            let
                                Step1 = 3+2,
                                Step2 = Step1*100
                            in
                                Step2  
                        ,
                        Step1 = Source+55,
                        Step2 = Step1/10
                    in
                        Step2

                    ซึ่งเวลามันทำงานก็จะประมาณนี้

                    Power Query ช้า

                    ดังนั้นมันก็จะคำนวณทุกสิ่งทุกอย่างใน Query1 ใหม่อยู่ดี (ยกเว้นว่า Query1 ไม่ต้อง Load ออกมา คือเป็นตัวทดเฉยๆ มันก็จะรันแค่ที่ Query2 นี่แหละ)

                    ดังนั้นประโยชน์ของ Reference Query ก็แค่ว่า หากเราไปแก้ Query1 แล้ว ตัวต้นทางของ Query2 จะเปลี่ยนตามอัตโนมัติ ซึ่งต่างจาก Duplicate ซึ่งหากเราไปแก้ Query1 แล้ว ตัว Code ใน Query2 จะไม่ได้เปลี่ยนตามนั่นเอง

                    ใช้ Table.Buffer อย่างเหมาะสม

                    คำสั่ง Table.Buffer มีความสามารถในการเก็บข้อมูลในตารางเข้าสู่ Memory (คนละอันกับ Cache ที่จะเก็บบน HDD) เพื่อที่เวลามีการเรียกใช้อีก มันจะได้ไม่ต้องไปเอาข้อมูลจาก Data Source ใหม่ทุกครั้ง

                    Table.Buffer(table as table) as table

                    เคสที่ผมเคยใช้ ผมใช้มันกับ Table ที่ต้องมีการอ้างถึงหลายรอบใน Query เดียวกัน (ที่อ้างถึงเพราะเป็นการ Filter ช้อมูลจาก Table นั้นคล้ายๆ Vlookup Approximate Match) ซึ่งมีการอ้างถึง Table นั้นเท่ากับจำนวน Row ใน Table หลัก ซึ่งมีหลายพันครั้ง

                    Code ก่อน buffer

                    let
                        //Source เป็นการดึงผลลัพธ์จากอีก Table นึงมาทำงานต่อ
                        Source=SystemEmployee,
                        
                        #"Added Custom" = Table.AddColumn(Source, "Custom", 
                                (main)=>Table.SelectRows(Source,
                                        (sub)=>sub[EnNo]=main[EnNo] and (sub[DateonlyNum]=main[DateonlyNum] or (sub[DateonlyNum]=(main[DateonlyNum]+1) and sub[Mode]=6 )))),
                        
                        ....

                    พบว่าไฟล์ที่เป็นต้นทางจริงๆ ขนาดแค่ 209K แต่ Power Query ดันขึ้นว่า Read Data ไป 900 MB++ (เพราะมันอ่านจาก Source ใหม่ไม่รู้กี่รอบ)

                    Code หลัง buffer

                    let
                        //เพิ่มการ Buffer ให้ Source เพราะว่ามีการเรียกใช้ Source หลายรอบด้วย Table.SelectRows ใน Step ถัดไป
                        Source=Table.Buffer(SystemEmployee),
                        
                        #"Added Custom" = Table.AddColumn(Source, "Custom", 
                                (main)=>Table.SelectRows(Source,
                                        (sub)=>sub[EnNo]=main[EnNo] and (sub[DateonlyNum]=main[DateonlyNum] or (sub[DateonlyNum]=(main[DateonlyNum]+1) and sub[Mode]=6 )))),
                        
                        ....
                        

                    หลังจากใช้เทคนิคTable.Buffer แล้ว ในเคสของผมก็ช่วยลดเวลา Load ไปได้ประมาณ 10-15% (ควรลองทดสอบด้วยนะ เพราะบางเคสทำแล้วอาจจะแย่ลงได้ เนื่องจาก Table.Buffer มันจะทำการอ่านข้อมูลเข้า Ram ทั้งหมดตอนที่ Buffer เลย)

                    อีกทั้งเลขที่ขึ้นว่า Load ข้อมูลจาก Data เท่าไหร่แล้ว มีขนาดใกล้เคียงกับ Data จริงคือ 209kb ไม่ใช่ 900MB++ เหมือนตอนที่ไม่ได้ Buffer (เห็นแล้วตกใจมาก!!)

                    แปลว่าในตัวอย่างที่แล้วเรื่อง Reference/Duplicate Query สมมติเราไปสร้าง Query ซักตัวมาใช้ Table.Buffer Query1 ไว้ จากนั้นให้ Table อื่นอ้างอิง Query นั้นไปใช้ มันก็ไม่ช่วยอะไรอยู่ดี เพราะจะกลายเป็นทุก Query จะต้อง Buffer ใหม่ตลอดเวลานั่นเอง

                    สรุปแล้ว Table.Buffer จะมีประโยชน์ก็ต่อเมื่อ ใช้กับ Query ที่มีการเรียก Table นั้นๆ หลายรอบใน Query เดียวกันเท่านั้น

                    พยายามทำให้ข้อมูลให้เหลือน้อยก่อนทำ Operation อื่น

                    สมมติการ Transform ข้อมูลเรามี 2 เรื่องที่ต้องทำ คือ Add Column คำนวณบางอย่าง กับ Filter ให้เหลือข้อมูลบรรทัดที่ต้องการ

                    ถ้าเป็นไปได้เราควรจะ Filter ก่อน Add Column เพื่อที่ว่า Power Query จะได้คำนวณน้อยลงเท่าที่จำเป็นจริงๆ ไม่ใช่คำนวณทั้งหมดแล้วดันไป Filter ทิ้งทีหลัง แบบนั้นเสีย Resource เปล่าๆ (ยกเว้นว่า ไอ้ Column ที่ add มาคือเงื่อนไขของการ Filter ถ้างั้นเราก็จำเป็นต้อง Add ก่อน จริงมะ?)

                    นอกจากนั้น ก่อนจะใช้ Table.Buffer ในตัวอย่างที่แล้ว หากเราเลือกให้เหลือเฉพาะข้อมูลที่จำเป็นก่อนจะทำการ Buffer มันก็น่าจะช่วยให้ Load Query เร็วขึ้นเช่นกัน ซึ่งผมลองปรับ Query แล้วปรากฏว่าเร็วขึ้น 30%

                    let
                      Source = SystemEmployee,
                      MyBufferTable = Table.Buffer(
                        Table.SelectColumns(Source, {"EnNo", "Mode", "DateonlyNum", "DateTime"})  ),
                      #"Added Custom" = Table.AddColumn(
                        Source, "Custom", 
                        (main) => Table.SelectRows(
                          MyBufferTable, 
                          (sub) => sub[EnNo] = main[EnNo] and (sub[DateonlyNum] = main[DateonlyNum]
                            or (sub[DateonlyNum] = (main[DateonlyNum] + 1) and sub[Mode] = 6))
                        )
                      ),
                    ...

                    พยายามทำให้ Step เหลือน้อยๆ

                    เราสามารถแก้ Code ให้มีจำนวน Step น้อยลงได้ ซึ่งเท่าที่ทดสอบดู Query ก็จะเร็วขึ้นเล็กน้อยด้วย

                    แต่การทำแบบนี้ได้ ต้องเข้าใจโครงสร้างของ M Code ที่อ้างอิง Step ก่อนหน้ามาทำงานต่อ

                    เช่น แทนที่จะเขียนแบบนี้

                    let
                        Source = Query1,
                        Step1 = Source+55,
                        Step2 = Step1/10
                    in
                        Step2

                    การเขียนแบบนี้จะเร็วกว่าเล็กน้อย

                    let
                        Step2 = (Query1+55)/10,
                    in
                        Step2

                    รวมถึงการกำจัด Step ที่ไม่จำเป็น เช่น Add Custom Column ไปแล้ว มาเปลี่ยนชื่อทีหลัง หากเราเปลี่ยนชื่อไปเลยใน Step Add Custom Column ก็จะเร็วกว่า เป็นต้น

                    คลิปทดสอบการแก้ปัญหา Power Query ช้า

                    รายละเอียดของเทคนิคในคลิปนี้ค่อนข้างซับซ้อน ใครสนใจสามารถดูได้ที่นี่ ซึ่งรวมหลายเทคนิคด้วยกันคือ

                    • การยกเลิก Allow data preview to download in the background
                    • ใช้ Table.View มาช่วยบอกให้ Power Query รู้ลักษณะ Structure ของ Data Source โดยไม่ต้องไปลองดึงมาจริงๆ
                    • ยกเลิกการเช็ค Data Privacy
                    • ยกเลิก Parallel Load กรณีที่เอา Data เดิมหลายรอบ

                    เทคนิคอื่นๆ

                    ใครมีเทคนิคอื่นๆ ก็อย่าลืมมาแชร์กันด้วยนะครับ