Author: Sira Ekabut

  • หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup

    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup

    ตอนที่แล้วเราพูดถึง Library เจ๋งๆ ไปหลายตัว ในตอนนี้ผมจะขอพูดถึงการใช้ Python ดึงข้อมูลจาก website กันครับ ซึ่งเครื่องมือที่จะใช้ชื่อว่า Beautiful Soup นั่นเอง ซึ่งบทความนี้อาจไม่ค่อยเกี่ยวกับการทำงานใน Excel เท่าไหร่ แต่เรียกว่ามาอุดจุดอ่อนของการใช้ Excel จะดีกว่า เพราะใน Excel จะดึงข้อมูลจากเว็บได้ไม่ค่อยดี แม้จะมีฟังก์ชัน WEBSERVICE, FILTERXML หรือแม้จะใช้ Power Query ก็ตาม ก็ยังไม่ค่อย Work เท่าการใช้ Python

    การเรียกใช้งาน Beautiful Soup

    เวลาใช้งาน Beautiful Soup เรามักจะใช้กับ module อีกตัวที่เรียกว่า requests เพื่อจะขอข้อมูลจาก website กลับมา โดยจะถูกใช้ร่วมกันประมาณนี้

    import requests
    from bs4 import BeautifulSoup
    
    myURL="https://www.thepexcel.com/category/highlights/"  #ใส่เว็บที่เราต้องการ
    
    r = requests.get(myURL)  #ขอข้อมูลจาก url ที่กำหนดเก็บไว้ใน object r (request)
    s = BeautifulSoup(r.content, "html.parser")  #แปลงโครงสร้าง html ใน content เข้า object s (soup)

    ถ้าลองดูว่าใน s เป็นอะไร มันก็คือโครงสร้าง html ของทั้งเพจนั้น ซึ่งมันมีข้อมูลส่วนที่เราไม่ได้อยากได้อยู่ด้วย ที่นี้เราต้องมาเรียนรู้วิธีเลือกส่วนที่เราต้องการเท่านั้น

    Beautiful Soup

    วิธีเลือกเอา element ที่ต้องการ

    ทีนี้เจ้า Beautiful Soup เนี่ย สามารถดึงข้อมูลเฉพาะส่วนที่เราต้องการจาก html ได้ โดยเราจะต้องเข้าใจก่อนว่าเว็บไซต์ต่างๆ ที่เราเห็นนั้นจะถูกเก็บข้อมูลในลักษณะของภาษา HTML ซึ่งมีลักษณะที่เป็น Tag ลงไปเป็นชั้นๆ โดยจะมีการเปิด Tag และ Tag ทุกครั้ง เช่น

    <Tagแม่>
       <Tagลูก> Content1 </Tagลูก>
       <Tagลูก> Content2 </Tagลูก>
       <Tagลูก> Content3 </Tagลูก>
    </Tagแม่>
    <Tagแม่>
       <Tagลูก> Content4 </Tagลูก>
       <Tagลูก> Content5 </Tagลูก>
       <Tagลูก> Content6 </Tagลูก>
    </Tagแม่>

    เราสามารถใช้ Beautiful Soup เลือกข้อมูลได้ด้วยวิธีเขียนแบบนี้

    s.element1   #เข้าไปใน element1 อันแรก

    หรือ

    s.find('element1')  #เข้าไปใน element1 อันแรก

    เช่น

    s.Tagแม่   #เข้าไปใน Tagแม่ อันแรก
    
    #จะได้แบบนี้
    #<Tagแม่>
    #   <Tagลูก> Content1 </Tagลูก>
    #   <Tagลูก> Content2 </Tagลูก>
    #   <Tagลูก> Content3 </Tagลูก>
    #</Tagแม่>

    ถ้าจะเข้าไปชั้นที่ลึกขึ้น

    s.element1.element2   #เข้าไปใน element1 อันแรก -> element2 อันแรก

    หรือ

    s.find('element1').find('element2')  #เข้าไปใน element1 อันแรก -> element2 อันแรก

    เช่น

    s.Tagแม่.Tagลูก   #เข้าไปใน Tagแม่ อันแรก -> เช้าไป Tag ลูกอันแรกในนั้น
    
    #จะได้แบบนี้
    #   <Tagลูก> Content1 </Tagลูก>
    

    เช่น ถ้าลองกับเว็บของผม จะเป็นดังนี้

    s.body.h2  #ได้ element h2 อันแรกสุด ใน body ของเพจ
    s.body.p  #ได้ element p อันแรกสุด ใน body ของเพจ
    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 1

    ดึงข้อมูลใน element ออกมา

    ถ้าใน element นั้นมีข้อมูลหลายส่วน เช่น ใน h2 ของผมมีข้อมูลเยอะแยะ เราสามารถดึงบางส่วนมากได้ เช่น

    myText=s.body.h2.get_text()  #ได้ข้อความข้างใน
    myLink=s.body.h2.a.get('href')  #ได้ link ข้างใน ของ a ตัวแรกสุด ใน h2 แรกสุด
    myImageURL=s.body.img.get('src')  #ได้ url ของรูปอันแรก ข้างใน body
    
    print(myText)
    print(myLink)
    print(myImageURL)
    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 2

    วิธีเลือกเอา element ที่ต้องการทั้งหมดทุกตัว

    s('element1')   #เอา element1 กลับมาทุกตัวที่เจอ

    หรือ

    s.find_all('element1')  #เอา element1 กลับมาทุกตัวที่เจอ

    เช่น

    s.body.find_all('h2')  # ได้ h2 ทุกตัว
    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 3

    เราสามารถเข้าถึง item ย่อยลำดับที่ต้องการได้ ด้วยการใส่เลข index ในวงเล็บเหลี่ยม คล้ายกับ list ปกติเลย (แปลว่าเราวน loop ได้) เช่น

    s.body.find_all('h2')[1]  # ได้ h2 index ที่ๅ ซึ่งคือตัวที่2
    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 4

    แต่เราไม่สามารถ get_text() ตรงๆ จากการ find_all ได้ มันจะขึ้น error

    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 5

    เราต้องแก้ไขด้วยการ เข้าไป get_text() ในแต่ละ item ของ h2 เลย ด้วยการวน loop เพื่อใช้คำสั่ง get_text() กับ item ข้างในทีละตัวเป็นต้น

    for i in s.body.find_all('h2'):
      print(i.get_text())
    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 6

    วิธีเลือกเอา element ที่มีลักษณะที่กำหนด

    ก่อนหน้านี้ ผมได้ h2 กลับมาเยอะเกินที่ต้องการ เพราะดันได้ h2 ของ widget บทความล่าสุดด้านขวากลับมาด้วย แต่ที่ผมต้องการคือ h2 เฉพาะของหน้าหลักจริงๆ ดังนั้นผมจะต้องใช้วิธีค้นหาเฉพาะตัวที่มีลักษณะที่ผมต้องการเท่านั้น

    ด้วยคำสั่ง attrs= dictionary ลักษณะที่ต้องการ

    เช่น ผมต้องการ h2 ที่มี class เป็น post-title entry-title is-size-3 เท่านั้น (ซึ่งรู้จากการใช้ google chrome inspect เอา)

    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 7

    ผมก็สามารถเขียนได้ดังนี้

    for i in s.body.find_all('h2', attrs={'class':'post-title entry-title is-size-3'}): 
    #เอาเฉพาะ h2 class ที่ต้องการ
      print(i.get_text())
    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 8

    ลองค้นหาข้อมูลใน Pantip Hitz

    เดี๋ยวลองดึงข้อมูล topic ในหน้าเว็บของ Pantip Hitz ครับ

    import requests
    from bs4 import BeautifulSoup
    myURL="https://pantip.com/home/hitz"  #ใส่เว็บที่เราต้องการ
    
    r = requests.get(myURL)  #ขอข้อมูลจาก url ที่กำหนดเก็บไว้ใน object r (request)
    s = BeautifulSoup(r.content, "html.parser")  #แปลงโครงสร้าง html ใน content เข้า object s (soup)
    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 9

    จะเห็นว่าข้อมูลอยู่ใน tag a ซึ่งอยู่ใน h2 อีกที ดังนั้นเราจะดึงข้อมูลได้โดยการใส่คำสั่งว่า

    for i in s.find_all('h2'): #เอาเฉพาะ h2 class ที่ต้องการ
      #เอา text ใน a ที่มี class ตามที่ต้องการ
      print(i.find('a',attrs={'class':'gtm-hitz-page1'}).get_text()) 
    
    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 10

    สมมติว่าผมอยากได้ hashtag ของแต่ละ Topic เราจะดึงข้อมูลยังไงดี? มาดูกัน

    ซึ่งก่อนอื่นผมก็ต้องไปหาก่อนว่ามันอยู่ใน Tag อะไรยังไง?

    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 11

    พอไปสำรวจดูพบว่า อยู่ใน a ที่อยู่ใน div class ชื่อว่า pt-list-item__tag อีกที

    ดังนั้นถ้าลองดึงข้อมูลมาจะเป็นดังนี้

    for i in s.find_all('div',attrs={'class':'pt-list-item__tag'}): #เอาเฉพาะ h2 class ที่ต้องการ
      for tag in i.find_all('a'):
        print(tag.get_text()) 
    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 12

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

    ทีนี้จะทำไงดี?

    การจัดกลุ่มข้อมูลที่ดึงมาได้

    ผมคิดว่าโครงสร้างของข้อมูลที่น่าจะพอใช้เก็บข้อมูล List ที่มีจำนวนไม่แน่นอนได้ และอ้างอิงได้ค่อนข้างง่าย น่าจะเหมาะที่จะเก็บเป็น dictionary แบบซ้อนกัน ซึ่งเดี๋ยวผมจะเอาไปแปลงเป็น Data Frame ภายหลังก็ได้

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

    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 13

    ปรากฏว่าจริงๆ แล้วทั้ง Topic และ Tag อยู่ใน li ที่มีชื่อ class ว่า pt-list-item ทั้งคู่ ดังนั้น ผมจะต้องวน loop ตามแต่ละ item ของ li แต่ละตัว แล้วภายในนั้นผมค่อยเอา Topic(H2) ในนั้น (มีอันเดียว) และ Tag (a) ที่ต้องการมาให้หมด(มีหลายอัน)

    โดยผมจะดึงข้อมูล มาใส่ใน Dictionary เปล่าที่สร้างไว้ จนครบทุก item

    pantipDict={} #สร้าง Dict เปล่าๆ
    
    Myli=s.find_all('li',attrs={'class':'pt-list-item'})
    for num in range(len(Myli)):
      tempDict={} #สร้าง dict ชั่วคราว
      topicText=Myli[num].find('h2').get_text()
      tempDict['Topic']=topicText
      tagList=Myli[num].find('div',attrs={'class':'pt-list-item__tag'})
      tempList=[]
      for tag in tagList.find_all('a'):  #หา tag แต่ละตัว
        tempList.append(tag.get_text())
      tempDict['Tag']=tempList #ใส้ tempList เข้าไปใน dict ตัวจริง
      pantipDict[num]=tempDict #ใส้ tempdict เข้าไปใน dict ตัวจริง
    
    pantipDict
    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 14

    แปลงเป็น Data Frame และ Export เป็น CSV

    ถ้าหากเรารู้สึกว่า Dictionary มันดูยาก เราก็สามารถ convert ให้กลายเป็น Data Frame ได้แบบง่ายๆ เลย ดังนี้

    import pandas as pd
    pantipDF=pd.DataFrame.from_dict(pantipDict, orient='index')
    pantipDF
    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 15

    และถ้าจะ Export Data Frame เป็น csv ก็สามารถทำได้ง่ายๆ เช่นกัน ดังนี้

    from google.colab import files
    pantipDF.to_csv('pantipHitz.csv') 
    files.download('pantipHitz.csv')
    หัด Python สำหรับคนเป็น Excel : ตอนที่ 7 – Web Scraping ด้วย Beautiful Soup 16

    จบตอน

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

    สารบัญ Series Python

    • หัด Python สำหรับคนเป็น Excel : ตอนที่ 6 – การเรียกใช้ Module / Packages เจ๋งๆ ที่มีคนสร้างไว้แล้ว

      หัด Python สำหรับคนเป็น Excel : ตอนที่ 6 – การเรียกใช้ Module / Packages เจ๋งๆ ที่มีคนสร้างไว้แล้ว

      ในที่สุดก็มาถึงตอนที่จะแสดงพลังที่แท้จริงของ Python ในความคิดของผมซักที นั่นก็คือ การที่เราสามารถเรียกใช้ Code จาก Module/Packages ภาษา Python ที่มีคนเจ๋งๆ เขียนไว้มากมาย เพราะมันเป็นภาษาที่ได้รับความนิยมสูงมากนั่นเอง

      ต้องเกริ่นนิดนึงว่าเราสามารถเขียนสร้าง function/class ภาษา Python แล้ว save เป็นไฟล์ .py แยกไว้เป็นอีกไฟล์นึงแล้วสามารถเรียกใช้คำสั่งในไฟล์นั้นจากโปรแกรม python ไฟล์อื่นๆ ได้ โดยสามารถเรียกใช้ผ่านคำสั่งที่ชื่อว่า import โดยไม่ต้องมานั่งเขียน code ใหม่นั่นแหละ (แต่ตอนนี้ผมยังไม่ได้อธิบายว่า class คืออะไรเนอะ เอาแบบคร่าวๆ คือมันเป็น object แบบนึงที่เราสร้างขึ้นมาได้เองละกัน)

      พอทำแบบนี้ได้ คนเค้าก็เลยออกแบบโปรแกรมโดยแยกส่วนของโปรแกรมย่อยออกไปเป็นอีกส่วนจากโปรแกรมหลัก นั่นคือพยายามเขียนชุดคำสั่งที่อาจถูกเรียกใช้บ่อยๆ แยกไว้เป็นไฟล์ .py อีกอัน โดยจะเรียกว่า Module ซึ่งใน module หนึ่งๆ ก็มักจะรวม code คำสั่งเรื่องคล้ายๆ กันไว้ด้วยกัน

      นอกจากนี้สามารถสร้าง module ได้หลายอัน (ไฟล์ .pyหลายไฟล์) แล้วจัดรวมเป็นกลุ่มที่เรียกว่า Package ได้อีกด้วย ซึ่งจะช่วยให้การทำงานเป็นระบบระเบียบมากขึ้น ไม่งงว่าตกลง module ไหนบ้างที่อยู่กลุ่มเดียวกัน

      อย่างไรก็ตามผมจะไม่ได้มาพูดถึงการสร้าง Module หรือ Packages ด้วยตนเองในบทความนี้ แต่จะพูดถึงการเอา Module/Packages ของคนเก่งๆ คนอื่นที่เค้าแจกใน internet ซึ่งอยู่ในเว็บ pypi.org มาใช้ต่างหาก

      การ install Packages ด้วยคำสั่ง pip

      ปกติแล้ว ถ้าจะ import module/packages ต่างๆ มาใช้งานได้นั้น เราต้องมีไฟล์ .py ต่างๆ ใน folder ที่เราใช้ทำงานก่อน แต่ถ้าเจ้า module/packages ที่เราต้องการมันยังอยู่ใน pypi.org อยู่เลย เราก็ต้อง install ไฟล์เหล่านั้นให้มาอยู่ใน ใน folder ที่เราใช้ทำงานก่อนนั่นเอง ซึ่งเราสามารถทำได้ด้วยคำสั่งนี้ใน command prompt (เช่น cmd ของ windows)

      pip install ชื่อpackages

      คำสั่งนี้เรียกครั้งเดียว เพื่อให้ computer เราโหลด script ของ library ตัวนี้มาจาก internet นะ ครั้งต่อๆ ไปก็ไม่ต้อง install แล้ว สามารถเรียกใช้ script ด้วยการ import มาใช้ในไฟล์เราได้เลย

      อย่างไรก็ตาม การ install ใน colab จะใช้ syntax ที่ต่างไปเล็กน้อย เพื่อบ่งบอกว่านี่ไม่ใช้ script python แต่เป็น command line

      !pip install ชื่อpackages

      หรือ

      %pip install ชื่อpackages

      เราสามารถดูรายชื่อ module/packages ทั้งหมดที่ install ไว้แล้วได้ด้วยคำสั่ง

      pip list

      ซึ่งจะเห็นว่าใน colab มี module/packages ที่ install ไว้แล้วมากมาย ดังนั้นอาจไม่ต้องใช้ pip install ด้วยซ้ำ import ได้เลย!

      หัด Python สำหรับคนเป็น Excel : ตอนที่ 6 – การเรียกใช้ Module / Packages เจ๋งๆ ที่มีคนสร้างไว้แล้ว 17

      วิธี import module

      เราสามารถใช้คำสั่ง import ได้ดังนี้ (สั่งใน script python หรือ ใน Colab)

      import ชื่อmodule

      หรือจะใช้แบบนี้ก็ได้ เพื่อให้อ้างอิงชื่อ module ง่ายขึ้นในอนาคต

      import ชื่อmodule as ชื่อเล่น

      ลอง import เครื่องมือจัดการข้อมูลที่ชื่อ pandas

      เจ้า pandas ถือเป็น module/packages ที่ค่อนข้างทำงานคล้ายกับการจัดการข้อมูลใน Excel มากๆ เลย จะเป็นไงมาดูกันครับ

      อ่านไฟล์ csv ด้วย read_csv

      สมมติว่าจะ import module ที่ชื่อว่า pandas มาใส่ชื่อเล่น pd แล้วลองอ่านไฟล์ csv ใน url ที่กำหนด ก็ทำตามนี้

      จุดเด่นของ pandas คือการเก็บข้อมูลในลักษณะที่เรียกว่า dataframe ซึ่งมีวิธีการทำงานคล้ายกับ table ใน excel มากๆ

      myFileURL='https://raw.githubusercontent.com/ThepExcel/download/master/ThepExcelsample.csv'
      import pandas as pd
      myDataFrame=pd.read_csv(myFileURL) #อ่านไฟล์ csv ไว้ใน dataframe (โครงสร้างข้อมูลใน pandas)
      
      myDataFrame.head() #แสดงตัวอย่าง 5 บรรทัดแรก (ถ้าใส่เลข ก็จะเอาตามจำนวนนั้น)
      หัด Python สำหรับคนเป็น Excel : ตอนที่ 6 – การเรียกใช้ Module / Packages เจ๋งๆ ที่มีคนสร้างไว้แล้ว 18

      ถ้าจะทำความเข้าใจภาพรวมของข้อมูลก็สามารถใช้คำสั่งนับแบบไม่ซ้ำได้ดังนี้

      myDataFrame.nunique() # นับข้อมูลแบบไม่ซ้ำในแต่ละคอลัมน์
      หัด Python สำหรับคนเป็น Excel : ตอนที่ 6 – การเรียกใช้ Module / Packages เจ๋งๆ ที่มีคนสร้างไว้แล้ว 19

      วิธีอ้างอิงคอลัมน์

      เราสามารถอ้างอิงคอลัมน์ที่ต้องการได้คล้ายๆ การอ้างอิง Table ใน Excel เลย เช่น myDataFrame[‘จำนวนชิ้น’] จะเป็นการอ้างอิงคอลัมน์จำนวนชิ้น หรือจะเขียนแบบนี้ก็ได้ myDataFrame.จำนวนชิ้น (แต่วิธีนี้ ที่ผมลองมักมีปัญหากับภาษาไทย T_T)

      ซึ่งสามารถเอาไปใช้ทำอย่างอื่นต่อได้อีก เช่น เราจะสร้างคอลัมน์ยอดขายขึ้นมาใหม่จาก ราคาต่อชิ้น * จำนวนชิ้น ก็ทำได้เหมือนเขียนสูตรใน Table Data Model ของ Excel หรือ Power BI เลย

      myDataFrame['ยอดขาย']=myDataFrame['ราคาต่อชิ้น']*myDataFrame['จำนวนชิ้น'] #สร้างคอลัมน์ยอดขาย
      myDataFrame.describe() #สรุปข้อมูลที่เป็นตัวเลขออกมา (เห็นคอลัมน์ใหม่แล้ว)
      หัด Python สำหรับคนเป็น Excel : ตอนที่ 6 – การเรียกใช้ Module / Packages เจ๋งๆ ที่มีคนสร้างไว้แล้ว 20

      การ Filter ข้อมูลตามเงื่อนไข

      ถ้าจะ filter ข้อมูล ก็ใส่เงื่อนไขที่ต้องการในลักษณะนี้ได้เลย

      ชื่อDataFrame[เงื่อนไข]   #เงื่อนไข เช่น ชื่อDataFrame['คอลัมน์']== ค่าบางอย่าง

      ซึ่งถ้าเงื่อนไขมันซับซ้อน จะเขียนแยกไว้ก่อน แล้วค่อยเอามาใช้ทีหลังก็ได้ เช่น

      cond1=เงื่อนไข1
      cond2=เงื่อนไข2
      condFinal=เงื่อนไข1 & เงื่อนไข2
      ชื่อDataFrame[condFinal]

      เช่น ถ้าจะ filter ให้เป็น sales ก ขาย หนังสือ ก็ทำแบบนี้ได้

      cond1=myDataFrame['ผู้ขาย']=='sales ก'
      cond2=myDataFrame['สินค้า']=='หนังสือ'
      cond3=myDataFrame['จำนวนชิ้น']>5
      condFinal = (cond1 & cond2) | cond3     #(cond1 และ cond2)  หรือ cond3
      myFilterData=myDataFrame[condFinal]
      myFilterData
      หัด Python สำหรับคนเป็น Excel : ตอนที่ 6 – การเรียกใช้ Module / Packages เจ๋งๆ ที่มีคนสร้างไว้แล้ว 21

      สรุปข้อมูลด้วย groupby และ pivot_table

      ถ้าจะสรุปข้อมูล ก็ทำได้ง่ายๆ ด้วยคำสั่ง groupby() ซึ่งจะคล้ายกับใช้ Pivot แล้วลาก Field ไปไว้ที่ Rows ของ Pivot เช่น

      myDataFrame.groupby(['สินค้า','วิธีการชำระเงิน']).sum()  #สรุปข้อมูลได้ด้วย groupby
      หัด Python สำหรับคนเป็น Excel : ตอนที่ 6 – การเรียกใช้ Module / Packages เจ๋งๆ ที่มีคนสร้างไว้แล้ว 22

      หรือถ้าจะใส่ 2 แกน cross กัน แบบ PivotTable จริงๆ ก็ทำได้เช่นกันครับ ซึ่งใน pandas ก็มี pivot_table ให้ใช้เช่นกัน ซึ่งจริงๆ มันปรับแต่งอะไรได้เยอะมากนะ แต่อันนี้แค่เป็นตัวอย่างง่ายๆ เฉยๆ

      pd.pivot_table(myDataFrame,values='ยอดขาย', index=['สินค้า','วิธีการชำระเงิน'], columns=['ผู้ขาย'], aggfunc='sum')
      หัด Python สำหรับคนเป็น Excel : ตอนที่ 6 – การเรียกใช้ Module / Packages เจ๋งๆ ที่มีคนสร้างไว้แล้ว 23

      ถ้าหากเราอยากได้วิธีการสรุปข้อมูลแปลกๆ เราอาจใช้วิธี import packages อื่นมาอีกก็ได้ เช่น numpy

      ลอง import เครื่องมือคำนวณตัวเลขที่ชื่อ numpy

      ลองคำนวณ percentile ที่ 70 ดู ซึ่งเราใช้วิธีเรียกใช้ฟังก์ชันจาก Module ชื่อ numpy มาคำนวณ (เราสร้างฟังก์ชันเองก็ได้นะ) ซึ่งการคำนวณแปลกๆ แบบนี้ Pivot Table ธรรมดาใน Excel ทำไม่ได้ตรงๆ เช่นกันนะ ต้องใช้ Power Pivot ที่มี DAX Measure ถึงจะทำได้

      import numpy as np
      pd.pivot_table(myDataFrame,values='ยอดขาย', index=['สินค้า','วิธีการชำระเงิน'], columns=['ผู้ขาย'], aggfunc=lambda x: np.percentile(x, 70))
      หัด Python สำหรับคนเป็น Excel : ตอนที่ 6 – การเรียกใช้ Module / Packages เจ๋งๆ ที่มีคนสร้างไว้แล้ว 24

      ลอง Plot Graph ออกมาดูด้วย Matplotlib

      จริงๆ การ plot ไม่ได้ยุ่งมาก แต่ถ้าใช้ font ภาษาไทยจะยุ่งนิดนึง อาจต้อง import matplotlib และ install font ภาษาไทยด้วยดังนี้

      !wget https://github.com/Phonbopit/sarabun-webfont/raw/master/fonts/thsarabunnew-webfont.ttf
      # !pip install -U --pre matplotlib  
      import matplotlib as mpl
      import matplotlib.pyplot as plt
      mpl.font_manager.fontManager.addfont('thsarabunnew-webfont.ttf') # 3.2+
      mpl.rc('font', family='TH Sarabun New')

      จากนั้นก็ plot กราฟได้แล้ว ซึ่งผมจะลองวน loop เลือก filter data มา plot ทีละผู้ขาย ซึ่งขอยังไม่อธิบาย syntax เรื่องของการทำกราฟตอนนี้นะครับ

      for i in sorted(set(myDataFrame['ผู้ขาย'])):
          selectedSales= myDataFrame[myDataFrame['ผู้ขาย']==i]
        #myDataFrame['ผู้ขาย']==i ได้ T/F
          SalesAmtbyProduct=selectedSales.groupby('สินค้า')['ยอดขาย'].sum()
          SalesAmtbyProduct.plot(kind='bar',x='สินค้า',y='ยอดขาย',title=i)
          plt.show()
      หัด Python สำหรับคนเป็น Excel : ตอนที่ 6 – การเรียกใช้ Module / Packages เจ๋งๆ ที่มีคนสร้างไว้แล้ว 25

      ตอนต่อไป

      นี่ก็เป็นตัวอย่างเล็กๆ น้อยๆ ของการ import packages ต่างๆ มาใช้ ซึ่งจะเพิ่มความสามารถของโปรแกรมเราได้อีกมากมาย โดยเราไม่จำเป็นต้องเขียนความสามารถนั้นๆ ขึ้นมาเองเลย แค่คิดว่าในสถานการณ์นั้นๆ เราต้องการความช่วยเหลือด้านไหน ก็ไปหา packages ด้านนั้นมาแค่นั้นเอง (แต่ความยากคือ ต้องไปศึกษา syntax ของ packages นั้นๆ อีกอ่ะนะ)

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

      สารบัญ Series Python

      • หัด Python สำหรับคนเป็น Excel : ตอนที่ 5 – การสร้างฟังก์ชันขึ้นมาใช้เอง (Function)

        หัด Python สำหรับคนเป็น Excel : ตอนที่ 5 – การสร้างฟังก์ชันขึ้นมาใช้เอง (Function)

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

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

        การที่มีฟังก์ชันที่ทำงานได้ดั่งใจ ช่วยให้เราสามารถทำงานได้ง่ายขึ้นมากๆ ดังนั้นบทความนี้เราจะมาสร้างฟังก์ชันใช้เองกันครับ

        Function คืออะไร?

        ฟังก์ชันคือชุดคำสั่งที่จะทำงานเมื่อเราสั่งมัน โดยที่เราสามารถใส่ input เข้าไปใน Function แล้วมันจะทำงานแล้วสามารถคืนค่าผลลัพธ์เป็น Output ออกมาได้ด้วย (หรือจะทำงานเฉยๆ ไม่คืนค่าก็ได้)

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

        • ฟังก์ชัน LEN (text) สามารถนับจำนวนอักขระใน text ได้ว่ามีกี่ตัว
        • ฟังก์ชัน LEFT (text, [num_chars]) เอาไว้ดึงข้อความ text จากด้านซ้าย ตามจำนวนตัวอักษร num_chars ที่เราต้องการ
        • ฟังก์ชัน EDATE (start_date, months) เอาไว้เลื่อนวันจาก start_date ไปตามจำนวนเดือน months ที่ระบุ
        • ฟังก์ชัน NOW() เอาไว้แสดงวันที่และเวลาปัจจุบัน

        ฟังก์ชันแต่ละอันต้องการจำนวน input ไม่เท่ากัน เช่น EDATE กับ LEFT ต้องการ 2 ตัว, LEN ต้องการ 1 ตัว, ส่วน NOW ไม่ต้องการเลย นอกจากนั้น input บางตัวก็เป็นค่า optional คือจะระบุหรือไม่ก็ได้ เช่น [num_chars] ใน LEFT ถ้าไม่ระบุแปลว่าเอา 1 ตัวเป็นต้น

        ซึ่งใน Python เราก็สามารถสร้างฟังก์ชันที่ต้องการ input เข้าไปประมวลผลได้เหมือนกัน และทำให้ input เป็น optional หรือไม่ก็ได้ด้วย

        วิธีการสร้างฟังก์ชันใน Python

        เราสามารถสร้างฟังก์ชันได้ด้วยคำสั่งรูปแบบนี้ (ย่อหน้าข้างใน def สำคัญมาก เป็นตัวระบุว่าบรรทัดไหนคือส่วนของฟังก์ชัน)

        def ชื่อฟังก์ชัน():
          คำสั่งที่ต้องการให้ทำในฟังก์ชันนั้นๆ

        โดยที่สามารถระบุ input ได้ด้วยแบบนี้

        def ชื่อฟังก์ชัน(input1,input2):
          คำสั่งที่ต้องการให้ทำในฟังก์ชันนั้นๆ

        และสามารถกำหนดค่า default ของ input แต่ละตัวได้ด้วยการสั่งแบบนี้

        def ชื่อฟังก์ชัน(input1=def1,input2):
          คำสั่งที่ต้องการให้ทำในฟังก์ชันนั้นๆ

        นอกจากนั้นยังสามารถให้มันคืนค่าผลลัพธ์ออกมาได้เช่นกัน ด้วยคำสั่ง return แบบนี้

        def ชื่อฟังก์ชัน(input1=def1,input2):
          คำสั่งที่ต้องการให้ทำในฟังก์ชันนั้นๆ
          return ผลลัพธ์

        และเราสามารถเรียกใช้ฟังก์ชันนั้นๆ ได้โดยเรียกชื่อฟังก์ชันตามด้วย input ในวงเล็บ ซึ่งเหมือนกับการเรียกใช้สูตร Excel เลย

        มาดูตัวอย่างกันดีกว่าครับ

        ตัวอย่างการเขียนฟังก์ชัน

        Print ตามจำนวนครั้ง

        เริ่มจากตัวอย่างพื้นฐาน คือให้ print คำที่ระบุ ตามจำนวนครั้งที่ต้องการ โดยถ้าไม่ระบุจำนวนครั้งจะให้ print ครั้งเดียว ซึ่งผมจะตั้งชื่อฟังก์ชันว่า printX (เท่มะ?) สามารถทำได้ดังนี้

        def printX(text,num_time=1):  #สร้างฟังก์ชัน printX
          for i in range(num_time): #วน loop ตามจำนวนครั้งที่ระบุ
            print(text)
        
        printX("เทพมาก",3)  #เรียกใช้ฟังก์ชัน printX ที่สร้างไว้
        หัด Python สำหรับคนเป็น Excel : ตอนที่ 5 – การสร้างฟังก์ชันขึ้นมาใช้เอง (Function) 26

        เลียนแบบ LEFT ใน Excel

        ใน Python ไม่มีฟังก์ชัน LEFT เหมือน Excel แต่เราจะลองสร้างมันขึ้นมาใช้งานบ้าง ซึ่งทำได้ดังนี้

        def LEFT(text,num_chars=1): #สร้างฟังก์ชัน LEFT
          return text[:num_chars]
        
        print(LEFT("ThepExcel",4)) #เรียกใช้ฟังก์ชัน LEFT ที่สร้างไว้ แบบระบุ 4 ตัว
        print(LEFT("ThepExcel")) #เรียกใช้ฟังก์ชัน LEFT ที่สร้างไว้ แบบไม่ระบุจำนวน (default คือ 1)
        
        หัด Python สำหรับคนเป็น Excel : ตอนที่ 5 – การสร้างฟังก์ชันขึ้นมาใช้เอง (Function) 27

        เลียนแบบ TRIM ใน Excel

        TRIM ใน Excel สามารถ TRIM ช่องว่างตรงกลางได้ด้วย แต่ใน Python เอาตรงกลางไม่ออก (เอาออกแต่หน้าหลัง) เราก็สามารถสร้าง TRIM มาใช้เองใน Pythonได้ แต่จะทำให้เจ๋งขึ้นอีกคือระบุตัวอักขระที่จะ Trim ออกได้ด้วย และเอาตรงกลางออกได้ด้วย ดังนี้

        def TRIM(text,trim_char=" "): #สร้างฟังก์ชัน TRIM โดยให้ตัวที่จะ Trim เป็นเครื่องหมาย space
          list1=text.split(trim_char) #split แตก item ออกมาตามตัวคั่น
          print(list1)
          list2=[x for x in list1 if x!='']  #คัดเลือกเอา item ที่ไม่ใช่ช่องว่าง
          print(list2)
        
          #เอาข้อความใน list2 มาต่อกันด้วย trim_char เหมือนเดิมด้วย ตัวคั่น.join(list)
          outputText=trim_char.join(list2)  
          return outputText
        
        print(TRIM("  Thep    Excel   "))
        print(TRIM("...Thep.....Excel....","."))
        หัด Python สำหรับคนเป็น Excel : ตอนที่ 5 – การสร้างฟังก์ชันขึ้นมาใช้เอง (Function) 28

        เวลาใช้จริงก็ไม่ต้อง print step ระหว่างทางหรอก (อันนีั้นเราทำเพื่อตรวจสอบผลลัพธ์) ดังนั้นให้ comment ทิ้งไปเลยแบบนี้ก็ได้

        หัด Python สำหรับคนเป็น Excel : ตอนที่ 5 – การสร้างฟังก์ชันขึ้นมาใช้เอง (Function) 29

        ซึ่งแน่นอนว่าเราเอาฟังก์ชันที่สร้างไปใช้ประโยชน์ได้มากมาย เช่น เอาไปวน Loop ใน List เพื่อ clean ข้อมูลที่ต้องการก็ได้

        def TRIM(text,trim_char=" "): #สร้างฟังก์ชัน TRIM 
          list1=text.split(trim_char) 
          list2=[x for x in list1 if x!='']  
        
          outputText=trim_char.join(list2)  
          return outputText
        
        OriginalList=["  Thep    Excel   ","  Sira  Ekabut     "," Eren  Yeager "]
        FixedList=[TRIM(x) for x in OriginalList] #เรียกใช้ฟังก์ชันใน List Comprehension ก็ได้
        print(FixedList)
        หัด Python สำหรับคนเป็น Excel : ตอนที่ 5 – การสร้างฟังก์ชันขึ้นมาใช้เอง (Function) 30

        Recursion

        Python นั้นรองรับการสร้างฟังก์ชันที่เรียกใช้งานตัวเองได้ด้วย

        ยกตัวอย่างเช่น การสร้างการคำนวณ Factorial นั่นคือเอาเลขคูณกับตัวที่น้อยกว่าไปเรื่อยๆ จนถึง 1 (โดยที่ Factorial 0 มีค่าเป็น 1)

        def FACT(num): #สร้างฟังก์ชัน Factorial
          if num==0:
            return 1   #ถ้า FACT(0) ให้เป็น 1
          else:
            return num*FACT(num-1)  #นอกนั้นให้เอาเลขนั้น*FACT(เลขน้อยลง)
        
        print(FACT(0))  #คือ 1
        print(FACT(1))  #คือ 1*1
        print(FACT(2))  #คือ 2*1*1
        print(FACT(3))  #คือ 3*2*1*1
        print(FACT(4))  #คือ 4*3*2*1*1
        print(FACT(10))  #คือ 10*9*8*7*6*5*4*3*2*1*1
        หัด Python สำหรับคนเป็น Excel : ตอนที่ 5 – การสร้างฟังก์ชันขึ้นมาใช้เอง (Function) 31

        Lambda Function

        นอกจากการสร้างฟังก์ชันขึ้นมาแบบจริงจังด้วย def แล้ว ใน Python ยังยอมให้เราสร้างสิ่งที่เรียกว่า Lambda Function (เป็น Anonymous Function หรือฟังก์ชันที่ไม่จำเป็นต้องมีชื่อ ) ขึ้นมาด้วย ซึ่งมันเป็นเหมือนการสร้างฟังก์ชันย่อมๆ ที่มี expression ได้แค่อันเดียว แต่จะมี input กี่ตัวก็ได้ ในรูปแบบ

        lambda input1,input2,input3,... : expression

        เช่น

        myFunc=lambda a,b,c : (a*b)+c
        print(myFunc(2,3,4))
        หัด Python สำหรับคนเป็น Excel : ตอนที่ 5 – การสร้างฟังก์ชันขึ้นมาใช้เอง (Function) 32

        มีค่าเท่ากับการทำแบบนี้เลย

        หัด Python สำหรับคนเป็น Excel : ตอนที่ 5 – การสร้างฟังก์ชันขึ้นมาใช้เอง (Function) 33

        ตอนต่อไป

        ในที่สุดเราก็สามารถสร้างฟังก์ชันขึ้นมาใช้เองได้แล้ว แต่จะดีกว่ามั้ยถ้าเราจะใช้ฟังก์ชัน/ความสามารถเจ๋งๆ ที่คนอื่นได้สร้างไว้แล้วเต็ม internet เลย? ในตอนหน้าเราจะมาพูดถึงการใช้ Module/Packages กันครับ! นี่แหละสิ่งที่ทรงพลังที่สุดในความคิดของผม รอติดตามได้เลย เจ๋งแน่นอน

        สารบัญ Series Python

        • รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง

          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง

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

          บอกไว้ก่อนว่าการที่เกิดสูตรพิศดารแบบนี้เพราะ Excel ดันยังไม่มีฟังก์ชันเจ๋งๆ ให้ใช้ได้แบบตรงไปตรงมาเหมือนของ Google Sheets น่ะสิ หึ!!

          แต่อย่าลืมว่าในชีวิตจริงเราไม่จำเป็นต้องแก้ปัญหาด้วยสูตรเสมอไป ปัญหาทุกข้อที่ผมเอามาเขียนในบทความนี้ สามารถแก้ได้ง่ายๆด้วย Power Query ของ Excel ด้วยซ้ำ แต่ในบางครั้งเราต้องการให้ได้ผลลัพธ์ทันที (รวมถึงต้องการผูกกับ Conditional Format, Data Validation, หรือไม่ก็เพื่อฝึกสมอง 555) ก็เลยต้องเขียนเป็นสูตรออกมา

          เทคนิคหัวใจหลักของสูตรในบทความนี้ ผมไม่ได้เป็นคนคิดเอง แต่มาจากการเห็นคนเก่ง Excel ท่านอื่นใช้มัน โดยเฉพาะ คุณโบ Excel Wizard ซึ่งเอาสูตรเจ๋งๆ มาเผยแพร่เพียบเลย (หลายสูตรก็เห็นมาจากชาวต่างชาติเก่งๆ อีกที เรียกได้ว่ารวมสุดยอดเทคนิค)

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

          สูตรดึงข้อความที่มีตัวคั่นหลายตัว

          ปกติแล้วถ้าเรามีข้อมูลที่มีตัวคั่นหลายตัว การแยกด้วยสูตรจะค่อนข้างยุ่งยาก เพราะถ้าคิดแบบตรงไปตรงมาคือต้องค่อยๆ หาตำแหน่งของตัวคั่นแต่ละตัวให้ได้ก่อนแล้วตัดคำที่ต้องการออกมา ซึ่งวิธีที่ผมเคยใช้ในอดีตคือใช้ SUBSTITUTE แทนที่ช่องว่างลำดับต่างๆ ด้วยตัวประหลาดๆ แล้วค่อยหาตำแหน่งของตัวประหลาดนั้นๆ อีกทีด้วย FIND ซึ่งจะค่อนข้างยุ่งยาก (ถ้าใน Google Sheets ใช้ SPLIT, หรือใน Power Query ก็มี Split เช่นกัน ก็จบละ)

          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 34

          ซึ่งจะเห็นว่าสูตรดูยุ่งยากมากจริงๆ ดังนั้นมาดูอีกเทคนิคนึงที่เจ๋งมากๆ เลยนั่นก็คือ แทนที่ช่องว่างด้วยช่องว่างเยอะๆ (เมื่อเทียบกับข้อความ) ไปเลย เช่น 20 ตัว แล้วค่อยตัดเลือกสิ่งที่ต้องการมา แล้วค่อย TRIM เอาช่องว่างออกไป

          ซึ่งสรุปแล้วสามารถเขียนสูตรได้แบบนี้ ซึ้งสั้นกว่าเยอะ ใช้ง่ายด้วย แต่มีความลึกซึ้ง

          =TRIM(MID(SUBSTITUTE(ข้อความ," ",REPT(" ",เลขเยอะ)),เลขเยอะ*(ลำดับ-1),เลขเยอะ))
          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 35

          ใครสนใจรายละเอียดเทคนิคนี้ ลองดูคลิปของ Excel Wizard ได้ครับ (ใช้แยกที่อยู่ ดีมากๆ)

          นอกจากวิธีนี้แล้ว เรายังสามารถใช้ฟังก์ชัน FILTERXML มาช่วยเลือกเอา item ลำดับที่ต้องการได้ด้วย รายละเอียดอยู่ใน section หลังครับ

          สูตรแยกข้อมูลออกมาทีละอักขระ แล้วคัดเอาตัวที่ต้องการ

          การทำงานแบบนี้ ถ้าจะทำง่ายๆ ใน Excel ก็สามารถทำได้ด้วย Flash Fill หรือไม่ก็ Text.Select ของ Power Query แต่ถ้าเราจะเขียนด้วยสูตรจริงๆ ล่ะ จะทำไงดี?

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

          =MID(text,start_num,num_chars)

          โดยใส่ข้อมูลใน start_num แบบ Array เป็นเลขลำดับได้ โดยจะใช้ SEQUENCE หรือพวก ROW สร้างขึ้นมาก็ได้

          ถ้ามี SEQUENCE ให้ใช้ (Excel 365)

          MID(ข้อความ,SEQUENCE(LEN(ข้อความ)),1)

          ถ้าไม่มี SEQUENCE

          MID(ข้อความ,ROW($A$1:$A$เลขเยอะๆ),1)

          เท่านี้เราจะสามารถแยกข้อความออกมาทีละอักระได้แล้ว

          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 36

          คราวนี้เราสามารถคัดเลือกเฉพาะสิ่งที่ต้องการได้ แล้วค่อยเอามารวมกันด้วย CONCAT หรือ TEXTJOIN (ต้องมี Excel ใหม่ๆ)

          สมมติผมอยากได้เฉพาะภาษาไทยเท่านั้น ผมก็สามารถเขียนเงื่อนไขว่าถ้าเป็นภาษาไทยให้เก็บไว้ ถ้าไม่ใช่ให้เป็น “” (blank text) ไป ซึ่งสามารถใช้ CODE() มาช่วยเช็คได้ ซึ่งตัวเลข ตัวหนังสือ แต่ละอันจะมี Code ต่างกัน เช่น ถ้าอยากได้แต่ภาษาไทย code >=161 ก็น่าจะพอ

          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 37

          แต่ถ้าจะเอา space กับ . ด้วย ผมอาจเช็คว่า ต้องมี code >=161 หรือ <=46 (คราวนี้ขอใช้ LET เพื่อจะได้ไม่ต้องเขียนสูตรเดิมๆ ซ้ำหลายรอบ แต่ถ้าไม่มีก็สามารถเขียนซ้ำๆ ได้นะ)

          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 38

          จากนั้นค่อยใช้ CONCAT หรือ TEXTJOIN มาเชื่อมก็ได้ แล้วเอา TRIM ครอบอีกที ดังนี้

          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 39

          สูตรดึงข้อมูลเฉพาะตัวเลขด้วย NPV

          การที่เราได้ข้อมูลที่ปนมาทั้งตัวหนังสือและตัวเลข แล้วเราต้องการเฉพาะตัวเลขนั้น ถ้าแก้ปัญหาด้วย Logic ปกติ ก็อาจจะพยายามแยกอักขระแต่ละตัวมาพิจารณา แล้วคัดเลือกเอาไว้เฉพาะ 0-9 เท่านั้น คล้ายๆ วิธีในข้อข้างบน

          แต่หากทำด้วยท่าพิศดาร ปรากฏว่ามันสามารถใช้ฟังก์ชันทางการเงินที่ชื่อว่า NPV (Net Present Value) มาช่วยได้เฉยเลย และดีกว่าวิธีข้างบนตรงที่ไม่จำเป็นต้องใช้ Excel365 ด้วย (ไม่จำเป็นต้องมี CONCAT หรือ TEXTJOIN) ซึ่งทำได้ดังนี้

          =NPV(9,ช่วงข้องมูล)*10^COUNT(ช่วงข้อมูล)

          โดยที่ถ้าข้อมูลปนกันมาใน Cell เดียวเลย จะยากขึ้น คือต้องใช้สูตรแตกอักระออกมาให้ได้ก่อน (เหมือนหัวข้อที่แล้ว) แล้วค่อยใช้ NPV ดังนี้

          =NPV(9,IFERROR(--MID(ข้อความ,ROW($A$1:$A$เลขเยอะๆ),1),""))
          *10^COUNT(--MID(ข้อความ,ROW($A$1:$A$เลขเยอะๆ),1))
          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 40

          แล้วสูตรการเงินแบบ NPV ทำแบบนี้ได้อย่างไร??

          สิ่งที่สูตร NPV ทำคือเอาตัวเลขแต่ละตัวไปหารด้วย (1+อัตราดอกเบี้ย)^งวด ซึ่งเป็นการ Discount มูลค่าเงินตามกาลเวลามาอยู่ที่ปัจจุบันนั่นเอง

          ซึ่งพอเราพลิกแพลงใส่อัตราดอกเบี้ยเป็นเลข 9 (ดอกเบี้ย 900%) มันจะได้เป็นเอาแต่ละตัวไปหารด้วย (1+9)^งวด หรือ 10^งวดนั่นเอง จะได้แบบนี้ ตอนแรกมันจะออกมาเป็นทศนิยม ถ้าต้องการทำเป็นเลขปกติ เราแค่เอาไปคูณ 10^จำนวนตัวเลข ก็จะได้ผลตามต้องการแล้วล่ะ

          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 41

          ใครสนใจรายละเอียดเทคนิคนี้ ลองดูคลิปของ Excel Wizard ได้ครับ

          ดึงข้อมูลเลขที่มีจุดทศนิยมปนอยู่

          ในเคสนี้ เราจะใช้สูตร NPV จะใช้ตรงๆ ไม่ได้ เพราะมันจะสนแค่ตัวเลขอย่างเดียว

          ทางแก้นึงที่ทำได้ (หากดึงดันว่ายังจะใช้ NPV ต่อไป) ก็คือ เปลี่ยนทศนิยมเป็นเลขประหลาดๆ ซักชุดนึง แล้วค่อยเปลี่ยนกลับเป็น . ทีหลัง เช่น

          =--SUBSTITUTE(
          NPV(9,IFERROR(--MID(SUBSTITUTE(ข้อความ,".","เลขประหลาด"),ROW($A$1:$A$เลขเยอะ),1),""))
          *10^COUNT(--MID(SUBSTITUTE(ข้อความ,".","เลขประหลาด"),ROW($A$1:$A$เลขเยอะ),1)),
          "เลขประหลาด",".")
          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 42

          อย่างไรก็ตาม ถ้ามีจุดทศนิยมด้วยแบบนี้ ทางคุณโบแนะนำว่าใช้วิธีพิศดารอีกอันดีกว่า (แต่ก็โคตรลึกซึ้งนะ) ซึ่งก็คือวิธีนี้ครับ

          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 43

          พอรวบสูตรแล้วจะเป็นแบบนี้

          =-LOOKUP(0,-MID(ข้อความ,MIN(FIND({0,1,2,3,4,5,6,7,8,9},ข้อความ&"0123456789")),{1,2,3,4,5,6,7,8,9,10,11,12}))

          โดยที่สามารถทำให้สั้นลงได้อีก เป็นแบบนี้ (มันคือเรื่องเดียวกัน)

          =-LOOKUP(0,-MID(A2,MIN(FIND(ROW($A$1:$A$10)-1,A2&1/17)),ROW($A$1:$A$เลขเยอะๆ)))
          • {0,1,2,3,4,5,6,7,8,9} ทดแทนได้ด้วย ROW($A$1:$A$10)-1 หรือแทนด้วย {0,1,2,3,4}+{0;5} ก็ได้
            รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 44
          • {1,2,3,4,5,6,7,8,9,10,11,12,…} ทดแทนได้ด้วย ROW($A$1:$A$เลขเยอะๆ)
          • &”0123456789″ ทดแทนได้ด้วย &1/17
            • เพราะว่า 1/17 จะได้เลขครบตั้งแต่ 0-9 เลย คือ 0.0588235294117647 (เหอๆ ใครคิดมาเนี่ย…)

          ใครสนใจรายละเอียดเทคนิคนี้ ลองดูคลิปของ Excel Wizard ได้ครับ

          Append ข้อมูลด้วยสูตร FILTERXML

          สิ่งนึงที่สูตร Excel ยังทำได้ค่อนข้างลำบาก ทั้งๆ ที่เป็นเรื่องที่ควรทำได้ง่ายๆ ก็คือการเอาข้อมูล 2 ตารางมาต่อแถวกันด้วยสูตร ซึ่งถ้าใช้ Power Query ก็จะมีคำสั่ง Append Query ให้ทำได้แบบชิลๆ เลย หรือถ้าเป็นใน DAX ก็จะมี UNION ให้ใช้แบบสบายๆ เช่นกัน

          แต่ใน Excel ดันไม่มีวิธี Append ที่ง่ายๆ เลย นอกจากการประยุกต์เอาฟังก์ชัน FILTERXML มาใช้

          ทำความรู้จัก FILTERXML

          ปกติแล้วฟังก์ชัน FILTERXML เอาไว้ใช้งานกับข้อมูล XML หรือแม้แต่ HTML บนเว็บไซต์ซึ่งจะมี Tag เปิด ปิด แต่ละ Element ที่เป็นองค์ประกอบของเว็บนั้นๆ อยู่ด้วย ซึ่งจะมีวิธีการเขียนประมาณนี้ ซึ่งสังเกตว่าจะมีการเปิด และปิด tag ด้วย

          <tag>ข้อมูล</tag>

          ซึ่งเราสามารถใส่ tag ต่างๆ ซ้อนกันได้เรื่อยๆ เช่น

          <tagA>ข้อมูลอะไรซักอย่าง
          <tagB>ข้อมูล1</tagB>
          <tagB>ข้อมูล2</tagB>
          <tagB>ข้อมูล3</tagB>
          </tagA>

          เจ้าฟังก์ชัน FILTERXML นั้น สามารถคัดเลือกเอาข้อมูลเฉพาะใน tag ที่ต้องการได้ โดยระบุเข้าไปใน xpath ของสูตร FILTERXML

          FILTERXML(xml, xpath)

          จริงๆ แล้ว xpath สามารถกำหนดเงื่อนไขได้มากมาย (ลองดูได้ที่นี่) แต่ถ้าเอาแบบง่ายสุด หากเราต้องการ tag ที่ชื่อว่า tagB ก็เขียน xpath แบบนี้ได้เลย “//tagB”

          เช่น ถ้าเรามีข้อมูล xml แบบนี้ในช่อง A1

          <ThepExcelCourse>
          <Course>
              <name>Excel Level Up</name>
              <topic>All Foundations</topic>
              <level>1</level>
          </Course>
          <Course>
              <name>Excel Power Up</name>
              <topic>Power Query</topic>
              <level>2</level>
          </Course>
          <Course>
              <name>Powerful Data with Power BI</name>
              <topic>Power BI</topic>
              <level>2</level>
          </Course>
          </ThepExcelCourse>

          เราจะดึงองค์ประกอบแต่ละส่วนได้แบบนี้เลย ซึ่งจะเห็นว่ามี tag ย่อยชื่อว่า name, topic, level ให้เราสามารถดึงได้

          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 45

          วิธีที่เหมาะกับ Append คอลัมน์เดียว

          แบบง่าย คือ Append ข้อมูลที่มีแค่คอลัมน์เดียว เช่นแบบนี้

          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 46

          ซึ่งรวบสูตรได้เป็นแบบนี้

          =FILTERXML("<a><b>"&TEXTJOIN("</b><b>",TRUE,A1:A4,C1:C3)&"</b></a>","//b")

          สามารถเขียนในรูปทั่วไปได้ว่า

          =FILTERXML("<a><b>"&TEXTJOIN("</b><b>",TRUE,Range1,Range2,Range3...)&"</b></a>","//b")

          วิธี Append หลายคอลัมน์ ทำได้หลายแบบ

          ใช้ CHOOSE (เหมาะกับคอลัมน์แค่ 2)

          ถ้ามีแค่ 2 คอลัมน์ เราจะใช้วิธีคล้ายเดิม แต่ผสมกับ CHOOSE อีกทีเพื่อทำการรวม 2 คอลัมน์เข้าด้วยกัน ตามนี้

          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 47

          ถ้ารวบสูตรก็จะได้ประมาณนี้

          =LET(
          range1,A1:B4,
          range2,A6:B8,
          Mycol1,FILTERXML("<a><b>"&TEXTJOIN("</b><b>",TRUE,INDEX(range1,0,1),INDEX(range2,0,1))&"</b></a>","//b"),
          Mycol2,FILTERXML("<a><b>"&TEXTJOIN("</b><b>",TRUE,INDEX(range1,0,2),INDEX(range2,0,2))&"</b></a>","//b"),
          CHOOSE({1,2},Mycol1,Mycol2))

          ใช้ INDEX+SEQUENCE (วิธีนี้ใช้ได้กับกี่คอลัมน์ก็ได้)

          แต่ถ้าจำนวนคอลัมน์มากกว่านี้ ผมแนะนำวิธีของคุณโบ Excel Wizard ซึ่งรองรับหลายคอลัมน์ (แต่จำนวนแถวอาจจะได้แค่ประมาณหลักร้อยบรรทัด เพราะติดข้อจำกัดการเก็บข้อมูล text ของ Excel)

          ซึ่งของคุณโบทำได้ด้วยวิธีนี้ (ผมมีดัดแปลงตอนจบนิดหน่อย ให้เปลี่ยน range ได้สะดวกขึ้น)

          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 48

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

          =LET(range1,A1:C4,
          range2,A6:C8,
          INDEX(FILTERXML("<a><b>"&TEXTJOIN("</b><b>",TRUE,range1,range2)&"</b></a>","//b"),SEQUENCE(COUNTA(INDEX(range1,0,1),INDEX(range2,0,1)),COUNTA(INDEX(range1,1,0)))))
          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 49

          ใครสนใจรายละเอียดเทคนิคนี้ ลองดูคลิปของ Excel Wizard ได้ครับ

          วิธีใช้ FILTERXML เลือก item ตัวที่ต้องการ

          จริงๆ แล้วเราสามารถใช้ FILTERXML ให้ได้ผลลัพธ์ทุกตัว แล้วใช้ INDEX เลือกเอาตัวที่ต้องการมาอีกทีก็ได้ แต่มันยุ่งยากไปวิธีที่ดีกว่าคือใส่ xpath ให้เอาตัวนั้นๆ กลับมาให้เราเลย

          เราสามารถใส่ xpath ว่า //tag[ลำดับitem] เพื่อดึงเอาเฉพาะ item ลำดับที่ต้องการได้เลย แปลว่าสามารถใช้แทนวิธีแทนด้วยช่องว่างเยอะๆ ได้ทันทีครับ

          รวมสูตร Excel พิศดาร แปลกจริง เจ๋งจัง 50

          จบแล้ว

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

        • หัด Python สำหรับคนเป็น Excel : ตอนที่ 4 – การทำงานกับ String และ List

          หัด Python สำหรับคนเป็น Excel : ตอนที่ 4 – การทำงานกับ String และ List

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

          คำสั่งพื้นฐานที่ใช้กับ String

          • นับข้อมูล
            • len(myString) เพื่อนับว่ามีกี่อักขระ (นี่เหมือน LEN ใน Excel )
          • จัดการพิมพ์เล็กพิมพ์ใหญ่
            • myString.lower() ทำเป็นตัวพิมพ์เล็ก (นี่ก็เหมือน LOWER ใน Excel)
            • myString.upper() ทำเป็นตัวพิมพ์ใหญ่ (นี่ก็เหมือน UPPER ใน Excel)
          • ค้นหาข้อมูล
            • “ra” in myString หาว่ามีคำว่า ra หรือไม่ โดยให้ผลเป็น True/False (อันนี้ Excel ไม่มี)
            • myString.find(“ra”) หาว่ามีคำว่า ra อยู่ index ไหน (เริ่มที่ 0) ถ้าหาไม่เจอจะได้ค่า -1 (อันนี้เหมือน FIND ใน excel)
            • myString.find(“ra”,3,9) หาว่ามีคำว่า ra อยู่ index ไหน โดยเริ่มหาตั้งแต่ index 3 แต่ไม่ถึง 9 ถ้าหาไม่เจอจะได้ค่า -1
          • กำจัดส่วนเกิน
            • myString.strip() ตัดช่องว่างด้านหน้าและหลังออกทั้งหมด (คล้าย TRIM ใน Excel แต่ strip ตัดแค่หน้าหลัง แต่ TRIM ทำให้ตรงกลางเหลือเคาะเดียวด้วย)
            • myString.strip(“. /,”) ตัด character ที่ระบุ (dot space slash comma )ด้านหน้าและหลังออกทั้งหมด
              หัด Python สำหรับคนเป็น Excel : ตอนที่ 4 – การทำงานกับ String และ List 51
          • แยกส่วนคำ
            • myString.split() แยกคำออกเป็น list ด้วยตัวแบ่งคือ space โดยแยกไม่จำกัดครั้ง
            • myString.split(“/”, 1) แยกคำออกเป็น list ด้วยตัวแบ่งคือ / โดยแยกแค่ 1 ครั้ง (กลายเป็น 2 item)
            • ถ้าเอาบางส่วนของข้อความ ให้ใช้การ slice index เอา เช่น myString[0:3] คือเอา 3 ตัวแรก (คล้าย LEFT)

          คำสั่ง format

          ปกติแล้ว หากเราจะเชื่อมตัวเลขกับข้อความด้วย + มันจะโวยวายทันที เพราะเป็นข้อมูลคนละประเภทกัน…
          แต่ถ้าเราใช้ format มาช่วย ทุกอย่างจะง่ายขึ้นมาก เช่น

          name = "Sira"
          age = 37
          weight = 68
          height = 170
          txt = "ผมชื่อ {} ตอนนี้อายุ {} ปี .. หนัก {} kg สูง {} cm"
          print(txt.format(name,age,weight,height))
          หัด Python สำหรับคนเป็น Excel : ตอนที่ 4 – การทำงานกับ String และ List 52

          คำสั่งพื้นฐานที่ใช้กับ List

          อันนี้อาจจะไม่ค่อยเหมือนใน Excel เท่าไหร่เนอะ มาดูกันว่ามีอะไรบ้าง

          • นับข้อมูล
            • len(myList) คือ นับจำนวน item ใน list
            • myList.count(“Eren”) รับคำว่า Eren ใน list ว่ามีกี่ตัว
          • การเพิ่มข้อมูล
            • myList.append(“Sira”) คือ เพิ่มคำว่า Sira เข้าไปต่อท้าย list
            • myList.insert(1, “Sira”) คือ เพิ่มคำว่า Sira เข้าไปที่ index ที่ 1 (กลายเป็นตัวที่ 2)
            • myList.extend(anotherList) เพิ่ม item ใน List อีกอันคือ anotherList เข้าไปต่อท้าย myList
              • นอกจาก extend แล้ว จะใช้เครื่องหมาย + ไปเลยก็ยังได้ เช่น myList + anotherList ซึ่งเขียนง่ายกว่า
          • ลบข้อมูล
            • myList.remove(“Sira”) คือ ลบคำว่า Sira ออกจาก List (เอาออกทีละตัว จากตัวแรกไปตัวหลัง)
            • myList.pop(1) คือ เอา item ที่อยู่ index 1 ออกไป (ถ้าไม่ระบุ index จะเอาตัวสุดท้ายออกไป)
          • เรียงข้อมูล
            • myList.sort() คือ เรียงข้อมูลใน list จากน้อยไปมาก (สนใจพิมพ์เล็กพิมพ์ใหญ่)
            • myList.sort(key = str.lower) เรียงจากน้อยไปมาก (ไม่สนใจพิมพ์เล็กพิมพ์ใหญ่ เพราะทำให้เป็นตัวพิมพ์เล็กแล้ว)
            • myList.sort(reverse = True) คือ เรียงข้อมูลใน list จากมากไปน้อย (สนใจพิมพ์เล็กพิมพ์ใหญ่)
            • mylist.reverse() = เรียงกลับด้านจาก list ดั้งเดิม
          • รวมข้อมูลใน List ด้วยตัวคั่น
            • ตัวคั่น.join(list) คือ รวมข้อมูลใน List ให้กลายเป็น string คำเดียว โดยคั่นด้วยตัวคั่นที่ระบุ คล้ายๆ กับ TEXTJOIN ใน Excel เลย

          ลองเอามาประยุกต์กับการ Loop

          พอเราเริ่มรู้คำสั่งต่างๆ ในการทำงานกับ String และList พอผนวกกับเรื่องวน Loop และ if เราก็จะทำเรื่องต่างๆ ได้มากขึ้น เช่น

          ถ้าใน list มีคำที่ไม่มีตัว i ให้ลบทิ้งด้วย remove ซะ โดยใช้ for loop และ if ช่วยเช็คเงื่อนไขที่ต้องการก็ได้

          myList = ["Eren", "Mikasa", "Armin", "Levi"]
          for x in myList:
            if "i" not in x: #ถ้าคำนั้นไม่มีตัว i
              myList.remove(x)  # ให้ลบคำนั้นซะ
          print (myList)
          หัด Python สำหรับคนเป็น Excel : ตอนที่ 4 – การทำงานกับ String และ List 53

          ใช้ for loop ทำให้ข้อมูลใน List เป็นตัวพิมพ์ใหญ่ทั้งหมด ด้วย upper() โดยเอาผลลัพธ์ไปสร้างเป็น List ใหม่อีกอันนึงด้วย append

          myList = ["Eren", "Mikasa", "Armin", "Levi"]
          NewList=[]  #สร้าง List ว่างเปล่า
          for x in myList:
            NewList.append(x.upper()) #ทำให้ item เป็นตัวพิมพ์ใหญ่ แล้วใส่ต่อท้ายเข้าไปใน list ใหม่
          print (NewList)
          หัด Python สำหรับคนเป็น Excel : ตอนที่ 4 – การทำงานกับ String และ List 54

          หรือจะใช้ผสมกับเงื่อนไข if ก็ได้ เช่น จะเอาไปเป็น item ใน List ใหม่เฉพาะ item ที่มีตัว i อยู่เท่านั้น

          myList = ["Eren", "Mikasa", "Armin", "Levi"]
          NewList=[]  
          for x in myList:
            if "i" in x:  #ใส่เงื่อนไขว่าเอาเฉพาะที่มีตัว i
              NewList.append(x.upper()) 
          print (NewList)
          หัด Python สำหรับคนเป็น Excel : ตอนที่ 4 – การทำงานกับ String และ List 55

          เรื่องของเรื่องคือ หากเราต้องการสร้าง List ใหม่จาก List เดิม นอกจากจะเขียนด้วยวิธีใช้ for loop แล้ว ยังมีอีกวิธีที่ทำได้ และเขียน Code ได้สั้นและกระชับกว่า นั่นก็คือ วิธีที่เรียกว่า List Comprehension

          List Comprehension

          List Comprehension มีวิธีการเขียนดังนี้

          [expression for item in list if condition]   #ส่วน if condition ไม่ใส่ก็ได้

          เช่น ในตัวอย่างการแปลงเป็นตัวพิมพ์ใหญ่ เราสามารถเขียนสูตรสั้นๆ แบบนี้ได้เลย

          myList = ["Eren", "Mikasa", "Armin", "Levi"]
          NewList=[x.upper() for x in myList]  #List Comprehension
          print (NewList)
          python list comprehension

          หรือ ถ้าจะเอาเฉพาะที่มีตัว i เราก็ไปใส่เงื่อนไขใน if condition ได้เลย

          myList = ["Eren", "Mikasa", "Armin", "Levi"]
          NewList=[x.upper() for x in myList if "i" in x]  #List Comprehension แบบมีเงื่อนไข
          print (NewList)
          หัด Python สำหรับคนเป็น Excel : ตอนที่ 4 – การทำงานกับ String และ List 56

          แต่ถ้ากรณีมีเงื่อนไข else ด้วย จะเขียนอีกลักษณะนึง คือ เอา if else ขึ้นมาก่อน ดังนี้

          [expression_if_true if condition else expression_if_false for item in list ]   

          เช่น ถ้ามี i ให้ทำ upper ถ้าไม่มี i ให้ทำ lower

          myList = ["Eren", "Mikasa", "Armin", "Levi"]
          #List Comprehension แบบมี if else
          NewList=[ x.upper() if "i" in x else x.lower() for x in myList ]  
          print (NewList)
          หัด Python สำหรับคนเป็น Excel : ตอนที่ 4 – การทำงานกับ String และ List 57

          ลองดูตัวอย่างการผสมผสานหลายๆ เรื่อง เช่น Split คำจากประโยคยาวๆ แล้วเอามาเฉพาะคำที่มีตัว e แบบ trim . ดูบ้าง

          วิธีการอ้างอิงข้อความยาวๆ แบบชัวร์ๆ คือใส่ใน Quote 3 ชั้น ดังนี้ (เอาประโยคมาจาก Wiki ของคำว่า Excel)

          myParagraph = '''Microsoft Excel is a spreadsheet developed by Microsoft for Windows, macOS, Android and iOS. 
          It features calculation, graphing tools, pivot tables, and a macro programming language called Visual Basic for Applications. 
          It has been a very widely applied spreadsheet for these platforms, especially since version 5 in 1993, 
          and it has replaced Lotus 1-2-3 as the industry standard for spreadsheets. 
          Excel forms part of the Microsoft Office suite of software.'''
          
          myList=myParagraph.split() #แยกคำด้วยช่องว่าง
          print(myList)
          print(len(myList))
          selectedWord=[x.strip(".") for x in myList if "e" in x.lower()] #เอาที่มีตัว e และตัด . หัวท้ายออก
          print(selectedWord)
          print(len(selectedWord))
          หัด Python สำหรับคนเป็น Excel : ตอนที่ 4 – การทำงานกับ String และ List 58

          หวังว่าๆ เพื่อนๆ คงจะพอเห็นภาพการทำงานกับ String และ List มากขึ้นนะครับ

          ตอนต่อไป

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

          สารบัญ Series Python

          • มหากาพย์เปรียบเทียบ Excel vs Power BI + แนะนำ Power Query, DAX, Data Model

            มหากาพย์เปรียบเทียบ Excel vs Power BI + แนะนำ Power Query, DAX, Data Model

            สมมติว่าให้ทุกคนลองจินตนาการว่าโลกแห่งการทำงานด้วย Excel เป็นเกมแนวผจญภัยสู้ Monster ที่เราสู้และเก่งขึ้นเรื่อยๆ ( เช่น เกมแนว RPG, MOBA) ปัญหาต่างๆ ที่เราต้องเจอก็เป็นเหมือน Monster ที่เราต้องกำจัด ต้องฝ่าฟัน เพื่อจะเก็บประสบการณ์จน Level Up ได้มีความสามารถที่เก่งขึ้นจนปราบปัญหาใหญ่ระดับ Boss ได้ ซึ่งนี่ก็เป็น Concept ที่ผมเคยพูดถึงไว้ในหนังสือ Excel Level Up นั่นเอง

            เมื่อเวลาผ่านไปหลายปี ตอนนี้เกมที่พวกเราเล่นได้ถูกอัปเดท Patch ใหม่แล้ว พวก Monster ที่เราต้องเจอมันโหดร้ายขึ้นมาก ตัวใหญ่ขึ้น ซับซ้อนขึ้น… มี Monster ระดับที่เรียกว่า Big Data เริ่มโผล่มาอาละวาดแล้ว (ไม่ว่าคุณจะรู้ตัวหรือไม่ก็ตาม)

            เพื่อให้สู้กับ Monster ที่แข็งแกร่งขึ้นได้ ตัวละคร Excel จึงได้รับการบัฟความสามารถเพิ่มขึ้นมากมาย แถมยังให้อาวุธใหม่อย่าง Power Query/DAX/Data Model และให้เราสามารถเลือกใช้ Hero หรือตัวละครใหม่อย่าง Power BI ได้ด้วย

            ปัญหาก็คือ หลายคนไม่รู้ว่า Hero เก่าอย่าง Excel ถนัดอะไร? Hero ใหม่อย่าง Power BI ทำอะไรได้บ้าง? และอาวุธอย่าง Power Query/DAX/Data Model คืออะไร? ซึ่งน่าเสียดายมากๆ (เอาจริงๆ แค่ Excel เดิมทำอะไรได้บ้าง ยังรู้ไม่หมดเลย ยังจะมีของใหม่อีกเนอะ เหอๆ)

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

            เพื่อไม่ให้เสียเวลามาเริ่มกันเลย!

            ความสามารถเด่นๆ ของ Excel

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

            คนใช้ Excel เก่งๆ สามารถสร้า่งผลงานที่หลากหลาย ใช้ทำรายงาน Dashboard แสดงผลลัพธ์เป็นตาราง หรือจะสร้างเป็นกราฟก็ย่อมได้ หรือจะสร้างแบบฟอร์ม สร้างรายงานให้พิมพ์ออกมาก็ได้ อีกทั้งยังสร้าง Model การเงินต่างๆ, ทำ Simulation, ทำ Optimization ได้แบบสบา่ยๆ

            การทำงานใน Excel บางเรื่องก็ง่าย บางเรื่องก็ยาก หลายเรื่องก็เป็นเรื่องที่ง่ายมาก และเจ๋งมาก แต่หลายคนไม่รู้ เช่น

            • ฟังก์ชัน TRIM : ตัดช่องว่างหน้าคำและหลังคำ ทั้งหมดออก และเว้นวรรคตรงกลางจะทำให้เหลือ 1 เคาะ เป็นมาตรฐานเดียวกัน
            • Flash Fill : สามารถเลียนแบบตัวอย่างที่เราพิมพ์ลงไปได้เลยอย่างน่าอัศจรรย์
            • ค่าที่แท้จริงของวันที่และเวลา : จริงๆ แล้ววันที่คือจำนวนเต็ม เวลาคือทศนิยม และการกรอกขึ้นกับการตั้งค่า Region
            • Table : สามารถงอกตัวเองเพื่อรองรับข้อมูลใหม่ๆ ที่กรอกได้ทันที และใส่สูตรให้เองทุกบรรทัด
            • Conditional Format : ระบายสีแบบอัตโนมัติตามเงื่อนไข
            • Dynamic Textbox/ชื่อกราฟ : เลือก Textbox/ชื่อกราฟ แล้วไปช่องใส่สูตร ใส่ = แล้วจิ้ม Cell ที่ต้องการแล้วกด Enter
            • เปลี่ยน Format แบบ Custom : เราเปลี่ยนหน้าตาตัวเลขได้อย่างอิสระ และทำเป็น Text จริงๆ ได้ด้วย ซึ่งมีประโยชน์เยอะมาก
            • Goal Seek / Solver : ช่วยลอง Trial & Error จนกว่าเราจะได้ผลลัพธ์ตามต้องการ

            สำหรับผม Pivot Table คือสุดยอด

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

            จากข้อมูลดิบที่ดูไม่รู้เรื่อง ใช้เวลาไม่ถึง 1 นาที ก็สามารถถูกเนรมิตให้กลายเป็นตารางสรุป พร้อมกับกราฟ และปุ่ม Slicer ที่สามารถควบคุม Pivot Table หลายๆตารางได้พร้อมกัน เพื่อสร้าง Interactive Dashboard ได้อย่างง่ายดาย

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

            ปัญหาของ Pivot Table แบบดั้งเดิม

            อย่างไรก็ตาม ปัญหาของคนทำ Excel ยุคก่อน ก็หนีไม่พ้นการเตรียมข้อมูลให้พร้อมสำหรับการทำ Pivot Table นี่แหละ เพราะในบางครั้งข้อมูลอยู่กระจัดกระจายกันหลายที่ (เช่น ข้อมูลแยกกันเดือนละไฟล์ เป็นสิบๆไฟล์) รวมถึงอาจอยู่ในรูปแบบที่ไม่เหมาะสม (เช่น มีหัวตารางหลายชั้นที่ Merge กันไว้ มีหัวตารางเรื่องเดียวกันหลายคอลัมน์ หรือได้ข้อมูลเชิงรายงานมาจากโปรแกรมบัญชี แทนที่จะเป็นข้อมูลเชิง database) ทำให้พอเอาเข้าจริง เจ้า Pivot ที่ว่าเจ๋งกลับไม่ได้ออกโรงเลย เพราะข้อมูลเน่าเกินไป ไม่ได้อยู่ในสภาพที่ Pivot จะทำอะไรได้

            นอกจากนี้ ปัญหาของ Pivot Table แบบดั้งเดิมก็คือ มันสรุปข้อมูลได้แบบ Basic เกินไป เช่น ทำได้แค่ Sum, Count, Average, Max, Min หรือว่าทำได้อย่างมากก็คือสร้าง Calculated Field ขึ้นมาซึ่งก็เขียนสูตรได้จากพื้นฐานการ Sum แต่ละ Field เท่านั้น มันจึงไม่สามารถตอบโจทย์สถานการณืที่ซับซ้อนกว่านั้นได้ เช่น การนับข้อมูลแบบไม่ซ้ำกัน เป็นต้น

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

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

            ด้วยเหตุนี้ Excel จึงได้รับอาวุธใหม่ ที่จะช่วยแก้ปัญหาเดิมๆ ของ Pivot ได้หายเป็นปลิดทิ้ง

            ทำความรู้จักอาวุธใหม่

            Power Query

            ถ้าปัญหาคือการจัดเตรียมข้อมูล เช่น ข้อมูลอยู่ในสภาพไม่ ok หรือข้อมูลอยู่กระจายหลายไฟล์จนไม่สามารถ Pivot ได้ ทางแก้คือ อาวุธใหม่ที่ชื่อว่า Power Query นั่นเอง

            Power Query ตอนที่ 2 : มหากาพย์การใช้งาน Power Query ตั้งแต่ต้นจนจบ 70

            Power Query คือเครื่องมือที่ออกแบบมาเพื่อรวบรวมและดัดแปลงข้อมูลให้อยู่ในรูปแบบที่ต้องการ โดยสามารถสั่งงานได้ง่าย ผ่านเครื่องมือมาตรฐานโดยแทบไม่ต้องเขียนสูตรอะไรเลย เพราะโปรแกรมจะแปลงสิ่งที่เรากดสั่งผ่านเครื่องมือที่เตรียมไว้ให้กลายเป็นสูตรที่เรียกว่า M Code ให้เอง (แต่ก็มีกรณีที่ข้อมูลเน่าหรือซับซ้อนมากจนต้องเขียน M Code เพื่อแก้ไข)

            วิธีดึงข้อมูลจาก Excel ไฟล์ย่อยมาทำรายงานสรุปใน Excel หลัก (อีกไฟล์) /Power BI 14

            ตัวอย่างที่มีประโยชน์มากๆ อันนึงที่น่าจะเป้นประโยชน์กับคนส่วนใหญ่ คือ การรวมข้อมูล Excel หลายๆ ไฟล์ใน Folder เข้าด้วยกัน

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

            การใช้ Power Query จัดการข้อมูลที่มีหัวตาราง 2 ชั้น 1

            ที่สำคัญคือ เราเหนื่อยในการกำหนดวิธีดัดแปลงข้อมูลแค่ครั้งเดียว ถ้าต้องการทำซ้ำอีกแค่กด Refresh ตัว Power Query จะทำงานซ้ำอีกรอบอย่างง่ายดาย

            Data Model/DAX

            เมื่อปัญหาในการจัดเตรียมข้อมูลถูกแก้ไปได้ด้วยเครื่องมือ Power Query แล้ว ปัญหาต่อไปก็คือ การคำนวณที่ซับซ้อนขึ้นกว่าที Pivot เดิมจะทำได้ ซึ่งอาวุธใหม่ที่จะมาจัดการเรื่องนี้ก็คือ Data Model/DAX นั่นเอง

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

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

            การจะทำให้ Pivot Table สามารถทำแบบที่ผมบอกข้างต้นได้ ต้องสร้าง Pivot Table จาก Data Model ด้วย (ซึ่งตอนสร้าง Pivot จะมี Option ด้านล่างให้ติ๊ก) ซึ่งพอทำแบบนั้นจะช่วยให้ Pivot Table มีความสามารถอีกอย่างนึงเพิ่มขึ้นมาด้วยนั่นก็คือ การใช้สิ่งที่เรียกว่า Measure นั่นเอง

            Measure คือวิธีการคำนวณที่เราสามารถสร้างขึ้นมาได้เอง (มาแทน Calculated Field ที่มีใน Pivot แบบเก่า) ซึ่งเจ้า Measure นี้ดีกว่าเดิมตรงที่สามารถเขียนสูตรกำหนดวิธีการคำนวณได้อิสระกว่าเดิมมาก (เดิม Calculated Field ทำได้แค่ sum ) โดยที่ Measure สามารถใช้ Function ได้มากมาย ซึ่งฟังก์ชันเหล่านั้นเรียกว่า DAX (คล้ายกับฟังก์ชัน Excel แต่ออกแบบมาเพื่อการวิเคราะห์ข้อมูลโดยเฉพาะ)

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

            การใช้ Excel Power Pivot ตอนที่ 2 : ทำผลสรุป Value ให้เป็นข้อความด้วย DAX 6

            ลองจินตนาการว่า สูตรยากๆ ที่เคยเขียนใน Excel บางสูตรสามารถแทนได้ด้วยสูตร DAX ไปแบบง่ายๆ เลยก็มี แถมยังพ่วงกับการใช้ Pivot Table ที่มี Slicer ให้ใช้อีก ยิ่งสุดยอดไปเลย

            ทำความรู้จัก Hero คนใหม่อย่าง Power BI

            อย่างที่บอกไปตอนต้นว่า เกม Patch ใหม่นี้ได้ให้โอกาสเราเลือกเล่นเป็น Hero คนใหม่อย่าง Power BI ได้ด้วย แล้วเจ้า Power BI นี่มันทำอะไรได้ล่ะ? แล้วมันกับ Excel ใครเก่งกว่ากัน?

            ก่อนจะตอบคำถามว่าใครเก่งกว่ากัน… เพื่อให้งงขึ้นไปอีก ต้องบอกว่า เจ้า Power BI นั้นก็สามารถใช้อาวุธอย่าง Power Query, Data Model และ DAX ได้เช่นเดียวกับ Excel แถมวิธีการใช้งานแทบจะเหมือนกัน 100% คือต่างกันน้อยมากๆ แถมเรายังสามารถโหลด Power BI มาใช้ได้ฟรี และอัปเดทความสามารถทุกเดือนด้วย!

            ถ้าอยากทำความรู้จัก Power BI ลองอ่านซีรีส์นี้ได้ครับ

            Power BI ตอนที่ 01: Power BI คืออะไร? 2

            สิ่งที่ Power BI ทำได้ดีกว่า Excel อย่างเห็นได้ชัด คือความสามารถในการแสดงผลเป็นกราฟนั้นหลากหลายกว่า ง่ายกว่า แถมมีความ Interactive มากกว่า Excel เช่น ใน Power BI สามารถให้ User กดกราฟนึง แล้วมันจะส่งผลกระทบไปที่กราฟอื่นๆ ในรายงานได้ด้วย (ใน Excel ทำได้แค่กด Slicer จึงจะมีผล แต่กดที่กราฟไม่ได้) เรียกว่า Power BI สามารถสร้าง Interactive Dashboard ได้อย่างแท้จริงยิ่งกว่า Excel

            นอกจากนั้น Power BI ยังโดดเด่นเรื่องความสามารถในการแชร์ข้อมูลแบบ Online ไปให้คนในองค์กรกดดูรายงานเล่นได้แบบง่ายทั้งผ่านคอมพิวเตอร์ มือถือ หรือ Tablet ก็ได้ แถมยังมีความปลอดภัยสูงอีกด้วย! (แต่ถ้าแชร์รายงานต้องมี User แบบเสียตังค์ทั้งคนส่งและคนดู)

            อ้าว… แบบนี้แสดงว่า Power BI ก็เก่งกว่า Excel น่ะสิ แล้วจะมี Excel ไปทำไมอีก?

            คำตอบคือ Power BI นั้นเก่งกว่า Excel จริงๆ ครับ แต่เก่งกว่าเฉพาะงานที่ต้องทำรายงานจากข้อมูลที่เตรียมไว้ก่อนแล้ว และต้องการแสดงผลเป็นกราฟสวยๆ และต้องการให้กดเล่นได้แบบ Interactive Dashboard ซึ่งอันนี้ Excel สู้ไม่ได้จริงๆ

            แต่ถ้าเป็นงานแบบอื่น เช่น งาน Admin ทั่วไป, การคำนวณทั่วไป. ทำงานเอกสาร, ทำแบบฟอร์ม, ทำ Financial Modeling, ทำ Simulation, ทำ Optimization อันนั้น Power BI แทบจะทำไม่ได้หรือไม่เหมาะเลย โดยเฉพาะ หากต้องการผลลัพธ์เป็นหน้าตาแบบตาราง Excel จะเหมาะกว่า Power BI มาก

            นอกจากนั้น Excel ยังกรอกข้อมูลเพิ่มได้อิสระและง่าย เห็นผลลัพธ์เร็ว ในขณะที่ Power BI นั้นแทบไม่มีที่ให้กรอกข้อมูลเพิ่มในตัวมันเอง (มันถนัดในการดึงข้อมูลจากที่อื่นมาสรุปมากกว่า) ซึ่งตรงนี้ Excel ถือว่ากินขาด ถ้าต้องการให้เล่นกับ Input ได้ง่าย

            ใครสนใจลองดูคลิปที่มีคนเทียบ Excel vs Power BI ได้ที่นี่

            Excel ได้รับบัฟใหม่

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

            แต่พอเวลาผ่านไป เหมือนว่าสูตรใน Excel จะพัฒนาไปค่อนข้างช้า เมื่อเทียบกับตัวละคร Hero คู่แข่งสำคัญอีกคนนั่นคือ Google Sheets ซึ่งกลายเป็นว่ามีจุดแข็งเรื่องการเขียนสูตรมากขึ้นเรื่อยๆ จากการนำเอาสูตรมาผสมกับการเรียกใช้ Service ของ Google แบบ Online ได้เลย จนผมคิดว่าในปัจจุบันสุตรใน Google Sheets นั้นเจ๋งกว่าของ Excel อีก (โดยเฉพาะสูตรเจ๋งๆ อย่าง REGEX, QUERY, FLATTEN, SPLIT อะไรพวกนี้)

            มีคนทำ vdo เปรียบเทียบ Excel vs Google Sheets ไว้ 2 ตอนดังนี้

            เนื่องจากเกม Patch ใหม่ นั้นเหมือน Excel กำลังโดนข่มจากทั้ง Power BI และ Google Sheets เอง ทาง Microsoft จึงได้พัฒนา Excel ให้มีความสามารถเพิ่มขึ้นมาค่อนข้างทัดเทียมกับ Google Sheets จนใน Excel 365 นั้นก็มี Concept ของการเขียนสูตรแบบใหม่ที่เรียกว่า Dynamic Array + Spill เกิดขึ้น ซึ่งเปลี่ยนวิธีการเขียนสูตรแบบ Array ไปตลอดกาล (ลาก่อนการกดปุ่ม Control+Shift+Enter)

            แถมยังมีฟังก์ชันใหม่ๆ โกงๆ เพิ่มมาเยอะแยะ เช่น

            • FILTER (ใช้แทน VLOOKUP ที่ต้องการได้ผลหลายค่าแบบง่ายๆ)
            • SORT (เรียงข้อมูลด้วยสูตร)
            • UNIQUE (Remove Duplicates ด้วยสูตร)
            • XLOOKUP (เกิดมาฆ่า VLOOKUP ทำได้ทุกอย่างที่ VLOOKUP ติดปัญหา)
            • SEQUENCE (สร้างลำดับตัวเลขชิวๆ)
            • LET (สร้างตัวแปรในสูตร ช่วยให้สูตรยาวๆ ยากๆ สามารถแบ่งความคิดได้ง่ายขึ้น)

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

            เปลี่ยนสูตรยากให้เป็นสูตรกล้วยๆ ด้วย Dynamic Array ใน Excel 365 3

            สรุปแนวทางการแก้ปัญหา และเครื่องมือที่เหมาะสม

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

            ปัญหาExcelPower QueryPower BI/ DAX / Data Model
            งาน Admin ปกติ เน้นงาน Adhoc แบบทำทีเดียวจบ
            กรอกข้อมูลทั่วไป (กรอกวันที่ให้ถูกด้วย)
            Sort/Filter คัดกรองข้อมูล
            คำนวณสูตรทั่วไป
            TRIM ตัดช่องว่างส่วนเกิน
            Remove Duplicates
            Text to Column แยกข้อมูล
            Flash Fill เลียนแบบตัวอย่างที่ใส่
            การคำนวณซับซ้อน
            เช่น ทำ Financial Model,
            เขียนสูตรมากมาย เช่น SUMIFS / INDEX+MATCH / Array formula,
            ทำ Conditional Format

            ผลลัพธ์เปลี่ยนตาม Input
            ที่กรอกง่ายๆ ทันที
            ต้อง Refresh ก่อน
            จากนั้นค่อยส่งผลเข้าไป Data Model
            มีสูตรคำนวณซับซ้อนได้เช่นกัน
            แต่ผลลัพธ์จะเล่นกับ Input ได้ไม่สะดวกเท่า Excel
            สร้างขอบเขตข้อมูลที่เพิ่มขึ้นเรื่อยๆ
            (Dynamic Range)
            Insert -> Tableเหมาะกับข้อมูลที่เป็น
            Table เช่นกัน
            เอาข้อมูลจาก Power Query เข้าสู่ Data Model
            การสรุปข้อมูลจากตารางเดียว สูตรพื้นฐานPivot Table
            (ควรสร้างจาก Table อีกที)

            ควบคุม Pivot Table หลายตัวได้ด้วย Slicer
            สร้างกราฟพื้นฐานสะดวกสุดคือ Pivot Chart
            (Link กับ Pivot Table)
            การทำกราฟ AdvanceExcel จะมีความยืดหยุ่น
            เรื่องกราฟบางอย่าง เช่น ใส่ Error Bar /ใส่รูปลงไปในกราฟ
            Power BI จะดีกว่าตรงที่
            มีกราฟแปลกๆ ให้เลือกเลย
            แถมโหลดเพิ่มจาก internet ได้ด้วย
            ทำ OptimizationSolver
            Simulation /
            Regression Analysis
            สูตร,
            What if Analysis, Forecast ข้อมูล
            Data Table,
            Scenario Manager,
            Analysis Tool pack
            การรวบรวมข้อมูลจากหลายไฟล์Get Data -> form Folder
            การดัดแปลงหน้าตาข้อมูลให้เรียบร้อยTransform Data
            Filter, Fill Down,
            Replace Values,
            Replace errors,
            Remove Duplicates
            Split, Extract Data
            Transpose, Group by, Unpivot
            การสรุปข้อมูลจาก
            หลายตารางสัมพันธ์กัน/
            สูตรแบบซับซ้อน
            Power Pivot ,
            Data Model Actual/Target ,
            DAX Measure
            การทำงานแบบอัตโนมัติVBA (เขียนโปรแกรม) ซึ่งไม่ใช่เรื่องง่ายที่ทุกคนจะเขียนได้

            เหมาะกับงานที่ต้องทำซ้ำๆ ถึกๆ

            (อย่างไรก็ตาม สามารถใช้โปรแกรมภาษาอื่นเช่น Python มาทำแทนได้)
            มาทดแทน VBA ได้ในส่วนของ
            การเตรียมและรวบรวมข้อมูล

            สะดวกเพราะมี UI ที่ง่าย แถมกด Refresh
            เพื่อทำซ้ำได้เลย แต่ต้องกำหนด Step ดีๆ
            ไม่งั้นจะมีปัญหา โดยเฉพาะกรณีหัวตารางเปลี่ยน

            สรุปก่อนจากลา

            หวังว่าเพื่อนๆ ที่ได้อ่านบทความนี้น่าจะได้เห็นภาพรวมของเครื่องมือใหม่ๆ ไปพอสมควรนะครับ ในอนาคตทาง Microsoft อาจมี Hero ตัวใหม่ที่น่าสนใจให้เราเลือกอีก หรืออาจเสริมอาวุธเจ๋งๆ มาให้ Excel อีกมากมาย เพราะล่าสุดโปรแกรมเมอร์ผู้คิดค้นภาษา Python ชื่อว่า Guido Van Rossum ได้ตกลงร่วมมือเข้าเป็นส่วนหนึ่งของทีม Microsoft แล้ว

            มันน่าจะเปิดโอกาสให้เกิดสิ่งมหัศจรรย์อีกมากมาย ไม่แน่ว่าในอนาคต Excel อาจเกี่ยวข้องกับ Python มากขึ้น? ไม่แน่ว่าการทำ Machine Learning จะง่ายขึ้น ทำให้เราอาจจัดการพวก Unstructured Data อย่างรูปภาพ เสียง วีดีโอ ได้ง่ายขึ้นอีกมากก็ได้ ใครจะรู้?

          • หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if

            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if

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

            นั่นก็คือความสามารถในการควบคุม Flow การไหลของคำสั่งใน Program ของเรา เช่น

            1. สามารถทำงานที่แตกต่างกันตามเงื่อนไขที่กำหนดได้ = แยกการตัดสินใจด้วยคำสั่งกลุ่ม if
            2. สามารถทำงานอะไรซ้ำๆ หรือทำตามเงื่อนไขที่กำหนดได้ โดยไม่ต้องสั่งคำสั่งนั้นเองหลายๆ รอบ = การวน Loop ด้วย for, while (ซึ่งการวน Loop เป็น Concept ที่อาจจะไม่คุ้นเคยกับคนใช้ Excel ที่ไม่ได้เขียนโปรแกรมมาก่อน)

            ซึ่งสิ่งเหล่านี้เป็นจุดเริ่มต้นของการทำอะไรที่ Advance มากขึ้นต่อไปในอนาคตได้ เรามาดูรายละเอียดทีละกลุ่มกัน

            เงื่อนไขกลุ่ม if ใน Python

            อย่างที่บอกไปแล้วว่าการเขียน if คือ การแยกการตัดสินใจให้ทำงานแตกต่างกันตามเงื่อนไขที่กำหนดได้ ซึ่งก็เหมือนฟังก์ชัน IF ใน Excel นั่นแหละ ซึ่งต้องมีเรื่องของเงื่อนไขที่จะเช็ค และสามารถกำหนดได้ว่าถ้าเงื่อนไขเป็นจริงจะทำอะไร ถ้าเงื่อนไขเป็นเท็จจะทำอะไร แค่ใน Excel ใช้เป็นฟังก์ชัน แต่ Python ใช้เป็น Statement แทน

            ใน python จะเขียนแบบนี้ (เครื่องหมาย colon : หลังเงื่อนไขต่างๆ และการย่อหน้าใน action ที่จะทำ “สำคัญมาก” ใน Python)

            if เงื่อนไข:
              คำสั่งกรณีเงื่อนไขเป็นจริง
            else:
              คำสั่งกรณีเงื่อนไขเป็นเท็จ

            เช่น ใน Excel เขียนว่า

            =IF(A1>50, "ผ่าน", "ไม่ผ่าน")

            ใน python จะเป็นแบบนี้

            A1=73
            if A1>50:
              B1="ผ่าน"
            else:
              B1="ไม่ผ่าน"
            print(B1)
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 59

            แต่ใน Python จริงๆ เขียน if แบบไม่ต้องมี else ก็ได้ เช่น

            A1=73
            if A1>100:
              print("เยี่ยมมาก")
            print("จบ")
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 60

            รวมถึงสามารถใส่หลายๆ เงื่อนไขด้วย elif (else if) ไปเรื่อยๆ กี่รอบก็ได้ เช่น

            Score=73
            if Score>=80:
              Grade="A"
            elif Score>=70:
              Grade="B"
            elif Score>=60:
              Grade="C"
            elif Score>=50:
              Grade="D"
            else:
              Grade="F"
            print(Grade)
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 61

            เงื่อนไขเพื่อการวน Loop ใน Python : For Loop

            การวนลูปแบบแรกที่ผมจะขอพูดถึงก็คือ for loop ซึ่งสามารถทำงานซ้ำๆ ได้หลายๆ รอบตามต้องการ และยังทำงานร่วมกับ Data Types ที่เป็นชุดข้อมูลเช่น พวก list, tuple, dictionary, set ก็ได้ด้วย รวมถึงจริงๆ แล้วก็สามารถทำงานกับ string ได้ด้วย (มองว่า string คือชุดข้อมูลที่รวมเอาแต่และ character มาไว้ด้วยกันเป็นข้อความ)

            for แบบทำงานซ้ำๆ หลายๆ รอบตามจำนวนที่ระบุ

            มาดูเรื่องการทำงานซ้ำๆ หลายๆ รอบตามจำนวนที่ระบุก่อนครับ

            สมมติผมต้องการ print คำว่า “เทพมาก” ออกมา 6 รอบ วิธีแรกที่ทำได้คือแบบนี้

            print("เทพมาก")
            print("เทพมาก")
            print("เทพมาก")
            print("เทพมาก")
            print("เทพมาก")
            print("เทพมาก")
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 62

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

            for ตัวแปร in range(ตัวเลข):  
              คำสั่งที่ต้องการทำ

            โดยที่คำสั่ง range มีวิธีทำงานดังนี้

            • range(6) จะออกมาเป็นเลข sequence ตั้งแต่ 0 แต่ไม่รวม 6 นั่นคือ 0,1,2,3,4,5 (ไม่รวม6)
            • range(2, 6) จะออกมาเป็นเลข sequence ตั้งแต่ 2 แต่ไม่รวม 6 นั่นคือ 2,3,4,5 (ไม่รวม6)
            • range(2, 17, 3) จะออกมาเป็นเลข sequence ตั้งแต่ 2 แต่ไม่รวม 17 และเพิ่มทีละ 3 นั่นคือ 2,5,8,11,14 (ไม่รวม 17)

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

            # range(6) คือ 0,1,2,3,4,5 (ไม่รวม6)
            
            for num in range(6):  #ใช้ตัวแปรอะไรแทนคำว่า num ก็ได้ 
              print("เทพมาก")
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 63

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

            # range(6) คือ 0,1,2,3,4,5 (ไม่รวม6)
            
            for num in range(6):   
              #เอาตัวแปร num มาใช้ได้
              print("เทพมาก จากตัวแปรเลข "+str(num)+", ซึ่งเป็นการรันครั้งที่ "+str(num+1)) 
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 64

            for แบบทำงานร่วมกับข้อมูลเป็นชุด

            มาดูการทำงานร่วมกับ Data Types ที่เป็นชุดข้อมูล เช่น list, string และ dictionary กันครับ

            มาดูการทำงานร่วมกับ list ก่อนครับ

            ซึ่งคล้ายๆ ตอนที่เราใช้กับ range นั่นแหละ แต่คราวนี้เราสามารถใช้ตัวแปรอ้างอิงแต่ละ item ใน list นั้นๆ ได้เลย

            myList = ["Eren", "Mikasa", "Armin", "Levi"]
            for item in myList:   #ใช้ตัวแปรอะไรแทนคำว่า item ก็ได้
              print(item)
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 65

            ซึ่งค่อนข้างสะดวกคือเราไม่จำเป็นต้องมาใช้ myList[index] ในการอ้างอิงแต่ละ item ก็ได้ แถมไม่ต้องนับจำนวน item ด้วยซ้ำ

            แต่ถ้าอยากจะอ้างด้วยเลข index จริงๆ สามารถทำได้ด้วยการประยุกต์ใช้ len(myList) เพื่อนับจำนวน item แล้วส่งไปให้ range ใช้ต่อ ดังนี้

            myList = ["Eren", "Mikasa", "Armin", "Levi"]
            
            #ถ้าจะใช้ concept ของเลข index ก็จะเป็นแนวๆ นี้
            #len(myList) คือนับว่ามีกี่ item แล้วค่อยส่งไปให้ range อีกที 
            for i in range(len(myList)):   
              print(myList[i])
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 66

            มาดูการทำงานร่วมกับ string กันต่อครับ

            ก่อนอื่นเราต้องรู้ก่อนว่าจริงๆ แล้ว String ก็คือชุดข้อมูลที่ประกอบไปด้วยอักขระแต่ละตัวประกอบกันอยู่ และเราสามารถอ้างอิงด้วยเลข index ได้ด้วย คล้ายๆ list เลย เช่น

            myString="ThepExcel"
            print(myString[1]) #ได้ index1 คือตัวที่ 2
            print(myString[1:4]) #ได้ตั้งแต่ index1 แต่ไม่ถึง 4 คือตัวที่ 2 ถึง 4
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 67

            ทีนี้ถ้าเราใช้ for กับข้อมูล string จะเป็นยังไงกันนะ? มาดูกัน

            myString="ThepExcel"
            for c in myString:
              print(c)
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 68

            จะเห็นว่าเราสามารถเข้าถึงอักขระแต่ละตัวใน string นั้นๆ ได้เลยแบบง่ายๆ

            แต่ถ้าอยากใช้เลข index ก็ต้องใช้ range+len เช่นเคย

            myString="ThepExcel"
            for num in range(len(myString)):
              print(myString[num])
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 69

            ต่อไปเป็นการทำงานร่วมกับ dictionary ครับ

            ถ้าเราใช้ for กับ dictionary เฉยๆ ตัวแปร จะหมายถึง key ของ dictionary นั้นๆ

            myDict = {"FirstName" : "Sira", "LastName" : "Ekabut", "Age" : 37, "Height" : 170 }
            for x in myDict: #อ้าง myDict เฉยๆ x จะหมายถึง key ของ dictionary นั้นๆ
              print(x)  #print key ออกมา
            
            print('--------')
            
            for x in myDict: #อ้าง myDict เฉยๆ x จะหมายถึง key ของ dictionary นั้นๆ
              print(myDict[x]) #print value ออกมา
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 70

            ถ้าอยากได้ทั้ง Key และ Value แบบง่ายๆ ให้ใช้ตัวแปร 2 ตัวมารับค่าแบบนี้ (x,y) in myDict.items() (เรียกว่าการ Unpack)

            myDict = {"FirstName" : "Sira", "LastName" : "Ekabut", "Age" : 37, "Height" : 170 }
            for (x,y) in myDict.items(): #อ้าง myDict.items() จะได้ตัวแปร 2 ชุด
             คือ key กับ value
              print(x)  #print x ออกมา
              print(y)  #print y ออกมา
              print(x,y)  #print x คู่กับ y 
              print('---')
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 71

            เงื่อนไขเพื่อการวน Loop ใน Python : While Loop

            เป็นการทำคำสั่งไปเรื่อยๆ ในขณะที่เงื่อนไขที่กำหนดยังเป็นจริงอยู่

            i = 1  #ให้ i เป็น 1
            while i <= 6:  #กำหนดเงื่อนไขให้ทำในขณะที่ i ไม่เกิน 6
              print("เทพมาก" + str(i))
              i = i+1  #เพิ่ม i ก่อนจะจบ action 
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 72

            ซึ่งแน่นอนว่าจะเอาไปใช้กับพวก list, dict, string อะไรก็ได้ ถ้าอยากทำ แต่แน่นอนว่ามันยากกว่าใช้ for แหละเนอะ

            myList = ["Eren", "Mikasa", "Armin", "Levi"]
            
            i = 0  #ให้ i เป็น 0 ให้สอดคล้องกับ index
            while i < len(myList):  #กำหนดเงื่อนไขให้ทำในขณะที่ i ไม่เกินจำนวนตัวใน Mylist
              print(myList[i])
              i = i+1  #เพิ่ม i ก่อนจะจบ action 
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 73

            คำสั่งที่ควรรู้จักเพิ่มเติมเวลาใช้ while loop นั้นมีอีก 2 ตัวหลักๆ ดังนี้

            • break : เป็นคำสั่งให้จบการวน loop ไปเลย
            • continue : เป็นคำสั่งให้ทำต่อใน loop ถัดไปทันที
            n = 0
            while n < 10:
                n=n+1
                if n == 2:
                  continue   #ไป loop ต่อไปเลย โดยไม่ได้ print
                elif n == 7:
                  break    #ออกจาก loop ไปเลย โดยไม่ได้ print
                print(n)
            print('จบ Loop')
            หัด Python สำหรับคนเป็น Excel : ตอนที่ 3 – การวน Loop และ เงื่อนไข if 74

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

            จบตอน

            ตอนนี้เนื้อหาเริ่มมีความซับซ้อนขึ้นนิดนึง (แต่คิดว่ายังไม่ยากเกินไป) ซึ่งที่ผ่านมาเรามี action ที่ทำได้แค่การ print โง่ๆ อยู่ เดี๋ยวตอนต่อ ไปเราจะมาเรียนรู้กันว่า จะสั่งทำอะไรกับข้อมูลเจ๋งๆ ได้บ้างเนอะ

            สารบัญ Series Python

            • หัด Python สำหรับคนเป็น Excel : ตอนที่ 2 – ประเภทข้อมูล (Data Types)

              หัด Python สำหรับคนเป็น Excel : ตอนที่ 2 – ประเภทข้อมูล (Data Types)

              ในตอนที่แล้วเราได้เรียนรู้เรื่องของการแสดงผลด้วย print การใช้ตัวแปร การใส่ comment ไปแล้ว ซึ่งยังเป็นเรื่องที่พื้นฐานมากๆ คราวนี้เราก็ยังคงอยู่ที่เรื่องพื้นฐานที่สำคัญอีกเรื่องคือ ประเภทของข้อมูลใน Python นั่นเอง

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

              ประเภทข้อมูลพื้นฐาน (เทียบกับใน Excel)

              มีลักษณะเป็นค่าเดี่ยวๆ ตัวเดียว

              • ตัวเลข : int (จำนวนเต็ม), float (ทศนิยม)
              • ข้อความ : str (ซึ่งต้องใส่ในเครื่องหมายคำพูด ตามที่อธิบายไว้ในตอนแรก)
              • ตรรกะ : bool คือค่า True / False

              เราสามารถตรวจสอบประเภทข้อมูลได้ด้วย ฟังก์ชัน type() ดังนี้

              x=5 #เป็น int
              y=5.0 #เป็น float เพราะมีทศนิยม แม้จะเป็น 0 ก็ตาม
              z="5" #เป็น str แม้หน้าตาจะเหมือนตัวเลขก็ตาม
              print(type(x))
              print(type(y))
              print(type(z))
              หัด Python สำหรับคนเป็น Excel : ตอนที่ 2 - ประเภทข้อมูล (Data Types) 75

              เครื่องหมาย Operator พื้นฐาน

              เครื่องหมายคำนวณทางคณิตศาสตร์

              นั้นคล้าย Excel มากเช่น +, -, *, / นั้นเหมือนกับ Excel เลย อย่างไรก็ตามก็มีตัวที่ต่างกัน คือ

              • % คือ Modulus หาเศษเหลือจากการหาร (ใน Excel จะใช้ฟังก์ชัน MOD)
              • ** คือ ยกกำลัง (ใน Excel จะใช้ ^)

              เครื่องหมายเปรียบเทียบ / ตัวตรรกะ

              เวลาใช้จะให้ผลเป็น Boolean คือ True/False เช่นเดียวกับใน Excel เลย

              • ตัวที่เหมือน Excel คือ >, <, >=, <=
              • ตัวที่ต่างจาก Excel มีดังนี้
                • == คือ การเทียบว่าเท่ากันหรือไม่ (ใน Excel ใช้ = ตัวเดียว)
                • != คือ เครื่องหมายไม่เท่ากับ (ใน Excel ใช้ <>)
                • in สามารถเช็คได้ว่าอยู่ในกลุ่มที่สนใจหรือไม่ (ใน excel อาจต้องใช้ MATCH ช่วย)
                • ตัวตรรกะ and, or, not ใช้เป็นตัวเชื่อมตรงกลาง (ใน Excel ใช้เป็นฟังก์ชัน) เช่น
                  • myVar1>10 and myVar2<=30 (ใน excel ใช้ว่า =AND(myVar1>10, myVar2<=30)

              เครื่องหมายเชื่อมข้อความ

              ใน Excel จะใช้เครื่องหมาย & ในการเชื่อมข้อความ แต่ใน Python จะใช้เครื่องหมาย + ได้เลยครับ เช่น

              title="นาย"
              first="ศิระ"
              last="เอกบุตร"
              print(title+first) #ได้ นายศิระ
              print(title+first+" "+last) #ได้ นายศิระ เอกบุตร
              หัด Python สำหรับคนเป็น Excel : ตอนที่ 2 - ประเภทข้อมูล (Data Types) 76

              ถ้าข้อมูลเป็นคนละประเภท Python จะงงทันที เช่น แบบนี้จะ Error เพราะ var1 เป็นตัวเลข ส่วน var2 เป็น text คำว่า 3

              ตกลงว่าจะให้บวกกัน หรือ จะให้เชื่อมข้อความกันแน่???

              var1=5
              var2="3"
              print(var1+var2)
              หัด Python สำหรับคนเป็น Excel : ตอนที่ 2 - ประเภทข้อมูล (Data Types) 77

              การแปลงประเภทข้อมูล (Casting)

              เดิมที่เราเอาตัวเลขกับข้อความบวกกันไม่ได้ เราต้องแปลงให้เหมือนกันก่อน โดยใช้ฟังก์ชันที่ชื่อเดียวกับประเภทข้อมูลที่ต้องการ เช่น

              var1=5
              var2="3"
              var2num=int(var2) #แปลงให้เป็นเลขจำนวนเต็ม
              var1str=str(var1) #แปลงให้เป็นข้อความ
              print(var1+var2num)
              print(var1str+var2)
              หัด Python สำหรับคนเป็น Excel : ตอนที่ 2 - ประเภทข้อมูล (Data Types) 78

              ประเภทข้อมูลที่เป็นโครงสร้าง

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

              ใน Excel ถ้าเราอ้างอิงข้อมูลเป็นช่วงเมื่อไหร่จะได้ข้อมูลแบบ Array ทันที (เช็คได้โดยการ Highlight สูตรแล้วกด F9) ซึ่งจะแสดงเป็นข้อมูลในเครื่องหมายปีกกา คั่นด้วย Comma (ขึ้นคอลัมน์ใหม่) กับ Semicolon (ขึ้นแถวใหม่) เช่น

              หัด Python สำหรับคนเป็น Excel : ตอนที่ 2 - ประเภทข้อมูล (Data Types) 79

              แต่ใน Python นั้นมีข้อมูลเชิงโครงสร้างที่หลากหลายแบบมากๆ และมีลูกเล่นในการจัดการข้อมูลที่ง่ายกว่า Array ของ Excel พอสมควรซึ่งจะคล้ายกับข้อมูลเชิงโครงสร้างของ ภาษา M ใน Power Query มากกว่า (เช่น List, Record, Table)

              ข้อมูลเชิงโครงสร้างใน Python ที่สำคัญๆ มีดังนี้

              list

              • เก็บข้อมูลหลายๆ ตัวอยู่ในวงเล็บเหลี่ยม เก็บค่าซ้ำได้ เช่น
                • myList = [“Eren”, “Eren”, “Mikasa”, “Armin”, “Armin”]
                • คล้ายๆ กับ List ของ Power Query
              • ลำดับข้อมูลมีความสำคัญ อ้างอิงข้อมูลได้ด้วยเลข index เช่น
                • myList[0] คือ item ตัวแรกสุด ซึ่งคือ “Eren”
                • myList[-1] คือ item ตัวสุดท้าย ซึ่งคือ “Armin”
                • สามารถดึงข้อมูลมาหลายๆ ตัวเป็นช่วงที่เรียกว่า Slice ได้ ในรูปแบบ myList[ตั้งแต่index : แต่ไม่รวม index]
                • ถ้าตอน slice เว้นตัวเริ่มต้นไว้ จะได้ตั้งแต่ตัวแรก, ถ้าเว้นตัวจบ จะได้จนถึงตัวสุดท้าย
              • เปลี่ยนค่า item ต่างๆ หลังจากถูกสร้างไปแล้วได้ (Mutable) เช่น
                • myList[1]=”Attack Titan” #เปลี่ยนค่า item ที่ 2 (index1) เป็น Attack Titan
              myList = ["Eren", "Eren", "Mikasa", "Armin", "Armin"]
              print(myList[0]) #ได้ตัวแรก
              print(myList[-1]) #ได้ตัวสุดท้าย
              #เปลี่ยนค่า item ที่ 2 (index1) เป็น Attack Titan
              myList[1]="Attack Titan" 
              print(myList)
              
              #ได้ตั้งแต่ index 0 แต่ไม่รวมตัว index3 ซึ่งคือ ตัวแรกถึงตัวที่ 3 ได้ ['Eren', 'Attack Titan', 'Mikasa']
              print(myList[0:3]) 
              
              #ได้ตั้งแต่ index 1 แต่ไม่รวมตัว index3 ซึ่งคือ ตัวที่ 2 ถึงตัวที่ 3 ได้ ['Attack Titan', 'Mikasa']
              print(myList[1:3]) 
              
              #ได้ตั้งแต่ index 1 ถึง ตัวสุดท้าย ได้ ['Attack Titan', 'Mikasa', 'Armin', 'Armin']
              print(myList[1:]) 
              
              #ได้ตั้งแต่ตัวแรก แต่ไม่รวมตัว index2 ซึ่งคือ ตัวแรก ถึงตัวที่ 2 ได้ ['Eren', 'Attack Titan']
              print(myList[:2]) 
              หัด Python สำหรับคนเป็น Excel : ตอนที่ 2 - ประเภทข้อมูล (Data Types) 80

              tuple

              • เก็บข้อมูลหลายๆ ตัวอยู่ในวงเล็บปกติ (หรือไม่ใส่วงเล็บเลยก็ได้) เก็บค่าซ้ำได้ เช่น
                • myTuple = (“Eren”, “Eren”, “Mikasa”, “Armin”, “Armin”)
                • myTuple = “Eren”, “Eren”, “Mikasa”, “Armin”, “Armin”
              • ลำดับข้อมูลมีความสำคัญ อ้างอิงข้อมูลได้ด้วยเลข index (เช่นเดียวกับ List) เช่น
                • myTuple[0] คือ item ตัวแรกสุด ซึ่งคือ “Eren”
              • เปลี่ยนข้อมูลภายหลังจากสร้างไปแล้วไม่ได้ (unchangeable/immutable) เช่น
                • myTuple[1]=”Attack Titan” แบบนี้จะ Error ทันที
              • ประโยชน์คือ สามารถทำงานได้เร็วกว่า List และเหมาะกับอะไรที่มีโครงสร้างคงที่ไม่เพิ่มไม่ลด ไม่เปลี่ยนค่า
              • Tuple คือ ประเภทข้อมูล Default ของผลลัพธ์ที่ได้จากฟังก์ชัน กรณีได้ค่ากลับมาหลายค่า
              myTuple = ("Eren", "Eren", "Mikasa", "Armin", "Armin")
              print(myTuple[0]) #ได้ตัวแรก
              print(myTuple[-1]) #ได้ตัวสุดท้าย
              myTuple[1]="Attack Titan" #เปลี่ยนค่า item ที่ 2 (index1) เป็น Attack Titan
              print(myTuple) #error ไปตั้งแต่ก่อนหน้าแล้ว
              print(myTuple[0:3]) #error ไปตั้งแต่ก่อนหน้าแล้ว
              print(myTuple[1:3]) #error ไปตั้งแต่ก่อนหน้าแล้ว
              หัด Python สำหรับคนเป็น Excel : ตอนที่ 2 - ประเภทข้อมูล (Data Types) 81

              dict

              • เป็นการเก็บข้อมูลเป็นคู่ Key : Value อยู่ในวงเล็บปีกกา เช่น
                • myDict = {“name” : “Sira”, “age” : 37}
                • ถ้าใส่ Key ซ้ำกันหลายรอบจะได้อันสุดท้าย
                • คล้ายๆ กับสิ่งที่เรียกว่า Record ของ Power Query ซึ่งคล้ายการเก็บข้อมูลแต่ละบรรทัดของตารางเอาไว้ แล้วบอกว่าแต่ละ Field (Column) มีค่าเป็นอะไร
              • อ้างอิงข้อมูลได้โดยใช้ Key มาช่วย เช่น
                • myDict[“name”] จะได้คำว่า “Sira”
                • myDict[“age”] จะได้เลข 37
              myDict = {"name" : "Eren", "age" : 37, "name" : "Sira"} #ถ้าใส่ Key ซ้ำกันจะได้อันสุดท้าย
              print(myDict)
              print(myDict["name"]) # ได้สิ่งที่คู่กับ Key ที่เป็นคำว่า name
              myDict["name"]="ThepExcel" #เปลี่ยนค่าใน item ได้
              print(myDict)
              หัด Python สำหรับคนเป็น Excel : ตอนที่ 2 - ประเภทข้อมูล (Data Types) 82

              set

              • ใส่รายการข้อมูลอยู่ในวงเล็บปีกกา และเก็บค่าซ้ำไม่ได้ เช่น
                • mySet={“Eren”, “Eren”, “Mikasa”, “Armin”, “Armin”}
                • สุดท้ายจะเหลือแค่ {“Eren”, “Mikasa”, “Armin”} อยู่ดี (ตัดตัวซ้ำออกให้)
              • ลำดับข้อมูลไม่มีความสำคัญ ทำให้ไม่สามารถอ้างอิงข้อมูลด้วย index หรือ key ได้
                • ทำได้แค่วน Loop ใน set หรือเช็คว่ามีข้อมูลที่ต้องการหรือไม่
              mySet={"Eren", "Eren", "Mikasa", "Armin", "Armin"}
              print(mySet) #เหลือเฉพาะตัวที่ไม่ซ้ำ
              print("Armin" in mySet) #เช็คว่าใน set มีคำว่า Armin รึเปล่า
              print("Levi" in mySet) #เช็คว่าใน set มีคำว่า Levi รึเปล่า
              print(mySet[0]) #อ้างอิงด้วย index ไม่ได้
              หัด Python สำหรับคนเป็น Excel : ตอนที่ 2 - ประเภทข้อมูล (Data Types) 83

              จบตอนที่ 2

              ในตอนต่อๆ ไปเราจะมาดูเรื่องของการวน Loop การเขียน if รวมถึงเจาะลึกข้อมูลประเภท List ซึ่งมีลูกเล่นเยอะมากๆ ในการทำงานจริง และมีความเกี่ยวข้องกับข้อมูลที่เป็นข้อความด้วยเช่นกัน รอติดตามได้เลย!

              สารบัญ Series Python

              • หัดเขียนโปรแกรม Python สำหรับคนเป็น Excel มาก่อน  : ตอนที่ 1

                หัดเขียนโปรแกรม Python สำหรับคนเป็น Excel มาก่อน : ตอนที่ 1

                ถ้าให้เลือกการเรียนรู้เขียนโปรแกรมคอมพิวเตอร์ใหม่ซักอันนึง ผมคิดว่าภาษา Python เป็นอีกภาษาที่ได้เรียนรู้แล้วคุ้มค้า เรียนรู้ง่าย เป็นที่นิยม มีคนใช้งานเยอะ จึงมี Library ให้ใช้เยอะแยะไปหมด อีกอย่างมันเป็นภาษาที่ทำได้ทุกอย่าง จะทำ Web ทำ App เขียนเกม ทำ AI/Machine Learning หรือจะใช้ทำงานร่วมกับไฟล์ Excel ก็ย่อมได้

                แต่บอกไว้ก่อนว่าแม้ผมจะมีความเชี่ยวชาญการใช้ Excel, Power Query, Power BI พอสมควร แต่ผมไม่ใช่ผู้เชี่ยวชาญภาษา Python หรือการเขียนโปรแกรมภาษาไหนๆ เลย

                สิ่งที่ผมเชี่ยวชาญมันเป็น Concept ของ Functional Language ทั้งนั้นเลย ทั้งฟังก์ชัน Excel, M, DAX ส่วน VBA ใน Excel ที่เป็นการเขียนโปรแกรมผมก็ทำได้ในระดับนึง ไม่ได้เชี่ยวชาญอะไรมากนัก ก็เลยคิดว่า ถ้าจะหัดเขียนโปรแกรมแล้ว หัด Python ไปเลยดีกว่า ใช้ได้ยาวๆ ใช้ได้หลายเรื่อง 555

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

                ผลพลอยได้จากการศึกษา Python นอกจากจะทำให้คุณ Logic ดีขึ้น และมีเครื่องมือทุ่นแรงมากขึ้นแล้ว มันยังจะทำให้คุณเข้าใจ Excel มากขึ้นได้ด้วยอย่างน่าอัศจรรย์ ไม่เชื่อก็ลองอ่านดูได้เลยครับ ^^

                เพื่อไม่ให้เสียเวลา เรามาเริ่มกันเลย!

                เรียกใช้งาน Python

                การจะใช้งาน Python นั้น ทำได้หลายวิธีมากๆ มีทั้งแบบโหลดไฟล์มา Install ในเครื่อง และแบบใช้ Online ใน Website ได้เลย แต่ไม่ว่าจะแบบไหนมันก็ฟรีทั้งคู่! นี่คือข้อดีของ Python อย่างแรกเลย แถมใช้ได้หลายระบบปฏิบัติการด้วย (แต่ในบทความนี้ผมแนะนำให้ใช้ Google Colab ทำแบบ Online เลย ง่ายดี)

                ถ้าจะโหลดมาลงในเครื่อง

                • ก็ต้องโหลดอันนี้ก่อน https://www.python.org/downloads/ (แนะนำว่าให้โหลด version ล่าสุดไปเลย)
                • จากนั้นผมแนะนำให้โหลดโปรแกรมพวก Code Editor ที่เอาไว้ช่วยเขียน Code ซึ่งมีหลายอันมากๆ แต่ส่วนตัวผมใช้ https://code.visualstudio.com/ ซึ่งก็มี extension ที่เป็น Python ให้ใช้ (รวมถึงภาษาอื่นด้วย แม้แต่ M Code ของ Power Query ก็มี)

                ถ้าจะใช้ Python แบบ Online

                • ใช้ผ่านเว็บ https://www.python.org/shell/
                • ใช้ผ่าน Google Colab : https://colab.research.google.com/ (ผมแนะนำอันนี้ เพราะใช้งานง่ายดี ไม่ต้องลงโปรแกรม แค่กด new notebook ก็เข้าไปใช้งานได้แล้ว)

                ลองใช้งาน Python

                แสดงผลออกมาด้วย print และการอ้างอิงข้อความ

                • ถ้าเราใส่คำสั่ง (โดยกด + Code) ว่า print(123) แล้วสั่ง Run (กดปุ่ม Play) มันก็จะได้ผลลัพธ์ออกมาเป็น 123
                • คำสั่ง print ใช้ตัวพิมพ์เล็กนะ…
                • แต่ถ้าเรา print(แมว) มันจะ run ไม่ได้ ซึ่งต้องใส่ print(“แมว”) ถึงจะได้
                • สาเหตุเป็นเพราะมันคิดว่า แมว คือชื่อของตัวแปร ถ้าเราจะอ้างอิงถึงแมวที่เป็นข้อความ ต้องใส่ในเครื่องหมายคำพูด เช่น “แมว” (double quote) หรือ ‘แมว’ (single quote)
                print(123)
                print(แมว)
                print("แมว")
                print('แมว')
                หัดเขียนโปรแกรม Python สำหรับคนเป็น Excel มาก่อน : ตอนที่ 1 84

                ซึ่ง Concept นี้เหมือนกับการเขียนสูตรใน Excel เป๊ะเลย หากพิมพ์ในสูตร หลังเครื่องหมายเท่ากับ เราพิมพ์เลขได้ แต่พิมพ์ข้อความตรงๆ ไม่ได้ เพราะ Excel จะคิดว่าเป็นชื่อ เราต้องพิมพ์ข้อความในเครื่องหมายคำพูดต่างหาก (ต่างกันนิดหน่อยตรงที่ใน Excel ใช้ Single Quote ไม่ได้)

                หัดเขียนโปรแกรม Python สำหรับคนเป็น Excel มาก่อน : ตอนที่ 1 85

                การใส่ค่าให้ตัวแปรและอ้างอิงตัวแปร

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

                ตัวแปร = ค่า สูตร หรือ คำสั่งที่ต้องการ

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

                ข้อดีของตัวแปรคือ สามารถเรียกตัวแปรนั้นมาใช้งานต่อในบริบทอื่นได้อีก เช่นเดียวกับการอ้างอิง Cell / Name ในสูตรของ Excel เลย เช่น ถ้าใน Excel เราสามารถอ้างอิงค่าใน A1 มาใช้ต่อใน A2 ได้

                เหมือนกับว่าเราใส่ค่า 10 ลงไปในตัวแปรชื่อว่า A1 (ซึ่งเอาจริงๆ แล้ว Cell Reference ก็คล้ายๆ เป็นชื่อตัวแปรแบบนึง ราถึงไม่สามารถตั้ง Defined Name ซ้ำกับ Cell Reference ได้ไง) ซึ่งเราสามารถเขียนเอาค่า A1*2 ใส่ลงไปในตัวแปร A2 แล้วแสดงค่ามันออกมาได้

                หัดเขียนโปรแกรม Python สำหรับคนเป็น Excel มาก่อน : ตอนที่ 1 86

                ถ้าเป็นใน Python จะเขียนดังนี้ เห็นมะว่ามันทำได้เหมือนกันเลย!

                • ใส่ค่า 10 ลงไปในตัวแปรชื่อว่า A1
                • เอาค่า A1*2 ใส่ลงไปในตัวแปร A2 (ซึ่งจะได้ 10*2 = 20)
                • print ค่า A2 ออกมา เลยได้ 20 นั่นเอง
                A1=10
                A2=A1*2
                print(A2)
                หัดเขียนโปรแกรม Python สำหรับคนเป็น Excel มาก่อน : ตอนที่ 1 87

                การใส่ Comment

                เราสามารถใส่ Comment ใน Code โดยใส่เครื่องหมาย # นำหน้าเพื่อที่จะเขียน note อะไรบางอย่างเกี่ยวกับ code ของเราไว้ได้ (คล้ายกับการคลิ๊กขวา Insert Comment/Note ใน Excel)

                อะไรก็ตามที่อยู่หลังเครื่องหมาย # จะถูก Comment ไว้ทั้งหมด

                # อันนี้คือ Comment (นำด้วย #) ซึ่งมันจะไม่สนใจ Code หลังเครื่องหมายนี้เลย
                # จะใส่ comment ด้านบนของ code หรือ ด้านขวาก็ได้
                
                test=123   #เอาค่า 123 ใส่ในตัวแปรชื่อ test
                #test=456
                print(test)
                หัดเขียนโปรแกรม Python สำหรับคนเป็น Excel มาก่อน : ตอนที่ 1 88

                ในรูปผม print ค่าใน test ออกมาได้ 123 เพราะ codeบรรทัด test=456 ถูก comment ไว้ จึงไม่ถูก run นั่นเอง

                ตัวอย่างการใช้ตัวแปร และ comment

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

                firstName="Sira" #ใส่ข้อความว่า Sira ลงไปในตัวแปร firstName
                #แสดงค่าในตัวแปร firstName ออกมา ซึ่งก็คือ Sira
                print(firstName) 
                
                tempNum=10 #ใส่ตัวเลข 10 ลงไปในตัวแปร tempNum
                tempNum=5 #ใส่ตัวเลข 5 ทับลงไปในตัวแปร tempNum เหมือนเดิม
                print(tempNum)
                
                tempNum2=10 #ใส่ตัวเลข 10 ลงไปในตัวแปร tempNum2 
                #เอาค่า tempNum2 ที่เก็บค่า 10 ไว้ ไปคูณ 2 ก็จะได้ 20 แล้วเอาใส่ลงไปในตัวแปรเดิม
                tempNum2=tempNum2*2 
                print(tempNum2)
                หัดเขียนโปรแกรม Python สำหรับคนเป็น Excel มาก่อน : ตอนที่ 1 89

                นี่แหละคือประโยชน์ของการใส่ comment ครับ

                จบตอนแรกแบบง่ายๆ

                เดี๋ยวตอนต่อไปเราจะมาเรียนรู้เรื่องของประเภทข้อมูลใน Python ซึ่งจะมีหลากหลายกว่าใน Excel เพราะมันมีประเภทข้อมูลที่ไม่ได้มีค่าเดียว แต่เก็บข้อมูลเป็นชุดเลยด้วยครับ ซึ่งเป็น Concept ที่ Excel ปกติไม่มี (แต่มีใน Power Query นะ)

                จะเป็นไง รออ่านต่อตอนต่อไปครับ!

                สารบัญ Series Python

                • เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1

                  ผมเองเป็นคนนึงที่สนใจศึกษาเรื่องของทฤษฎีเกม (Game Theory) ซึ่งเป็นทฤษฎีที่ช่วยอธิบายเรื่องการตัดสินใจเชิงกลยุทธ์ได้ค่อนข้างดี (คำว่าทฤษฎีเกมในที่นี้ไม่ได้เกี่ยวกับเกมคอมพิวเตอร์แต่อย่างใด แม้ผมจะชอบมากเหมือนกัน 555)

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

                  ก่อนที่จะลงไปใช้ Excel กับมัน แน่นอนว่าผมต้องปูพื้นฐานหลักการของทฤษฎีเกมเบื้องต้นให้ทุกคนก่อนเนอะ

                  ทฤษฎีเกม (Game Theory) คืออะไร?

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

                  แต่ถ้าพอมาเป็นเรื่องของเชิงสังคมศาสตร์ การเมือง กลยุทธ ที่เกี่ยวข้องกับการตัดสินใจของคน มันพอจะมีทฤษฎีอะไรที่จะอธิบายได้หรือไม่ว่าทำไมผลลัพธ์ถึงออกมาเป็นอย่างนั้น? ทำไมแต่ละคน แต่ละฝ่ายถึงตัดสินใจเลือก choice นั้นๆ

                  ข่าวดีคือ มันมีทฤษฎีที่อธิบายการตัดสินใจของคนได้ และสิ่งนั้นคือทฤษฎีเกมนั่นเอง

                  สรุปแล้วถ้าเอาแบบเข้าใจง่ายๆ ทฤษฎีเกมคือการวิเคราะห์สถานการณ์ที่เรียกว่าเกม (Game) ที่เกิดขึ้นระหว่างผู้เล่น (Players) สองฝ่ายขึ้นไป โดยที่แต่ละฝ่ายมีการตัดสินใจเชิงกลยุทธ์ (Strategy) โดยแข่งขันกันเพื่อให้ได้ผลลัพธ์ของเกม (Payoff) ในหนทางที่ตัวเองได้รับประโยชน์มากที่สุด

                  ซึ่งเกมนั้นมีหลายลักษณะ เช่น

                  • เกมที่เล่นพร้อมกัน (Simultaneous) vs เกมที่มีคนเล่นตามลำดับ (Sequential)
                  • เกมที่แข่งขันครั้งเดียว (One-shot games) vs แข่งซ้ำหลายครั้ง (Repeated games)
                  • ผลรางวัลรวมคงที่ (Constant sum games) หรือผลรางวัลรวมไม่คงที่ (Non-constant sum games)

                  คนที่เริ่มต้นพัฒนาทฤษฎีเกมขึ้นมาก็คือนักคณิตศาสตร์ที่ชื่อว่า John von Neumann และนักเศรษฐศาสตร์ที่ชื่อว่า Oskar Morgenstern ในช่วงปี 1944 แต่ว่ามันยังใช้ได้ค่อนข้างจำกัด พูดง่ายๆ คือยังไม่เจ๋งพอ

                  ต่อมานักคณิตศาสตร์ที่ชื่อว่า John Nash (คนเดียวกับในหนังเรื่อง Beautiful Mind นั่นแหละ) ก็นำทฤษฎีเกมมาพัฒนาต่อจนสามารถนำมาประยุกต์ใช้ได้ในหลากหลายสถานการณ์มากขึ้นจนโด่งดัง ใครสนใจเรื่อง Game Theory ก็แนะนำว่าอย่าพลาดหนังเรื่องนี้ครับ สนุกดี

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 90
                  John Nash ตัวจริง และ ในหนัง Beautiful Mind

                  วิธีการหาจุดดุลยภาพ (คำตอบ) ของเกม

                  ในตอนนี้ผมจะนำเสนอ 3 วิธี ดังนี้

                  • Iterated Elimination of Dominated Strategy คือการดูว่า มีกลยุทธใดที่ห่วยกว่ากลยุทธ์อื่นอย่างชัดเจนหรือไม่ ถ้ามีก็ตัดทิ้งไปเรื่อยๆ จนเหลือกลยุทธ์ที่เจ๋งที่สุด
                  • Nash Equilibrium คือ ทางเลือกที่ดีที่สุด ภายใต้กลยุทธ์ที่คู่แข่งกำลังเล่นอยู่ นั่นคือถ้าคู่แข่งเลือกทางเลือกแบบนึงไปแล้ว เราจะไม่มีแรงจูงใจในการเปลี่ยนทางเลือกไปอีกทางนึง (แม้ไม่มีกฏเกณฑ์ใดๆมาบังคับให้เราอยู่ที่เดิม) จุดนั้นแหละคือ จุดสมดุลย์ของแนช หรือ Nash Equilibrium ซึ่งก็มาจากชื่อของ John Nash นี่แหละ (ซึ่งบางเกมจะมีจุด Nash Equilibrium ได้หลายจุดนะ)
                  • Maximin Equilibrium คือ เลือกลยุทธที่ให้ Pay off สูงสุด จากกลยุทธที่ให้ Pay off ต่ำ นั่นคือ ให้หาค่า Min มาก่อน แล้วค่อยดูว่าค่า Min อันไหนที่มาค่ามากที่สุด (Max)

                  ตัวอย่างการวิเคราะห์ทางเลือกในสถานการณ์สมมติ

                  สมมตินาย A เลือกได้ 3 Action คือ บน กลาง ล่าง และนาย B เลือกได้ 2 Action คือ ซ้ายกับขวา ซึ่งเมื่อ Cross กันจะมีความเป็นไปได้ 3*2=6 แบบ ซึ่งได้ Pay Off หรือผลตอบแทนดังตาราง (ผสมปรับค่าในตารางให้เป็น Text ก่อนพิมพ์)

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 91

                  ถ้าดูผ่านๆ เหมือนว่านาย B จะเลือกยากว่าจะไปซ้ายหรือขวาดี เพราะบางกรณีซ้ายให้ผลดีกว่า บางกรณีขวาให้ผลดีกว่า ส่วนนาย A ก็ดูเหมือนจะเลือกไม่ถูกเช่นกัน เพราะบางกรณีเหมือนจะดีกว่าอีกอัน

                  เรามาลองวิเคราะห์ด้วยแต่ละวิธีกันว่าคำตอบจะเป็นอย่างไร?

                  ถ้า Solve ด้วย Iterated Elimination of Dominated Strategy (ตัดทางเลือกที่ห่วยกว่าทิ้งไปเรื่อยๆ)

                  จะเห็นว่า สำหรับนาย A ทางเลือกกลาง เป็นทางเลือกที่ห่วยกว่าล่างเสมอ ดังนั้นตัดทิ้ง (ด้วยการกด Hide Row/Column ใน Excel 555)

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 92

                  สำหรับนาย B จากสิ่งที่เหลือ ทางเลือกซ้าย เป็นทางเลือกที่ห่วยกว่าขวาเสมอ ดังนั้นตัดทิ้ง

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 93

                  พอเห็นแบบนี้ A ก็จะต้องเลือกทางเลือกล่าง เพราะให้ผลดีกว่านั่นเอง และนี่คือคำตอบของวิธีแรกครับ

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 94

                  ถ้า Solve ด้วย Nash Equilibrium

                  ให้หาทางเลือกที่ดีสุดภายใต้ทางเลือกที่อีกคนเลือกก่อน เช่น

                  • สมมติให้ A เลือก บน แบบนี้ B จะเลือกขวา (เริ่มต้นที่จุดไหนก่อนก็ได้นะ)
                  • พอ B เลือกขวาแล้ว จะเห็นว่า A จะอยากเปลี่ยนไปเลือก ล่างแทน เพราะมันดีกว่า
                  • พอ B เห็น A เลือกล่างแล้ว จะพบว่าตัวเองก็อยากจะเลือกขวาอยู่ดี ไม่เปลี่ยนเป็นซ้ายแล้วเพราะมันแย่ลง
                  • ดังนั้นจุด ล่างขวา ก็คือ Nash Equilibrium ของเกมนี้นั่นเอง
                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 95

                  ถ้า Solve ด้วย Maximin Equilibrium

                  คราวนี้ลองมาดูวิธีสุดท้ายบ้าง นั่นคือ หาค่า Payoff ที่น้อยสุดออกมาก่อน ดังนี้

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 96

                  จากนั้นดูว่าทางเลือกใดได้ Min Pay Off สูงสุด

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 97

                  ซึ่งจะกลายเป็นว่าวิธีนี้ได้ผลลัพธ์คือ บนขวา ซึ่งได้ Payoff แค่ (7,4) แทนที่จะได้ (10,5) แบบ 2 วิธีก่อน

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

                  ตัวอย่างเคส Prisoner’s Dilemma

                  เคสตัวอย่างที่นิยมใช้ทฤษฎีเกมมาวิเคราะห์กันมากที่สุดและโด่งดังที่สุดก็คือ ความลำบากใจของนักโทษ (Prisoner’s Dilemma) นั่นเอง สถานการณ์คือ ตำรวจจับผู้ต้องสงสัยมาได้ 2 คน แต่หลักฐานยังไม่แน่นพอที่จะลงโทษหนักได้ (เช่น จำคุก 10 ปี) ทำได้แค่โทษเบาเท่านั้น (เช่น จำคุก 3 ปี)

                  ตำรวจผู้ที่รู้ซึ้งถึงทฤษฎีเกมจึงใช้แผนการจับผู้ต้องสงสัย 2 คนแยกห้องกัน และให้ข้อเสนอกับผู้ต้องสงสัยแต่ละคนว่า ถ้ายอมสารภาพจะลดโทษให้ (เช่น เหลือแค่จำคุก 1 ปี แต่ถ้าสารภาพทั้งคู่ก็จะเป็นจำคุก 5 ปี) โดยที่ผู้ต้องสงสัยแต่ละคนไม่สามารถสื่อสารกับเพื่อนได้แล้ว และไม่ค่อยมั่นใจในตัวเพื่อนเท่าไหร่ว่าจะทรยศหรือไม่?

                  ดังนั้นหน้าตาของตารางผลลัพธ์ของแต่ละการตัดสินใจจะเป็นแบบนี้ (ผมใส่ Pay Off ให้เป็นเลขติดลบ คือ ยิ่งจำคุกนาน ยิ่งแย่)

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 98

                  มาดูกันว่าเกมนี้ ถ้า Solve ด้วยวิธีคิดแต่ละแบบ จะให้ผลเป็นอย่างไร

                  ถ้า Solve ด้วย Iterated Elimination of Dominated Strategy

                  จะเห้นว่าทั้ง A และ B นั้น การสารภาพ(ทรยศเพื่อน) เป็นทางเลือกที่ให้ Pay Off กับตัวเองมากกว่าเสมอ ดังนั้นก็จะตัด Choice การไม่สารภาพทิ้งไปซะทั้งคู่เลย

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 99

                  ถ้า Solve ด้วย Nash Equilibrium

                  • สมมติว่าเริ่มจากจุด ไม่สารภาพทั้งคู่ จะเห็นว่า B จะมีแนวโน้มอย่างเปลี่ยนเป็นสารภาพ
                  • พอ B อยากจะเลือกสารภาพ ทำให้ A ก็จะสารภาพด้วย
                  • พอสารภาพทั้งคู่ จะไม่มีใครมีความอยากที่จะเปลี่ยนการตัดสินใจแล้ว
                  • สรุปแล้ว จุดสมดุลของแนช คือ สารภาพกันหมดเลย
                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 100

                  ถ้า Solve ด้วย Maximin Equilibrium

                  แบบนี้จะได้คำตอบเป็นสารภาพทั้งคู่เช่นกัน

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 101

                  สรุป Prisoner’s Dilemma

                  สรุปแล้ว ทั้งนาย A และ B ตัดสินใจสารภาพทั้งคู่

                  กลายเป็นว่า ผลลัพธ์ของเกม ทั้งคู่ต้องถูกจำคุกคนละ 5 ปี (รวมเป็น 10 ปี) ทั้งๆ ที่ถ้าทั้งสองคนร่วมมือกันไม่สารภาพทั้งคู่ ก็จะจำคุกแค่คนละ 3 ปี (รวมเป็น 6 ปี) เท่านั้น

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

                  อย่างไรก็ตาม เคสข้างบนนี้เป็น Prisoner’s Dilemma แบบ Classic คือเล่นทีเดียวจบเลย แต่ในชีวิตจริงมันอาจจะมีเกมแบบนี้ที่เล่นได้หลายรอบกับผู้เล่นคนเดิม (เรียกว่า Iterated Prisoner’s Dilemma) ซึ่งจะทำให้มีแนวโน้มที่จะร่วมมือกันมากขึ้นเรื่อยๆ ครับ เพราะเราสามารถเรียนรู้จากการตัดสินใจของอีกคนได้ และรู้ว่าถ้าทรยศในระยะยาวจะแย่กว่าร่วมมือไปเรื่อยๆ

                  ตัวอย่างเคส Battle of Sexes

                  เป็นเกมที่ต่างฝ่ายต่างชอบเล่นกลยุทธ์คนละอย่าง แต่การเล่นกลยุทธ์แบบเดียวกัน ให้ Payoff ดีกว่าแยกกันเล่น

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

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 102

                  มาดูกันว่าเกมนี้ ถ้า Solve ด้วยวิธีคิดแต่ละแบบ จะให้ผลเป็นอย่างไร

                  ถ้า Solve ด้วย Iterated Elimination of Dominated Strategy

                  จะพบว่าลำดับการพิจารณาค่อนข้างมีผล คือ ถ้าผู้ชายเล่นเกม ผู้หญิงต้องเล่นเกมตาม

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 103

                  แต่ถ้าพิจารณาให้ผู้หญิงเลือกดูซีรีส์ก่อน ผู้ชายต้องดูซีรีส์ตาม

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 104

                  ถ้า Solve ด้วย Nash Equilibrium

                  จะเห็นว่าเกมนี้มีจุดสมดุลของแนชอยู่ 2 ที่ คือ เล่นเกมทั้งคู่ กับ ดูซีรีส์ทั้งคู่

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 105

                  ถ้า Solve ด้วย Maximin Equilibrium

                  เรียนรู้ทฤษฎีเกม (Game Theory) : ตอนที่ 1 106

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

                  สรุป Battle of Sexes

                  ทางที่จะช่วยให้ทุกคนมีความสุขในระยะยาวคือ ให้คู่รักสลับกันเลือกสิ่งที่ตัวเองชอบนั่นเอง ดีกว่าต่างฝ่ายต่างไปทำสิ่งที่ตัวเองชอบมากกว่า โดยปราศจากแฟนเนอะ 555

                  จบตอนแรก

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

                  ใครสนใจศึกษาเพิ่มเติม ผมแนะนำ Playlist อันนี้ครับ

                  https://www.youtube.com/playlist?list=PLKI1h_nAkaQoDzI4xDIXzx6U2ergFmedo

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

                • Project Feasibility การวิเคราะห์ความเป็นไปได้ของโครงการ

                  Project Feasibility การวิเคราะห์ความเป็นไปได้ของโครงการ

                  เรื่องการคำนวณ Project Feasibility หรือการวิเคราะห์ความเป็นไปได้ของโครงการ อันนี้ก็เป็นอีกประเด็นนึงที่มีคนถามผมมาเยอะพอสมควร ดังนั้นก็เลยขอเอามาเขียนอธิบายกันอีกทีนะครับ

                  เรื่องของ Project Feasibility จริงๆนั้น มีวัตถุประสงค์ในการวิเคราะห์ว่าโครงการนั้นๆ จะอยู่รอดหรือไม่ ซึ่งต้องมีการวิเคราะห์ในหลายแง่มุมมากๆ เช่น การดำเนินงาน, การตลาด, เทคนิค, การเงิน, กฎหมาย เป็นต้น

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

                  หลักการของการวิเคราะห์ความคุ้มค่าการลงทุน

                  สิ่งที่เราได้รับ (ผลตอบแทน) มากกว่าสิ่งที่เราเสียไป (ต้นทุน) รึเปล่า?

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

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

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

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

                  • ตึก A ที่สวยกว่าจะดึงดูดคนให้เข้ามาใช้เยอะกว่าจนสร้างรายได้มากกว่าได้มั้ย?
                  • ตึก B ต้องมีค่าการตลาดเพิ่มเยอะกว่าตึก A มั้ย?
                  • การขายต่อ ราคาขายต่อของ A เยอะกว่า B มั้ย?

                  ซึ่งเรื่องพวกนี้ก็ยังเป็น Judgement นะ แต่ว่าเป็น Judgment ที่ยังมีความเป็นรูปธรรมมากขึ้นมาหน่อย ซึ่งเราอาจทำเป็นหลาย Scenario ก็ได้ เช่น Scenario ที่คิดว่าตึก A จะดูดคนมาได้มากๆ, Scenario ที่คาดหวังไว้, Scenario ที่ห่วยกว่าที่คาด อะไรแบบนี้ แล้วดูว่าช่วงของผลตอบแทนการลงทุนนั้นๆ เรารับได้มั้ย? เป็นต้น

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

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

                  แต่ทว่าจะมีอีกเรื่องนึงที่คนทั่วไปมักจะลืมคิดไป นั่นคือ เรื่องของค่าเสียโอกาส หรือพูดง่ายๆ คือ เงินในแต่ละช่วงเวลามีค่าไม่เท่ากัน นั่นเอง

                  เงินในแต่ละช่วงเวลามีค่าไม่เท่ากัน

                  การที่จะเข้าใจได้ว่าเงินแต่ละช่วงเวลามีค่าไม่เท่ากัน (Time Value of Money) นั้น แค่ตอบคำถามผมง่ายๆ ก็พอว่า “จะเอาเงิน 100 บาทเลยตอนนี้ หรือจะรอไปอีก 5 ปีแล้วได้ 100 บาทเท่าเดิม?” คงไม่มีคนสติดีที่ไหนที่จะต้องรอ 5 ปี จริงมั้ยครับ? เพราะถ้าเอาตอนนี้เลย เราสามารถเอาไปทำประโยชน์ต่างๆ ได้ทันที หรือถ้าจะเอาไปฝากธนาคารไว้ก่อน แล้วรอ 5 ปี แล้วค่อยถอนออกมา ป่านนั้นเงินต้องเยอะกว่า 100 บาทแล้วแน่นอน

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

                  • เอาเวลาในอนาคตกลับมาในอดีต เรียกว่า Present Value (PV)
                  • เอาเวลาในอดีตไปอนาคต เรียกว่า Future Value (FV)

                  ใครสนใจเรื่องพวกนี้สามารถอ่านบทความที่ผมเคยเขียนเอาไว้ได้ครับ

                  เทคนิคการวิเคราะห์ความคุ้มค่าการลงทุน

                  ทีนี้มันมีเทคนิคที่เอาไว้วิเคราะห์ความคุ้มค่าการลงทุนโดยเฉพาะ ซึ่งมีอยู่ 3 ตัวที่เป็นที่นิยม คือ

                  • Payback Period หรือ ระยะเวลาคืนทุน ซึ่งวิธีนี้ส่วนมากจะไม่ได้คิดเรื่อง Time Value of Money ซึ่งผมมองว่าเป็นวิธีที่ไม่ ok เท่าไหร่
                  • NPV (Net Present Value)
                    • วิธีนี้จะเป็นการทำให้เงินทุกก้อน ย้อนมาที่จุดปัจจุบันเหมือนกันหมดจะได้เทียบกันได้ (PV ทุก Cashflow) แล้วเอามา Net กัน
                    • ถ้าสุดท้ายได้ค่า NPV เป็นบวกแสดงว่ามีกำไร
                    • วิธีนี้ลำบากตรงที่ต้องคิดว่าจะ Discount เงินด้วยค่าเสียโอกาส หรือ Rate of Return กี่ % ดี? ซึ่งถ้าแต่ละคนคิด % ไม่เหมือนกัน อาจได้ NPV ต่างกันก็ได้
                  • IRR (Internal Rate of Return)
                    • วิธีนี้เป็นการคิดว่า %Rate of Return เท่าไหร่ ที่ทำให้ได้ NPV เป็น 0 พอดี
                    • ถ้าค่า IRR ยิ่งมาก แสดงว่ายิ่งน่าลงทุน
                    • ข้อดีคือเหมาะกับนำไปเปรียบเทียบกับโครงการต่างๆ ได้ หรือจะเทียบกับการลงทุนประเภทอื่นก็ได้
                    • ข้อเสียคือ มีโอกาสที่ IRR จะมีหลายค่าได้ด้วย
                    • ส่วนตัวผมชอบวิธีนี้ที่สุดเลยครับ ^^

                  รายละเอียดการคิด NPV กับ IRR อ่านได้ในนี้

                  วิธีคำนวณ IRR ใน Excel

                  ให้สร้าง Range ของ Net Cash Flow ขึ้นมาก่อน โดยที่ช่องแรกคือ End of Period 0 ไล่ไปเรื่อยๆ

                  หลักการสำคัญคือ

                  • เงินเข้าโครงการใส่เป็นค่าบวก
                  • เงินออกจากโครงการใส่ติดลบ (ซึ่งแปลว่าเงินลงทุนจะเป็นลบนั่นเอง)
                  • ปีไหน ไม่ได้ไม่เสียเงิน ก็ต้องใส่เลข 0 ด้วย ห้ามปล่อยว่างเด็ดขาด!!

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

                  • โครงการ A ลงทุน 1 ล้านบาท แล้วได้เงินคืนทุกปี ปีละ 300,000 จำนวน 4 ครั้ง
                  • โครงการ B ลงทุน 1 ล้านบาท ได้เงินคืนปีเว้นปี ปีละ 330,000 จำนวน 4 ครั้ง

                  วิธีคิดใน Excel ต้องทำแบบนี้

                  Project Feasibility การวิเคราะห์ความเป็นไปได้ของโครงการ 107

                  ถ้าเป็นแบบนี้เราก็จะตอบได้ว่าโครงการ A น่าสนใจมากกว่า เพราะได้ IRR 7.7% ซึ่งมากกว่า 7.5% ของโครงการ B นั่นเอง

                  หรือถ้าอยากจะรู้ IRR เมื่อผ่านไปในแต่ละปี ก็เขียนสูตรมันแบบนี้เลยก็ได้ โดย Lock $จุดเริ่มต้นไว้อย่างเดียว เผื่อบางโครงการ IRR ดีมาก แต่จะดีก็ต่อเมื่ออยู่จนจบโครงการเท่านั้น แบบนี้บางทีเราอาจจะรอไม่ไหวก็ได้

                  =IRR (values, [guess])

                  ในบางกรณี เราต้องใส่ค่า guess ลงไปในสูตร IRR กรณีที่มันหาค่าแล้วขึ้น #NUM! ด้วย (เช่น ช่อง E7 ถ้าไม่ใส่ guess ลงไป ผลจะ error แต่พอผมใส่ค่าติดลบนิดหน่อยลงไป ค่าก็ ok เลย)

                  project feasibility

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

                  คำนวณ IRR ใน Power BI

                  ก่อนอื่นก็เอาข้อมูลเข้า Power BI ซะ โดยใส่บรรทัดละ 1 Period

                  Project Feasibility การวิเคราะห์ความเป็นไปได้ของโครงการ 108

                  แต่ปรากฏว่าใน Power BI มันไม่มี IRR ให้ใช้ มีแต่ XIRR ซึ่งต้องระบุวันที่ไปด้วย (แต่ข้อดีคือ สามารถระบุวันที่วันไหนก็ได้ แต่ละ cashflow ห่างกันยังไงก็ได้ นั่นคือวันไหนไม่มี Cashflow ก็ไม่ต้องใส่ค่าได้ด้วย แต่ถึงใส่เป็น 0 ก็ไม่ได้ผิดอะไร รายละเอียดอ่านได้ในนี้)

                  ดังนั้นผมก็เลยต้องสร้างคอลัมน์วันที่ขึ้นมาก่อน (จะทำใน Power Query หรือ DAX ก็ได้) ซึ่งผมไม่มีวันแบบเป๊ะๆ เลยใส่เป็นวันสิ้นปีไปเลย ด้วย Dax New Column ดังนี้

                  Date = 
                  VAR CurrentYear=YEAR(TODAY())
                  RETURN DATE(CurrentYear+Data[สิ้นปีที่],12,31)
                  Project Feasibility การวิเคราะห์ความเป็นไปได้ของโครงการ 109

                  จากนั้นก็สร้าง Measure ที่คิด IRR ขึ้นมา แบบนี้ แล้วกำหนด Format เป็น % แล้วเอาไปใส่ Visual ที่ต้องการซะ

                  IRR = XIRR(Data,Data[NetCashFlow],Data[Date])
                  Project Feasibility การวิเคราะห์ความเป็นไปได้ของโครงการ 110

                  แค่นี้ก็จบแล้ว สบายๆครับ กับการคำนวณ IRR ทั้งใน Excel และ Power BI ^^ ถ้าใครสงสัยตรงไหนยังไงก็ถามได้เลยครับ

                • สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ

                  ความสามารถอย่างนึงที่ Excel มีมานานมากแล้ว และทำได้ดีมากๆ ก็คือเครื่องมือ Solver ซึ่งเป็น Add-in ที่มีมาให้กับ Excel อยู่แล้วไม่ต้องไปโหลดที่ไหน (แค่ต้องกด Enable ให้มันทำงานแค่นั้น)

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

                  และในบทความนี้ผมจะขอยกตัวอย่างการใช้ Solver ที่จะช่วยแก้ปัญหาต่างๆในการทำงานให้ เพื่อที่เพื่อนๆจะได้นำไปปรับใช้กับงานของตัวเองได้ครับ โดยมีตัวอย่างหลากหลายตั้งแต่ Product Mix, การจัดงาน, การตั้งราคา, เส้นทางการวิ่งรถ และการตัดแบ่งวัตถุดิบ บอกได้คำเดียวว่า “พลาดไม่ได้เด็ดขาด!”

                  ขั้นตอนการใช้ Solver

                  การใช้ Solver นั้นมีขั้นตอนคร่าวๆ ดังนี้

                  1. Enable Solver Add-in (ถ้ายังไม่ได้ทำ) : ให้ไปที่ File -> Excel Options -> Add-in -> Go… -> ติ๊ก Solver Addin
                    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 111
                  2. เขียนสูตรผูกความสัมพันธ์ เพื่อสร้าง Model ระหว่าง Variable Input (ตัวแปรต้น) , Constrain (ข้อจำกัด) และ Objective Output (ผลลัพธ์เป้าหมาย) ที่อยากได้ให้เรียบร้อย นั่นคือ หากลองเปลี่ยน Input แล้ว Output ต้องเปลี่ยนตามอย่างถูกต้องให้ได้ซะก่อน
                  3. เรียกใช้ Solver โดยกำหนดว่าต้องการ Maximize หรือ Minimize ค่า Objective Output โดยเลือกว่าจะให้เปลี่ยน Variable Input ตัวไหน ภายใต้เงื่อนไขของข้อจำกัด (Constrain) อะไร

                  หลักการทำงานของ Solver

                  หลักการทำงานของ Solver มันจะพยายามเปลี่ยนค่า Variable Input ไปเรื่อยๆ (สูงสุดได้ 200 Cells) ภายใต้ข้อจำกัดที่เรากำหนด เพื่อหาคำตอบว่าค่าใดทำให้เกิด Objective Output ได้ตรงตามที่เราต้องการมากที่สุด โดยที่มี Objective ได้แค่ค่าเดียวเท่านั้น (ถ้าเรามีเป้าหมายหลายอย่าง ต้องพยายามรวบเป็นค่าเดียว รวมถึงสามารถใส่ Weight ช่วยเอาได้)

                  เรื่องที่สำคัญ ที่หลายคนมักมองข้ามคือการเลือก Solving Method ว่าเป็นแบบใด ซึ่งเลือกได้ 3 แบบ คือ

                  • Simplex LP : ความสัมพันธ์ระหว่าง Input กับ Output, Input และ Constrain นั้นทุกตัวมีความต่อเนื่องกันเป็นเส้นตรง (LP=Linear Programming นั่นคือตัวแปร x ยกกำลังแค่ 1) ซึ่งรูปแบบนี้จะการันตีได้ว่า ถ้า Solver เจอคำตอบแล้วจะเป็นคำตอบที่ดีที่สุดระดับ Global แล้วจริงๆ
                  • GRG Non Linear : ความสัมพันธ์ระหว่าง Input กับ Output อย่างน้อยตัวใดตัวหนึ่งมีความต่อเนื่องกันแต่ไม่ได้เป็นเส้นตรง (เช่น เส้นโค้ง) ถ้าเป็นแบบนี้ อาจจะมีบางกรณีที่เส้นโค้งนั้นอาจจะหาค่าที่ดีที่สุดได้แค่ภายใต้ขอบเขต Local เท่านั้น ไม่ใช่ระดับ Global เพราะมันดันเข้าใจว่าจุดยอดเขาที่เจอคือจุดที่ Optimize แล้ว ทั้งๆ ที่จริงๆ ยังมียอดเขาที่สูงกว่าอีกยอดนึง
                    • วิธีทำให้ค่าที่ได้ดีขึ้นคือ ติ๊ก Option Multi Start เพื่อให้เริ่มหาที่หลายๆ จุด
                  • Evolutionary : ความสัมพันธ์ระหว่าง Input กับ Output อย่างน้อยตัวใดตัวหนึ่งไม่ได้มีความต่อเนื่องกัน เช่น มี IF, VLOOKUP, INDEX ทำให้ค่าผลลัพธ์หรือ Constrain เวลาคำนวณจาก Variable มันจะกระโดดไปมาได้ ซึ่งวิธีสุดท้ายนี้ผลลัพธ์จะอยู่ในระดับ Good Solution คือ ดีกว่าค่าที่ใส่ลงไปแต่แรกเท่านั้น ไม่ได้ดีในระดับ Local ด้วยซ้ำ
                    • วิธีที่ช่วยได้คือลอง Solve หลายๆ รอบ รวมถึงเพิ่ม Mutation Rate ใน Option เป็นต้น

                  ในบทความสอนการ Optimize ด้วย Calculus ผมเคยอธิบายความหมายของ Global, Local Max Min ไว้ ลองไปอ่านดูได้ครับ

                  เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 3
                  https://www.mathsisfun.com/algebra/functions-maxima-minima.html

                  ถ้าเป็นไปได้ ควรจะทำให้ Solve แบบ Simplex LP ให้ได้ เพราะมันทั้งเร็วที่สุดและได้ค่าที่ Optimize จริงๆ ถ้าใครงงและเลือกไม่ถูก ผมก็แนะนำว่าให้เลือก Simplex LP ก่อน ถ้ามัน Solve ไม่ได้ค่อยไปเลือก Non-Linear และ Evolutionary ตามลำดับครับ 555

                  ซึ่งขั้นตอนที่ยากที่สุดในการทำงานกับ Solver ก็คือขั้นตอนการเขียนสูตรผูกความสัมพันธ์เพื่อสร้าง Model ขั้นตอนนี้มันก็ใช้ทักษะการเขียนสูตรซึ่งก็มีทั้งยากและง่ายแล้วแต่สถานการณ์ บางทีก็เป็นแค่สูตร SUM ธรรมดา บางทีอาจจะมีเงื่อนไขมากมายทำให้ต้องมี IF, SUMIFS, SUMPRODUCT, VLOOKUP, INDEX, MATCH หรืออะไรเต็มไปหมดแล้วแต่ความซับซ้อนของ Model ที่แต่ละคนต้องทำขึ้นมา

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

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

                  ตัวอย่าง 1 : Product Mix ที่ทำให้เกิดกำไรสูงสุด

                  ตัวอย่างนี้ผมเคยทำเป็นคลิปวีดีโอไว้ให้แล้ว เป็นตัวอย่างสุดฮิตที่เวลาสอน Solver ก็ต้องมีการพูดถึงเคสแบบนี้ นั่นก็คือ เราเป็นโรงงานผลิตสินค้า สามารถผลิตสินค้าได้หลายชนิด แต่ละชนิดก็มีกำไรต่อหน่วยต่างกัน และต้องใช้ทรัพยากรต่างกัน ทีนี้โรงงานเรามีทรัพยากรจำกัด จึงต้องคิดว่าจะใช้ทรัพยากรที่มีนั้นผลิตสินค้าอะไรบ้างอย่างละกี่ชิ้น เพื่อให้ได้กำไรสูงสุดนั่นเอง (ปัญหาแบบนี้เรียกว่า Product-Mix Problem ครับ)

                  Step การทำงาน

                  ผูกสูตร

                  การผูกสูตรใน Model นี้ก็ไม่มีอะไรมากไปกว่าการคูณและการบวกธรรมดาๆ แต่เพื่อให้เขียนสูตรสั้นลงเลยใช้ SUMPRODUCT มาช่วยแทนการคูณทีละคู่แล้วบวกกันแค่นั้นเอง

                  ตอนแรกผมใส่ Input ก็คือจำนวนที่จะผลิตมั่วๆ เป็นเลข 1,2,3 ไปก่อน เพื่อให้เห็นว่ามันสามารถคำนวณกำไรและทรัพยากรที่ใช้ไปได้อย่างถูกต้องจริงๆ

                  เช่นในช่องกำไรที่เขียนว่า

                  =SUMPRODUCT(C3:E3,C5:E5)

                  ถ้าเขียนแบบยาวๆ ก็ต้องทำแบบนี้ ( คือ คูณกันแต่ละคู่ แล้วค่อยจับรวมกัน ซึ่งมันคือ SUMPRODUCT นั่นเอง)

                  =C3*C5+D3*D5+E3*E5

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

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 112

                  เรียกใช้ Solver

                  พอมั่นใจว่าผูกสูตรเสร็จหมดแล้วก็เรียกใช้ Solver โดยไปที่ Data -> Solver ได้เลย แล้วระบุสิ่งต่างๆ ดังนี้

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 113
                  • Objective (เป้าหมาย) : เป้าหมายของเราในที่นี้คือ ต้องการได้กำไรสูงสุด ดังนั้นต้องเลือกช่อง G5 (กำไร) และเลือกเป็น Max (สูงสุด) นั่นเอง
                  • Variable (ตัวแปรต้น) : การจะไปถึงเป้าหมายที่ต้องการนั้นต้องเปลี่ยนค่าในช่องไหน ซึ่งก็คือจำนวนที่จะผลิตนั่นเอง (C3:E3)
                  • Constrain (ข้อจำกัด) : ข้อจำกัดคือ ทรัพยากรที่ใช้ (F9:F11) ต้องไม่เกิน (น้อยกว่าหรือเท่ากับ) ทรัพยากรที่มีอยู่ (G9:G11) และการผลิตสินค้า ต้องมีจำนวนชิ้น (C3:E3) เป็นจำนวนเต็ม (int) เท่านั้น

                  Solving Method : สำหรับโจทย์ข้อแรกนั้น เราเลือก Simplex LP ได้ เพราะความสัมพันธ์ระหว่าง Objective กับ Variable และ Constrain กับ Variable นั้นเป็นเส้นตรงทั้งหมด (ตัวแปร x ทุกตัว (C3,D3,E3) นั้นยกกำลัง 1 ทั้งหมดเลย) ดังนี้ จึงควรเลือก Simplex LP นั่นเอง

                  • Objective กำไร = Maximize : 500C3 + 300D3 + 100E3
                  • แรงงาน = 12C3 + 1.5D3 + 0.5E3 <=500
                  • พื้นที่โกดัง = 12C3 + 8D3 + 1E3 <=2200
                  • เงินลงทุน = 300C3 + 150D3 + 50E3 <=70000

                  พอ Solve ปุ๊ปมันจะขึ้นแบบนี้ ซึ่งบอกว่า

                  • Solver found a solution = ได้คำตอบแล้ว
                  • All Constraints and Optimality conditions are satisfied. = ทำตามเงื่อนไขและ optimize ค่าได้ทั้งหมด

                  แถมยังมี tips บอกมาข้างล่างอีกว่า ถ้าใช้ Simplex LP แล้ว แปลว่าเจอ global optimal solution แล้วนั่นเอง

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 114

                  พอกด ok จะเห็นผลลัพธ์เป็นดังนี้

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 115

                  ซึ่งแปลว่ามันแนะนำให้ผลิต A 150 ชิ้น C 400 ชิ้น โดยไม่ต้องผลิต B เลยนั่นเอง แบบนี้จะทำให้ได้กำไรสูงสุด คือ 115,000 บาทนั่นเอง

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

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 116

                  ตัวอย่าง 2 : จัดงานให้ช่าง

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

                  โดยที่ค่าจ้างช่างสำหรับแต่ละงานเป็นดังนี้

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 117

                  เราจะสร้างตาราง Variable ขึ้นมาอีกตารางนึง ว่าจะจ้างช่างสำหรับงานนั้นๆ หรือไม่ ถ้าจ้างจะเป็นเลข 1 ไม่จ้างเป็นเลข 0 เพื่อที่จะเอา 2 ตารางคูณกัน และนำมาบวกกันให้ได้ต้นทุนรวม

                  นอกจากนั้นเราทำการคำนวณจำนวนงานรวมของแต่ละแถวออกมา เพื่อจะได้ใส่เงื่อนไขว่าไม่เกิน 2 (ช่าง 1 คนรับได้สูงสุด 2 งาน) และจำนวนงานรวมของแต่ละคอลัมน์ว่าจะต้องเป็น 1 (แต่ละงานทำแค่ 1 คน)

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 118

                  ทีนี้ถ้าเราเอา Model นี้ไปรัน Solver เลยตรงๆ เราต้องมานั่งเล็ง Variable Input โดยหาทางเว้นงานที่ช่างบางคนทำไม่เป็นอีก (ที่เป็นตัว x) ซึ่งจะยุ่งยากมาก ดังนั้นเราจึงมี Trick ในการทำคือ ให้ใส่ Cost ในงานที่ทำไม่เป็นไปสูงๆ เลย เช่น เลข 99999 Solver จะได้ไม่เลือกทำงานนั้นให้เรา

                  ดังนั้น Model จะออกมาเป็นดังนี้

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 119

                  ทีนี้ก็เรียกใช้ Solver โดยที่

                  • Objective : เราต้องการต้นทุนต่ำสุด คราวนี้จึงต้องเลือก Min ช่อง H3
                  • Variable : ช่องที่จะให้ Solver เปลี่ยนค่าเล่นได้ คือ B13:F19
                  • Constrain :
                    • ผลรวมแต่ละคอลัมน์ (B20:F20) เป็น 1
                    • ผลรวมแต่ละแถว (G13:G19) ไม่เกิน 2
                    • ค่า Variable B13:F19 เป็น Binary (Bin) คือได้แค่ค่า 0,1 เท่านั้น
                  • Solving Method : เป็น Simplex LP เนื่องจากสมการเป็นเส้นตรงทั้งหมดเช่นเดิม
                    • เช่น ต้นทุนรวม = 1300B13+1200C13+1300D13+2100E13…. ไปเรื่อยๆ ทุกตัวเป็นกำลัง1 หมด
                    • ข้อจำกัด เกิดจาก B13+C13+D13+E13… <=2 ทุกตัวก็กำลัง 1 หมด

                  สรุปเลือกดังนี้

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 120
                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 121

                  กำหนดเงื่อนไขของช่างแต่ละคน งานแต่ละงาน

                  ถ้าหากช่างแต่ละคน Capacity ไม่เท่ากัน ก็อาจกรอกค่า Capacity เอาไว้ในตารางได้ เช่น ให้กด Change ที่ Constrain เดิม โดยเปลี่ยน Constraint จากเลข 2 เป็น Capacity ที่เตรียมไว้นั่นคือ H13:H19 ได้เลย

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 122

                  ถ้างานแต่ละงานต้องการจำนวนช่างไม่เท่ากัน ก็ระบุเงื่อนไขได้คล้ายๆ กับเรื่องของ Capacity เลย ง่ายมั้ยล่ะ!

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 123

                  ตัวอย่าง 3 : การตั้งราคาสินค้า

                  สมมติว่าเราเป็นบริษัทที่มีผลิตภัณฑ์อยู่ 2 ตัว เป็นสินค้าประเภทเดียวกันแต่เป็นรุ่นเล็กกับรุ่นใหญ่ การตั้งราคาตัวนึงจะส่งผลไปที่ราคาอีกตัวนึงได้ด้วย

                  จากการวิจัยพบว่าความสัมพันธ์ระหว่าง ราคาต่อหน่วย และปริมาณที่จะขายได้ของผลิตภัณฑ์แต่ละตัวเป็นดังนี้

                  • Q1 = 1000-2P1+1.2P2
                  • Q2 = 3000+0.1P1-0.5P2

                  เราอยากรู้ว่าตั้งราคาสินค้าทั้งสองตัวนี้เป็นเท่าไหร่ดีจึงจะได้ผลกำไรสูงสุด โดยที่ปัจจุบันตั้งอยู่ที่ P1=1500 และ P2=5000 ตามลำดับ

                  ซึ่งเราจะเขียน Model คำนวณรายได้รวมออกมาได้ดังนี้

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 124

                  นอกจากนี้หากเราอยากให้ปริมาณออกมาเป็นบวกเสมอ ก็ใส่ Constrain เข้าไปได้ ส่วนราคาถ้าอยากได้จำนวนเต็มก็ใส่เงื่อนไขเข้าไปได้เช่นกัน

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 125

                  แต่ข้อนี้หาก Solve ด้วย Simplex LP เหมือนเดิมมันจะไม่ยอมแล้ว

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 126

                  หากติ๊กที่ Linearity Report แล้ว Ok จะเห็นว่าปัญหาอยู่ที่ไหน

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 127

                  ที่สมการที่เราคิดรายได้รวมไม่ใช่ Linear เพราะมันเกิดจากการเอาราคาไปคูณปริมาณ ซึ่งปริมาณดันคำนวณมาจากราคาอีกทีนึงด้วย ทำให้เกิด Term ที่เป็นราคากำลังสองขึ้นมานั่นเอง

                  ดังนั้นในข้อนี้เราต้องแก้ Solving Method เป็น GRG Nonlinear แล้วค่อย Solve ครับ

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 128

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

                  หรือถ้าเรามีเงื่อนไขอะไรเพิ่มอีก ก็ใส่ไป เช่น ราคา Product1 ห้ามเกิน 2000 ไม่งั้นแพงไป ก็แค่ใส่ Constrain เพิ่มไปเลยครับ

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 129

                  ตัวอย่าง 4 : จัดเส้นทางการเดินรถโดยที่ต้นทุนต่ำสุด

                  สำหรับตัวอย่างนี้จะเป็นเรื่องของการ Optimize เส้นทางการเดินรถเพื่อให้พนักงานขายเดินทางไปเยี่ยมลูกค้า โดยรู้ตำแหน่งของลูกค้าแต่ละเจ้าว่าอยู่พิกัดไหน สิ่งที่เราต้องการคือ หาเส้นทางการวิ่งรถโดยที่ใช้ระยะทางการวิ่งที่น้อยที่สุด เพื่อทำให้ Cost ต่ำสุดนั่นเอง ปัญหาแบบนี้มีชื่อภาษาอังกฤษเรียกว่า Travelling salesman problem

                  สมมติว่าพิกัดทั้ง 10 ตำแหน่งเป็นดังนี้

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 130

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

                  ระยะทางระหว่างสองจุด (ด้านเฉียงของสามเหลี่ยมมุมฉาก)

                  =SQRT((X1-X2)^2+(Y1-Y2)^2)

                  สรุปได้ดังนี้

                  =SQRT(($C18-F$15)^2+($D18-F$16)^2)
                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 131

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

                  =IF(SQRT(($C18-F$15)^2+($D18-F$16)^2)=0,9999,SQRT(($C18-F$15)^2+($D18-F$16)^2))
                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 132

                  ต่อไปเราจะสร้างการจัดสินใจ ว่าจะเลือกวิ่งเส้นทางไหน โดยการตัดสินใจให้เป็นเลข 0 (ไม่วิ่ง) ,1 (วิ่ง) และคำนวณผลรวมด้านขวาและด้านล่างออกมา จากนั้นคำนวณระยะทางรวมจากการใช้ SUMPRODUCT ปกติ

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 133

                  จากนั้นเรียกใช้ Solver โดย Min ระยะทางรวม และให้ Variable เป็น F32:O41 แล้วตั้งให้ Constrain เป็นแบบ Binary

                  นอกจากนั้นตั้ง Constrain

                  • ให้ผลรวมด้านขวาเป็น 1 ทั้งหมด (หมายถึงว่า ทุกจุดเป็นต้นทางแค่ 1 ครั้ง)
                  • ให้ผลรวมด้านล่างเป็น 1 ทั้งหมด (หมายถึง ทุกจุดเป็นปลายทางแค่ 1 ครั้ง)
                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 134

                  พอ Solve ปุ๊ปมันจะได้แบบนี้

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 135

                  จะเห็นว่ามันทำการจับคู่ Point ที่อยู่ใกล้กัน แล้ววิ่งหากันเองซะงั้น (เช่น จาก 1->9 และ 9->1 ใหม่) เพราะเงื่อนไขที่เราตั้งไว้มันไม่ครอบคลุมว่าห้ามวิ่งกลับที่เดิมนั่นเอง

                  หากเราจะป้องกันไม่ให้เกิดเหตุการณ์ที่ไม่ต้องการ ก็ต้องใส่เงื่อนไขเพิ่มไปอีก เช่น เส้น1ไป9 + เส้น 9ไป1 ต้องได้ <=1 (คือห้ามเป็น 1 ทั้งคู่) พอ Solve ปุ๊ป Loop ปัญหานั้นๆ ที่เราดักไว้ก็จะหายไป

                  แต่เราต้องไปไล่กำจัด Loop ปัญหาอีกเรื่อยๆ จนหมด เช่น ถ้าเรากำกจัดวิ่งไปกลับของ 2 จุดได้ เราก็ต้องมาดักกรณีวิ่งไปกลับแบบ 3 จุดอีก เช่น จากรูป มันบอกว่าจาก 1->9 ->6 ->1 ใหม่ เราก็ต้องมาดักเงื่อนไขอีกว่า N32+K40+F37 <= 2 คือ ห้ามเป็น 1 ทั้ง 3 อัน เป็นต้น

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 136
                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 137

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

                  เปลี่ยนมุมมองการแก้ปัญหาไปใช้ All Different

                  เราจะเปลี่ยนมุมมองการแก้ปัญหา ไปใช้การเลือกลำดับการวิ่ง 1-10 แทน โดยที่ลำดับนี้เป็นเลขแบบไม่ซ้ำกัน แล้วคำนวณมาว่าวิ่งลำดับใดจะให้ผลลัพธ์ที่ดีที่สุด ซึ่งความสัมพันธ์ของสูตรจะไม่ได้เป็นเส้นต่อเนื่องกันแล้ว จึงต้องใช้แบบ Evolutionary มาช่วย ควบคู่กับ Constrain แบบ All Different (ตัว Variable จะได้ค่าเป็น Integer ไม่ซ้ำกัน)

                  ดังนั้นเราจะแก้ Model ใหม่เป็นดังนี้ เราจะให้ Solver ใส่เลข 1-10 ลงไปในลำดับ (คอลัมน์ D) นี้

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 138

                  โดยที่เราเขียนสูตรรอไว้แล้วว่าพอมีเลข 1-10 แล้วระยะทางรวมจะเป็นเท่าไหร่

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 139

                  จากนั้นใน Solver ก็ตั้งค่าดังนี้

                  • หลักๆ คือให้ Variable >=1 และ <=10 และมีค่าต่างกันทั้งหมด (dif)
                  • ส่วน Solving Method ใช้ Evolutionary เพราะค่าจาก INDEX หรือการ Lookup มันกระโดดไปมาไม่ต่อเนื่องกันแน่นอน
                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 140

                  ซึ่งพอ Solve แล้วมันจะคิดนานกว่า Simplex LP มากๆ เพราะมันต้องสุ่มตัวเลขใส่ลงไปจนกว่าจะได้คำตอบ (อันนี้ก็ต้องรอไปนะ…)

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 141

                  มันให้คำตอบออกมาว่า วิ่งจาก 9->6->7->10->3->2->4->1->8->5->9 ซึ่งจะมีระยะทางรวม 66.761

                  โดยมันขึ้นมาว่า

                  • Solver cannot improve the Current solution = ทำให้คำตอบดีขึ้นกว่านี้ไม่ได้ (ภายใต้เวลาที่กำหนด เช่น ภายใน Max Time without improvement ที่ตั้งไว้ มันหาตัวที่ดีขึ้นไม่ได้แล้ว)
                  • All Constraints are satisfied. = ทำตามเงื่อนไขได้ทั้งหมด

                  สังเกตว่ามันไม่ได้บอกว่าคำตอบที่ได้นั้น Optimal แค่บอกว่าทำให้ดีขึ้นไม่ได้แล้ว นั่นคือยังมีความเป็นไปได้ที่ผลลัพธ์ยังดีขึ้นได้กว่านี้อีก ซึ่งเราสามารถลองกด Solve ใหม่ได้เพื่อดูว่าค่าดีขึ้นหรือไม่ โดยอาจเปลี่ยน Mutation Rate ให้เยอะขึ้น ให้ Max Time มากขึ้น เป็นต้น

                  แต่ที่ผมลองเลขที่ได้ไม่เปลี่ยนจาก 66.761 แล้ว แต่อาจได้ค่าวนกลับอีกทางคือ

                  9->5->8->1->4->2->3->10->7->6->9 ซึ่งก็คือวงเดิมนี่แหละ แค่กลับอีกทาง

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 142

                  หากเราลองเอามา Plot กราฟ (Sort ตามลำดับที่ Solve ได้) ก็จะได้ดังนี้

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 143

                  สมมติว่ามีข้อกำหนดว่า ต้องเริ่มที่จุด 1 แล้วจบที่ จุด 10 แบบไม่ต้องวน

                  เราลองแก้ Model เล็กน้อย โดย Fix ลำดับ 1 กับ 10 เอาไว้เลย ดังนี้

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 144

                  แล้วเราก็ไปแก้ตอนคิดระยะทางว่าไม่ต้องวนกลับมาจุดแรก

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 145

                  จากนั้นการตั้งค่า Solver ก็ให้แก้เลขจาก 2-9 แทน และขอบเขตตัวแปรก็น้อยลงเป็นดังนี้

                  Tips : ถ้าไม่อยากมานั่งแก้ Range ก็สามารถใช้การตั้งชื่อ Defined Name มาช่วยได้ครับ

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 146

                  พอ Run แล้วปรากฏว่า Solver ไม่ยอมให้ AllDifferent มีค่าขอบเขต Lower โดยไม่ใช่ 1 และก็บอกว่าค่า Upper จะต้องเท่ากับจำนวน Variable เท่านั้น แปลว่าผมต้องใส่เป็นเลข 8

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 147

                  ดังนั้นผมจะแก้ Model อีกเล็กน้อย ให้มันใส่เลข 1-8 ก็ได้ แล้วผมค่อยบวก 1 ให้เป็น 2-9 อีกที

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 148

                  ซึ่งหากลองใส่เลข 1-10 ตามลำดับไปก่อน แล้วPlot กราฟ จะได้ระยะทางและรูปร่างการวิ่งดังนี้ อันนี้คือแบบไม่ได้วางแผนใดๆ ทำตามลำดับข้อมูลปกติ

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 149

                  ทีนี้เราจะลองหาว่าจะวิ่งยังไงให้ดีที่สุด?

                  solver

                  พอกด Solve จะได้ดังนี้

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 150

                  ซึ่งจะวิ่งจาก 1->8->5->9->6->2->4->3->7->10 นั่นเอง

                  หากเราลองเอามา Plot กราฟ (Sort ตามลำดับที่ Solve ได้) ก็จะได้ดังนี้

                  solver

                  ส่วนถ้าใครอยากรู้ว่า วิ่งยังไงให้เปลืองระยะทางมากที่่สุด ก็จะลองปรับค่า Objective เป็น Max ดูได้ครับ ผลที่ได้จะทุเรศมากดังนี้ 555

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 151

                  ตัวอย่าง 5 : Optimize การตัดแบ่งวัตถุดิบ

                  โจทย์คือ เราซื้อวัตถุดิบมาแบบชิ้นใหญ่ แล้วต้องเอามาตัดแบ่งเพื่อผลิตสินค้าตามที่กำหนด เราต้องหาวิธีตัดให้มีประสิทธิภาพมากสุด (โจทย์แบบนี้เค้าเรียกกันว่า Cutting stock problem ครับ)

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

                  สรุป

                  จากตัวอย่าง 4 (การวิ่งรถ) จะเห็นได้ชัดเลยว่าการวางแผนที่ดี จะช่วยให้ระยะทางที่วิ่งรถน้อยลงไปมาก จากที่ไม่วางแผนเลยต้องวิ่งระยะ 97.78 แต่ถ้าวางแผนให้วิ่งน้อยสุดจะวิ่งแค่ 62.23 เท่านั้น (ประหยัดขึ้นถึง 37%) ส่วนถ้าตั้งใจวิ่งให้ยาวที่สุด จะยาวถึง134.93 (ซึ่งยาวขึ้นจาก Base 37% )

                  ดังนั้นคุณอยากให้ค่าใช้จ่ายน้อยลง แต่ได้ผลลัพธ์เท่าเดิม ก็อย่าลืม Optimize ธุรกิจของคุณด้วยนะครับ ^^

                  ใครสนใจเรื่อง Solver โดยละเอียด สามารถศึกษาได้จากคอร์สออนไลน์ที่ผมทำไว้อันนี้ได้ครับ

                  คอร์สออนไลน์ การทำ Optimization ด้วย Excel Solver สำหรับงานวางแผน

                  สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 152

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

                  คำตอบอยู่ที่นี่แล้ว! เพราะหลักสูตรนี้ คือหลักสูตรที่ครอบคลุมการเรียนรู้ในการเพิ่มประสิทธิภาพและค้นหาวิธีแก้ปัญหาที่ดีที่สุดสำหรับปัญหาต่าง ๆ (Optimization) โดยใช้เครื่องมือ Excel Solver ที่มีอยู่แล้วใน Excel ทุก Version

                  ประโยชน์ที่จะได้จากคอร์สนี้

                  • ทำความเข้าใจอย่างลึกซึ้งเกี่ยวกับ Excel Solver และการนำไปใช้ในสถานการณ์ต่าง ๆ ผ่านตัวอย่างกรณีศึกษาที่หลากหลาย เช่น
                            – การวางแผนการผลิตสินค้า
                            – การจัดสรรพนักงานให้เป็นไปตามเป้าหมาย
                            – การจัดสรรเวลาให้มีประสิทธิภาพสูงสุด
                            – การใช้ Budget ให้คุ้มค่าที่สุด แบบมีเงื่อนไขซับซ้อน
                            – การวางแผนการลงทุน
                            – การวางแผนการลงทุนสร้างโรงงาน
                            – ส่งของจากศูนย์กระจายสินค้าให้ต้นทุนต่ำที่สุด
                            – การหาเส้นทางที่สั้นที่สุด (Shortest Path)
                            – การวางแผนลำดับเส้นทางการเดินทาง (Traveling Salesman)
                            – การเปลี่ยนเครื่องจักรให้คุ้มค่า
                            – การวางแผนในเชิงการหาตำแหน่งที่เหมาะสมในเชิงพื้นที่ (Set Covering)
                  • ทำความเข้าใจวิธีจัดลำดับความสำคัญของวัตถุประสงค์หลายรายการและค้นหาวิธีแก้ปัญหาที่ดีที่สุด
                  • เพิ่มทักษะ Excel ของคุณและปรับปรุงความสามารถในการตัดสินใจของคุณ
                  • เพิ่มคุณค่าให้ตัวคุณได้อย่างมหาศาล เพราะการ Optimize ทางธุรกิจสามารถสร้างผลกำไรเพิ่มให้องค์กรได้จริง
                  • เพิ่มความโดดเด่นในใบสมัครงานของคุณ ด้วยการเพิ่มทักษะที่โดดเด่น และหายากในตลาดแรงงานไทย
                • วิธีทำบันทึกรายรับรายจ่าย อย่างง่าย (แต่เจ๋ง) ใน Excel

                  วิธีทำบันทึกรายรับรายจ่าย อย่างง่าย (แต่เจ๋ง) ใน Excel

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

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

                  ตัวอย่างเทคนิคเจ๋งๆ ในคลิปนี้มีดังนี้ครับ

                  เทคนิคการแยกรายรับรายจ่าย

                  นอกจากจะแยกด้วยการ Cut -> Paste ธรรมดาๆ แล้ว ยังใช้เทคนิคการสร้างคอลัมน์ Flag เฉพาะรายรับขึ้นมา

                  วิธีทำบันทึกรายรับรายจ่าย อย่างง่าย (แต่เจ๋ง) ใน Excel 153

                  แล้ว Filter flag เป็น y จากนั้นเลือกข้อมูลต้นฉบับ กด Ctrl ค้างแล้วเลือกพื้นที่ปลายทาง แล้วกด Ctrl+R เพื่อใช้ Fill Right ได้เลย

                  วิธีทำบันทึกรายรับรายจ่าย อย่างง่าย (แต่เจ๋ง) ใน Excel 154

                  ซึ่งเทคนิคนี้มาจากคลิปนี้ครับ

                  เทคนิคการอ้างอิงแถวด้านบนกรณีเขียนสูตรใน Table

                  สูตรของเงินคงเหลือ คำนวณดังนี้

                  เงินคงเหลือ = เงินตั้งต้น + รายรับ - รายจ่าย

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

                  วิธีทำคือให้ไปเขียนสูตรในบรรทัดที่สองนะ อย่าไปเขียนสูตรบรรทัดแรก

                  วิธีทำบันทึกรายรับรายจ่าย อย่างง่าย (แต่เจ๋ง) ใน Excel 155

                  พอกด Enter เบื้องต้นสูตรจะ Error เนื่องจากบรรทัดบนสุดดันไปอ้างอิงบรรทัดหัวตาราง อันนี้เดี๋ยวเรามีวิธีจัดการ

                  วิธีทำบันทึกรายรับรายจ่าย อย่างง่าย (แต่เจ๋ง) ใน Excel 156

                  วิธีจัดการคือให้เขียนฟังก์ชัน SUM ครอบไปซะ เนื่องจาก SUM ไม่สนใจข้อมูลที่เป็น Text แค่นี้ปัญหาก็จบแล้ว

                  วิธีทำบันทึกรายรับรายจ่าย อย่างง่าย (แต่เจ๋ง) ใน Excel 157

                  สรุป

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

                • Lookup ข้อมูลที่มี Comma ด้วย Power Query

                  Lookup ข้อมูลที่มี Comma ด้วย Power Query

                  คลิปนี้ผมจะมาสอนวิธี Lookup ข้อมูลโดยที่ตารางหลักดันมีเครื่องหมาย Comma ตั่นแต่ละ Item อยู่ ซึ่งจะเห็นว่าจะ Lookup ตรงๆ ไม่ได้เนอะ แต่เราจะใช้ #PowerQuery ช่วยทำได้ครับ

                  หลักการในการทำ คือ

                  1. ทำการ Split by Delimiter ข้อมูลออกมาเป็นหลายๆ แถว (Split into Rows)
                  2. Merge ข้อมูลที่ต้องการมาจากอีกตาราง
                  3. Group By ข้อมูลกลับมาแบบ All Rows
                  4. เขียนสูตร Table.Column เพื่อดึงเอาเฉพาะคอลัมน์ที่ต้องการออกมาเป็น List
                  5. Extract Values หรือ Text.Combine เพื่อรวม List เข้าด้วยกันเป้นช่องเดียวให้คั่นด้วย Comma
                • Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel

                  หัวข้อการทำงานจริงลำดับถัดไปที่มีแฟนเพจเรียกร้องมาเยอะ นั่นก็คือเรื่องของ Project Management หรือ การบริหารโครงการด้วย Excel นั่นเอง โดยที่จะเป็นทั้งเรื่องของการทำ Gantt Chart และการทำ S-Curve ด้วย

                  แต่บอกไว้ก่อนว่าถ้าจะทำงาน Project Management อย่างจริงจัง ผมแนะนำให้ใช้โปรแกรม Microsoft Project ซึ่งออกแบบมาให้ทำงานแนวนี้โดยเฉพาะมากกว่านะครับ อย่างไรก็ตามถ้าโครงการเป็นงานที่ไม่ซับซ้อนมาก หรือองค์กรเราไม่มีโปรแกรม Microsoft Project ให้ใช้ เราก็ยังสามารถใช้ Microsoft Excel ทำงานแนวนี้ได้เช่นกัน (ก็อย่างที่บอกว่า Excel เป็น Super เป็ด ทำได้ทุกอย่าง)

                  ในบทความนี้ผมจะแสดงวิธีทำโดยใช้สูตร Excel ปกติ ร่วมกับ Conditional Format ซึ่งจะใช้ได้กับ Excel ทุก Version ให้ดูก่อน แต่ในบทความตอนต่อๆ ไปในอนาคต ยังมีวิธีอื่นๆ อีก เช่น ใช้ Power Query +Pivot Table +Pivot Chart มาช่วยอีก (ก็ผมชอบ Pivot นี่) รวมถึงอาจจะมีวิธี DAX & Data Model อีก

                  เพื่อไม่ให้เสียเวลา ไปดูวิธีแก้ปัญหาด้วยสูตรกันเลยครับ

                  ข้อมูลดิบ

                  เบื้องต้นเราจะมีการบันทึกข้อมูลว่ามีงานหลัก งานย่อย อะไรบ้าง เริ่มเมื่อไหร่ ใช้เวลาเท่าไหร่ถึงจะจบ ดังนี้

                  idงานย่อยงานหลักวันที่เริ่มระยะเวลางบประมาณ
                  1Sub Task 1Main 15/3/2020602000
                  2Sub Task 2Main 110/3/20201001600
                  3Sub Task 3Main 115/3/2020303000
                  4Sub Task 4Main 220/3/202071100
                  5Sub Task 5Main 225/3/202092900
                  6Sub Task 6Main 230/3/202071500
                  7Sub Task 7Main 24/4/20201101100
                  8Sub Task 8Main 29/4/20201201500
                  9Sub Task 9Main 214/4/20201001900
                  10Sub Task 10Main 319/4/20202102100
                  11Sub Task 11Main 324/4/20202402600
                  12Sub Task 12Main 329/4/20201902100
                  13Sub Task 13Main 34/5/20201501300
                  14Sub Task 14Main 39/5/20201601300
                  15Sub Task 15Main 314/5/20202101600
                  16Sub Task 16Main 319/5/20202902900

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

                  วันที่จบ

                  =[@วันที่เริ่ม]+[@ระยะเวลา]

                  Tips : ถ้าสนใจเรื่องวันทำการด้วย ก็ต้องใช้ WORKDAY มาช่วยดังนี้

                  =WORKDAY.INTL([@วันที่เริ่ม],[@ระยะเวลา],เลือกโหมดวันหยุดประจำสัปดาห์,วันหยุดพิเศษ)

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

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 158

                  ทีนี้สมมติว่าเราจะแสดงข้อมูลเป็นราย Week เราก็เขียนหัวตารางว่า Week1 แล้วลากยาวไปด้านขวาเลย มันจะแสดงคำว่า Week2, Week3… ไปเรื่อยๆ เอายาวเท่าที่ต้องการ

                  ทีนี้ในบริเวณข้างบนของคอลัมน์ Week1 เราเขียนสูตรเพื่อคำนวณหาวันจันทร์ใน week เริ่มต้นในข้อมูลที่มี (assume ว่าเริ่มสัปดาห์ที่วันจันทร์) ดังนี้

                  =MIN(Table3[วันที่เริ่ม])-WEEKDAY(MIN(Table3[วันที่เริ่ม]),2)+1
                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 159

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

                  Tips : ถ้าจะเพิ่มทีละเดือนให้ใช้ =EDATE(วันที่,1) เพื่อเพิ่มทีละ 1 เดือน ซึ่งถ้าเพิ่มทีละเดือนวันเริ่มต้นก็ควรเป็นเริ่มต้นเดือนด้วย

                  Tips2 : บางมีเราก็ใช้เป็น 1 คอลัมน์คือ 1 วันเลย จะได้ความละเอียดสูงสุด แล้วหดคอลัมน์ให้เล็กๆ แล้ว Group เป็น Week อีกทีก็ยังได้นะครับ

                  แต่ในที่นี้ผมจะแสดงข้อมูลเป็น 1 คอลัมน์ =1 Week ละกันครับ

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 160

                  สร้าง Gantt Chart

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

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 161
                  ตัวอย่าง Gantt Chart จาก https://www.projectengineer.net/3-simple-gantt-chart-examples/

                  Tips : นอกจากนี้ เรายังสามารถคำนวณ Critical Path หรือก็คืองานที่ถ้า Delay ปุ๊ปจะทำให้โครงการช้าขึ้นทันทีได้ด้วย แต่ผมขอไว้ทำให้ดูในบทความถัดๆ ไปละกันะครับ (ขอติดไว้ก่อนนะ เดี๋ยวจะซับซ้อนไป)

                  สำหรับบทความนี้ เราจะทำการ Allocate Budget ลงในตารางแต่ละช่อง แล้วใช้ Conditional Format Fill สีพื้นหลัง ให้มันออกมาเหมือน Gantt Chart นั่นเอง เรามาดูแต่ละขั้นตอนกันครับ

                  Allocate Budget

                  ต่อไปผมก็จะทำการ Allocate Budget ลงในตารางแต่ละช่อง โดยคำนวณจาก Portion ของระยะเวลาที่อยู่ในช่องนั้นหารด้วยระยะเวลาทั้งหมด

                  ดังนั้นเพื่อให้เห็นภาพ ผมจะคำนวณก่อนว่าแต่ละงานนั้นมีจำนวนวันในแต่ละช่องเท่าไหร่ ดังนี้ (หลักการคล้ายๆ การคำนวณเวลาในบทความนี้)

                  =MAX(MIN([@วันที่จบ],J$1)-MAX([@วันที่เริ่ม],I$1),0)
                  
                  หมายเหตุ : ที่เขียน MAX เทียบกับ 0 เพื่อไม่ให้ค่าติดลบ

                  โดยที่เราจะใช้วิธี Copy Paste ไปด้านขวา แทนการลาก Fill Handle เพื่อที่ทำให้คอลัมน์ของ Table ไม่เลื่อนจากคอลัมน์วันที่เริ่ม และวันที่จบ (ถ้าใช้ Fill Handle การอ้างอิง Table จะเลื่อน)

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 162

                  จากนั้นเราเอาตัวเลขที่ได้ไปหารด้วยระยะวเลาแต่ละ Task ดังนั้นสูตรจึงเป็นดังนี้

                  =MAX(MIN([@วันที่จบ],J$1)-MAX([@วันที่เริ่ม],I$1),0)/[@ระยะเวลา]

                  ซึ่งจะได้ สัดส่วนการ Allocate Budget แบบนี้

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 163

                  แล้วเราค่อยเอา สัดส่วนไปคูณกับ งบประมาณ ก็จะได้งบประมาณราย Week ดังนี้ โดยที่หากรวมงบประมาณตลอดช่วงเวลาของ Task นั้นๆ ก็จะได้งบประมาณรวมของ Task นั้นๆ นั่นเอง แบบนี้แสดงว่าการ Allocate ของเราถูกต้องแล้ว

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 164

                  Fill สี Gantt Chart

                  dเราจะเอา Style ของ Table เดิมที่เป็นลายๆ ออกไปซะ โดยเลือกให้เป็นสีแบบ None เพื่อที่เราจะใส่ Conditional Format ได้อย่างสวยงาม

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 165

                  ให้เราใส่ Conditional Format ว่าถ้าค่ามากกว่า 0 ให้ Fill สี Background และให้ทำสี Font ให้สีเป็นสีเดียวกับ Background ด้วย (หรือจะทำให้เข้มกว่า BG นิดๆ ก็ได้จะได้เห็นเลข แต่ไม่น่าเกลียด)

                  ส่วนถ้าเป็นเลข 0 ก็ให้เปลี่ยนสี Font เป็นสีขาวซะ จะได้มองไม่เห็น

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 166

                  นี่คือส่วนของ Gantt Chart ก็น่าจะถือว่าเสร็จแล้วล่ะ ต่อไปจะเป็นการทำ S-Curve

                  สร้าง S-Curve

                  การสร้าง S-Curve จริงๆ แล้วไม่มีอะไรมากไปกว่าการ Plot กราฟเส้น โดยให้แกน x เป็นวันที่ ส่วนแกน y เป็น %งานสะสมในแต่ละช่วงเวลา ซึ่งโดยทั่วไป %งานสะสมจะพุ่งขึ้นเร็วในช่วงกลางๆ (เพราะทำหลาย Task พร้อมกันมากที่สุด) ทำให้กราฟดูเป็นรูปตัว S นั่นเอง แต่ในชีวิตจริงจะเหมือน S แค่ไหนก็เป็นอีกเรื่องนึงนะ 555

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 167
                  ตัวอย่าง S-Curve จาก https://www.ntaskmanager.com/blog/s-curve-in-project-management/

                  โดยทั่วไป ในงานจริงๆ เรามักจะมีการ Plot S-Curve 2 เส้นเทียบกันนั่นคือ Planed vs Actual S-Curve เพื่อเทียบว่าโครงการของจริงเป็นไปตามแผนที่วางแผนไว้แค่ไหน? ซึ่งเราจะเอามิติไหนมาเทียบกันก็ได้ เช่น งบประมาณ vs ค่าใช้จ่ายจริง , วันที่วางแผน vs วันที่ใช้จริง, output ที่วางแผน vs output จริง เป็นต้น

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 168
                  ตัวอย่าง S-Curve จาก https://www.ntaskmanager.com/blog/s-curve-in-project-management/

                  สำหรับในเคสของเรานั้น สำหรับการ Plan ผมจะใช้เรื่องของ Budget มาเป็นตัวแทน แต่สำหรับตัว Actual ผมขอไม่ทำให้ดูนะครับ เพราะก็แค่เป็นการทำ Gantt Chart อีกตารางนึงแค่นั้นเอง เพื่อนๆ น่าจะทำเองได้เนอะ

                  งั้นมาดูการทำ S-Curve ของตัว Budget กันดีกว่า

                  S-Curve ของ Budget

                  ซึ่งจะเห็นว่าจริงๆ แล้วสามารถใช้การ SUM Budget ในแต่ละ Week ธรรมดาๆ ก็ได้ แต่ในที่นี้ผมจะใช้ SUBTOTAL มาช่วย เพื่อให้สามารถเปลี่ยนผลรวมไปตามการ Filter ตารางได้ (เดี๋ยวผมจะใช้ Slicer กดเอา)

                  =SUBTOTAL(9,ProjectTable[Week1])
                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 169

                  จากนั้นให้ลาก Fill Handle ไปด้านขวาเพื่อให้มันเปลี่ยนคอลัมน์ในตารางไปเรื่อยๆ
                  จากนั้น งบประมาณสะสมสามารถใช้ SUM แบบ Lock จุดเริ่มต้นอย่างเดียวได้เลย

                  =SUM($I$2:I2)

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 170

                  จากนั้นเราสร้าง %งบประมาณสะสมขึ้นมา แล้วทำการ plot กราฟเส้น ซะ โดยให้แกน x เป็นวันที่ แกน y เป็น %งบประมาณสะสม เป็นอันจบการสร้าง S-Curve ครับ

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel

                  เพิ่ม Slicer เพื่อให้มีลูกเล่นในการ Filter

                  เวลาเราทำข้อมูลเป็น Table แล้ว ใน Excel 2013 ขึ้นไปจะสามารถใช้ Slicer กับ Table ได้ด้วย เช่น ผมให้คนใช้งานสามารถกด Slicer เพื่อเลือกดูงานหลักที่สนใจก็ได้

                  ซึ่งพอกด Slicer แล้ว ตารางจะถูก Filter ซึ่งจะส่งผลให้การคำนวณจาก SUBTOTAL ลดลงไปกราฟก็เลยเปลี่ยนตามได้ด้วยนั่นเอง

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 171

                  ปรับแต่งความสวยงาม

                  ถ้ากลัวคอลัมน์แคบไปจนมองไม่เห็น เราก็ปรับการ Alignment ให้เป็นแนวตั้งหรือเฉียงๆ หน่อยได้ รวมถึงจะปรับ Format ของวันที่ให้อ่านง่ายขึ้นก็ได้นะครับ

                  ถ้าตัว Fill มันดูทึบไป อาจตีกรอบบนล่างให้เป็นสีขาวก็ได้นะ

                  นอกจากนี้เรายังติ๊กเอา Filter Button ของ Table ออกได้ ในขณะที่ยังใช้ Slicer ได้อยู่เหมือนเดิมด้วยนะ จะได้ไม่ต้องมีปุ่มเกะกะ แต่ผมขอไม่ปรับอะไรเรื่องของความสวยงามมากแล้วกันนะ อิอิ

                  Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel 172

                  สรุป

                  หวังว่าเทคนิคการทำ Project Management การบริหารโครงการ สร้าง Gantt Chart และ S-Curve ด้วย Excel ที่ผมนำเสนอในบทความนี้จะเป็นประโยชน์กับเพื่อนๆ นะครับ

                  แต่เดี๋ยวในตอนต่อไปผมจะใช้ Pivot Table + Power Query ทำ Gannt Chart ให้ดู ซึ่งจะสามารถสร้างรายงานที่ยืดหยุ่นกว่าเดิมได้มากเลยครับ รวมถึงเรื่องของการทำ Critical Path ด้วยเนอะ ใครอยากให้มีแง่มุมอื่นอีกก็สามารถบอกได้นะครับ

                • Inventory Management ทำรายงานสินค้าคงคลังด้วย  DAX และ Data Model ใน Excel

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel

                  จากที่ผม post ถามไปในเพจว่าอยากรู้การทำงานจริงเรื่องไหนมากที่สุด เรื่องที่มีคนตอบมามากที่สุดก็คือ Inventory Management หรือการทำรายงานสินค้าคงคลังนั่นเอง

                  ในบทความนี้จะเป็นตัวอย่างที่จะใช้ Concept ของ DAX และ Data Model มาช่วยในการทำรายงานให้เห็นมิติใหม่ๆ โดยนำมาประยุกต์ร่วมกับการใช้สูตร SUMIFS ที่ช่วยในการแสดงข้อมูลแบบทันที และช่วยในการ Validate การกรอกข้อมูล ซึ่งเดี๋ยวเพื่อนๆ จะเห็นว่ามันก็เข้าขากันได้ดีอยู่นะ

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

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

                  บทความเก่า เรื่องการจัดการ Stock (ด้วยการเขียนสูตร) มี 3 ตอน

                  เพื่อไม่ให้เสียเวลาเรามาเริ่มกับวิธี DAX & Data Model กันเลย

                  เตรียมข้อมูล Input ที่จำเป็น

                  ก่อนอื่นสิ่งที่ต้องทำคือ เตรียมข้อมูลดิบทั้งหมดก่อน ซึ่งผมจะมีตารางทั้งหมด 3 ตาราง ใน Excel (ทำเป็น Table ให้หมดนะ) ดังนี้

                  1.ตารางรายชื่อสินค้าทั้งหมด : ชื่อว่า ProductTable (เอาจริงๆ ใส่เป็นรหัสสินค้าคู่กับชื่อสินค้าก็ได้นะ)

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 173

                  2. ตารางบันทึกการซื้อสินค้า : ชื่อว่า BuyTable

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 174

                  3. ตารางบันทึกการขายของ : ชื่อว่า SellTable

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 175

                  ซึ่งเจ้าตารางการขายของเนี่ย เรามักจะต้องมีการเช็คด้วยนะว่าไม่ได้ขายเกินสิ่งที่มีอยู่ ดังนั้นผมจึงเขียนสูตร SUMIFS ให้ดึงข้อมูลสินค้าที่มีในสิ้นวันก่อนหน้าขึ้นมาแสดงให้เห็นชัดๆ และมีการ Validate ด้วยว่าห้ามขายเกินที่มีนะ

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 176

                  ซึ่งสูตรจำนวนสินค้าที่มีในวันก่อน (ในช่องสีส้ม) เขียนดังนี้

                  = รวมสินค้าที่ซื้อมาทั้งหมดในช่วงเวลาก่อนหน้า - รวมสินค้าที่ขายไปทั้งหมดในช่วงเวลาก่อนหน้า
                  =SUMIFS(BuyTable[จำนวนซื้อ],BuyTable[Product],[@Product],BuyTable[วันที่ซื้อ],"<"&[@วันที่ขาย])-SUMIFS([จำนวนขาย],[Product],[@Product],[วันที่ขาย],"<"&[@วันที่ขาย])

                  จากนั้นในช่องที่ทำการขายก็ใส่ Data Validation ได้ดังนี้ เพื่อเช็คว่าจำนวนขายมันห้ามเกินช่องจำนวนที่มีสิ้นวันก่อนด้านซ้ายมือนะ

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 177

                  จากนั้นเราก็สร้างคอลัมน์เตือนนิดนึงนะ ว่าสินค้าเหลือเท่าไหร่ และเหลือน้อยกว่าจุดสั่งซื้อแล้วหรือไม่ (Reorder Point/Safety Stock)

                  จำนวนคงเหลือ

                  =[@[จำนวนที่มี ณ สิ้นวันก่อน]]-[@จำนวนขาย]

                  ต้องสั่งเพิ่มหรือไม่?

                  =[@จำนวนคงเหลือ]<VLOOKUP([@Product],ProductTable,2,0)

                  จากนั้นใส่ Conditional Format เตือนไปนิดนึงในกรณีที่เป็น TRUE

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 178
                  inventory สินค้าคงคลัง Excel

                  แค่นี้เราจะได้ตารางขายที่ค่อนข้างฉลาดมากขึ้นแล้ว ซึ่งจริงๆ มันก็สามารถเช็คสต๊อคได้คร่าวๆ แล้วนะ ถ้าเราพอใจเท่านี้ก็จบเลยก็ได้ มันก็จะคล้ายๆ กับบทความภาค 3 ของผมนั่นเอง แต่ในบทความนี้เราจะไปต่อกับ Concept ของ Data Model ครับ

                  เอาข้อมูล Inventory ที่เตรียมไว้ทั้งหมดเข้า Data Model

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

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 179

                  เอาตารางทั้ง 3 อันเข้า Data Model ให้ครบทุกตาราง จากนั้นไปที่หน้า Diagram View แล้วผูก Relationship ของแต่ละตารางซะ (ตัวเชื่อมคือ Product)

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 180

                  เพิ่ม DateTable

                  จากนั้นเราต้องเพิ่มตารางวันที่เข้าไปอีกอันนึง เพื่อให้สามารถ Filter ข้อมูลตามวันที่ได้ ซึ่งถ้ามี Power BI เราจะใช้ New Table โดยใช้ =CALENDARAUTO() ได้ง่ายๆ เลย แต่ใน Excel จะไม่สามารถเขียน DAX Table ได้ ดังนั้นเราจะใช้ Power Query ช่วยทำนะครับ

                  เพื่อไม่ให้เสียเวลา ผมจะใช้ Code ที่เขียนแจกไว้ในบทความนี้เลยนะครับ

                  ดังนั้นให้สร้าง Blank Query จากนั้นใน Advanced Editor ของ Power Query ก็ใส่ Code ไปว่า

                  (StartDate as date, EndDate as date) as table =>
                  let
                  displayRegion="en-GB",
                  //displayRegion="th-TH",
                  //StartDate=#date(2017, 1, 1),
                  //EndDate=#date(2019,12,31),
                  DayCount = Duration.Days(Duration.From(EndDate - StartDate)),
                  Source = List.Dates(StartDate,DayCount,#duration(1,0,0,0)),
                  #"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
                  #"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "Date"}}),
                      #"Changed Type" = Table.TransformColumnTypes(#"Renamed Columns",{{"Date", type date}}),
                  #"Inserted Year" = Table.AddColumn(#"Changed Type", "Year", each Date.Year([Date]), Int64.Type),
                  #"Inserted Quarter" = Table.AddColumn(#"Inserted Year", "Quarter", each "Q"& Text.From(Date.QuarterOfYear([Date])), type text),
                  #"Inserted Month" = Table.AddColumn(#"Inserted Quarter", "Month", each Date.Month([Date]), Int64.Type),
                  #"Inserted Month Name" = Table.AddColumn(#"Inserted Month", "Month Name", each Date.ToText([Date],"MMMM",displayRegion), type text),
                  #"Inserted Day" = Table.AddColumn(#"Inserted Month Name", "Day", each Date.Day([Date]), Int64.Type),
                  #"Inserted Day of Week" = Table.AddColumn(#"Inserted Day", "Day of Week", each Date.DayOfWeek([Date],1)+1, Int64.Type),
                  #"Added YearMonthNum" = Table.AddColumn(#"Inserted Day of Week", "YearMonthNum", each Date.ToText([Date],"yyyyMM",displayRegion)),
                  #"Added YearMonthText" = Table.AddColumn(#"Added YearMonthNum", "YearMonthText", each Date.ToText([Date],"yyyy-MMM",displayRegion))
                  in
                      #"Added YearMonthText"

                  จากนั้นระบุวันที่ให้เริ่มต้นปีและจบสิ้นปีของปีที่ต้องการ

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 181

                  จากนั้นเอา DateTable ที่ Invoke ฟังก์ชันที่เราสร้างไว้ Close & Load to แล้วเลือกดังรูปเพื่อเอาข้อมูล DateTable เข้าสู่ Data Model ซะ

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 182

                  จากนั้นเราผูก Relationship ของตารางดังภาพ

                  สังเกตว่าฝั่งตาราง Dimension คือ ProductTable กับ DateTable จะเป็นเลข 1 (แปลว่าตัวเชื่อมมีค่า unique ไม่มีค่าซ้ำ) ส่วนตาราง Fact ทั้ง BuyTable และ SellTable จะเป็นฝั่งที่เป็น * นั่นคือตัวเชื่อมมีค่าซ้ำกันได้

                  สิ่งสำคัญที่ต้องรู้ก็คือ การไหลของการ Filter จะไหลจากฝั่ง 1 ไป * ได้ ทำให้เราจะสามารถ Filter ตาราง BuyTable และ SellTable ได้พร้อมกัน จาก ProductTable และ DateTable เลย

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 183

                  จากนั้นเรากลับไปที่ Data View และทำการ Mark DateTable ของเราให้ Excel มองว่าเป็นตารางวันที่ด้วย เพื่อให้ใช้ Time Intelligent Function ได้

                  นอกจากนั้นอย่าลืมจัดการเรื่องการ Sort ข้อมูลในคอลัมน์ที่เป็น Text เช่น Month Name ว่าให้ Sort by Column ชื่อ Month และ YearMonthText ให้ Sort by Column ชื่อ YearMonthNum ด้วยนะ เวลาไปแสดงรายงานจะได้ไม่เรียงแบบงงๆ

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 184

                  เริ่มสร้าง Measure เพื่อการคำนวณ Inventory

                  จากนั้นสร้าง Measure ที่ต้องการ และกำหนด Number Format ให้เรียบร้อยซะ
                  ซึ่งจะสร้างใน Power Pivot เลยก็ได้ โดยไปที่ Data View แล้วคลิ๊กบริเวณด้านล่าง แล้วใส่ ชื่อMeasure:=สูตร ลงไป

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 185

                  หรือจะกด icon excel ซ้ายบน เพื่อออกมาใน Excel ปกติ แล้วสร้าง Measure ก็ได้

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 186

                  สร้าง Basic Measure

                  ซึ่ง Measure ที่ผมสร้างจะมีดังนี้

                  TotalBuyQty:=SUM(BuyTable[จำนวนซื้อ])
                  TotalSellQty:=SUM(SellTable[จำนวนขาย])

                  ใน Excel นั้น Table ที่อยู่ของ Measure ค่อนข้างมีความสำคัญกว่าใน Power BI เพราะ Pivot ใน Excel สามารถยอมให้เรา Double Click ที่ Measure เพื่อ Extract ข้อมูลออกมาดูได้ ถ้าเอา Measure ไปไว้ที่ Table ไหน มันก็จะ Extract Table นั้น ดังนั้นผมจะจัดดังนี้

                  • TotalBuyQty ผมจะเอา Home Table ไว้ที่ BuyTable
                  • ส่วน TotalSellQty ผมจะเอา Home Table ไว้ที่ SellTable

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

                  สิ่งสำคัญคือ การลาก Field Dimension มาใช้ เช่น Product จะต้องใช้จากตารางที่จะ Filter ตัวอื่นได้ด้วยนะครับ เช่น Field Product นั้นมีอยู่ใน 3 ตาราง เราจะต้องใช้จากตาราง ProductTable เท่านั้น ไม่ใช่เอา Product จาก SellTable หรือ BuyTable นะครับ

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 187

                  สร้าง Measure เพื่อคำนวณสินค้าคงเหลือ

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

                  สินค้าคงเหลือ = สินค้าเริ่มต้น + สินค้าที่ซื้อเพิ่ม - สินค้าที่ขายออก

                  ซึ่งของเราไม่มีสินค้าเริ่มต้น คือ เรา assume เป็น 0 ไปเลย ดังนั้นหากเราสามารถหาสินค้าที่ซื้อเพิ่มสะสม – สินค้าที่ขายออกสะสมได้เลย

                  AccumBuyQty = สินค้าที่ซื้อเพิ่มสะสม = สินค้าที่ซื้อตั้งแต่เริ่มต้น-เวลานั้นๆ

                  ซึ่งเราจะใช้ CALCULATE มาช่วยเปลี่ยน Filter Context ของ TotalBuyQty เป็นให้ปลด Filter ของ DateTable ออกทั้งหมดแล้วเปลี่ยนเป็นวันที่ <= วันที่ล่าสุดที่มองเห็นอยู่ ดังนี้ (ใครงงเรื่อง CALCULATE ให้ไปอ่านในนี้)

                  AccumBuyQty:=VAR currentDate=LASTDATE(DateTable[Date])
                  RETURN
                  CALCULATE([TotalBuyQty],DateTable[Date]<=currentDate)
                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 188

                  ในขณะเดียวกันก็สามารถสร้าง AccumSellQty ได้ดังนี้

                  AccumSellQty:=VAR currentDate=LASTDATE(DateTable[Date])
                  RETURN
                  CALCULATE([TotalSellQty],DateTable[Date]<=currentDate)

                  และสินค้าคงเหลือก็คือเอาสองตัวลบกัน ดังนี้

                  BalanceQty:=[AccumBuyQty]-[AccumSellQty]

                  สรุปถ้าลองเอามาใส่ Pivot จะได้ดังนี้

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 189

                  จะเห็นว่าผลลัพธ์ออกมาถูกต้องเลย

                  ทีนี้เราเลือกเอาเฉพาะตัว Measure ที่สนใจลงมาใน Pivot ก็ได้ เช่น TotalBuyQty, TotalSellQty, BalanceQty นอกนั้นไม่เอา

                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 190

                  สร้าง Measure อื่นๆ เกี่ยวกับการคำนวณ Inventory

                  นอกจากนี้จะเพิ่ม Measure อื่นๆ เช่น ยอดซื้อและยอดขายเข้าไปก็ได้ เช่น ใช้ SUMX มาช่วยคำนวณ เนื่องจาก SUM จะอ้างอิงได้แค่คอลัมน์จริงๆ คอลัมน์เดียว แต่ SUMX สามารถ SUM Expression ที่เกิดจากแต่ละคอลัมน์คำนวณกันได้ (ใครงงเรื่อง SUMX ให้ไปอ่านที่นี่)

                  TotalBuyAmt:=SUMX(BuyTable,BuyTable[จำนวนซื้อ]*BuyTable[ราคาซื้อต่อชิ้น])
                  TotalSellAmt:=SUMX(SellTable,SellTable[จำนวนขาย]*SellTable[ราคาขายต่อชิ้น])
                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 191

                  ข้อดีของ Pivot คือการปรับเปลี่ยนหน้าตาได้แบบสบายๆ รวมถึงสามารถใส่ Slicer หรือ Timeline ให้กดเล่นได้ด้วย เช่น ผมอาจปรับแบบนี้ก็ได้

                  inventory สินค้าคงคลัง Excel

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

                  MinimumQty:=SUM(ProductTable[จุดสั่งของเพิ่ม])
                  NeedtoOrder:=[BalanceQty]<[MinimumQty]
                  Inventory Management ทำรายงานสินค้าคงคลังด้วย DAX และ Data Model ใน Excel 192

                  นอกจากนี้ยังสามารถใส่ Measure กลุ่ม Time Intelligent ได้อีก เช่น จำนวนซื้อของในเดือนก่อนหน้า ซึ่งเราจะใช้ DATEADD มาช่วยกับ CALCULATE เพื่อทำการเปลี่ยน Filter Context (ใครงงเรื่อง DATEADD มาอ่านอันนี้)

                  BuyQtyLastMonth:=CALCULATE([TotalBuyQty],DATEADD(DateTable[Date],-1,MONTH))

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

                  inventory สินค้าคงคลัง Excel

                  นอกจากนี้ เรายังสามารถแสดงผลเป็นกราฟก็ได้ถ้าต้องการ แค่เลือกที่ Pivot ที่ออกแบบไว้แล้วกด Insert Chart แล้วเลือกกราฟที่ต้องการ เราก็จะได้กราฟแบบง่ายๆ แล้ว และยังใช้ผสมผสานกับ Slicer ได้อีก กดเล่นสบายเลย ได้รายงานที่ Interactive ขึ้นอีก

                  inventory สินค้าคงคลัง Excel

                  สรุป

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

                  • เราสามารถเปลี่ยนแปลงหน้าตารายงานได้ง่าย แค่ลาก Field Pivot ไปๆ มาๆ (ความสามารถของ Pivot Table)
                  • สามารถแสดงผลเป็นกราฟได้ (ความสามารถของ Pivot Chart / Visual)
                  • สามารถกดดูสิ่งที่สนใจได้อย่างง่ายดาย (ความสามารถของ Slicer)
                  • สรุปข้อมูลจากหลายตารางได้ (ความสามารถของ Data Model)
                  • สามารถแสดงการคำนวณที่ซับซ้อนมากกว่าแค่ Sum Count Average Max Min ธรรมดาๆ ก็ได้ (ความสามารถของ DAX Measure)

                  และทั้งหมดนี้คุณก็เอาไปทำใน Power BI ก็ได้ ซึ่งจะมี Visual เจ๋งๆ ให้เลือกมากกว่าของ Excel อีก ลองคิดดูว่ารายงานสินค้าคงคลัง Inventory Management คุณจะเจ๋งขึ้นได้ขนาดไหน!!

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

                • 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 ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 193

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

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

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

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

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

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

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

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

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

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

                  ดังนั้นสรุปว่าวิธีนี้จะเร็วกว่ามาก กรณีที่เอาค่ากลับมาหลายคอลัมน์ เช่น ถ้าเอาค่ากลับมา 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 ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 196

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

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

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

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

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

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

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

                  แนวทาง 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 ข้อมูลเยอะแล้วช้า แก้ยังไงให้เร็ว? 200

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                  =RELATED(SalesRef[ชื่อ])

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

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

                  สรุป

                  ใครสนใจเรื่อง 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) 208

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

                  =SUM($C$4:C4)

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

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

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

                  หากคุณตอบว่า ปีที่ 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) 210

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

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

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

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

                  ถ้าไม่มี 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) 213

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

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

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

                  แปลว่าถ้าผมรู้ยอดเลขสะสมแต่ละปีที่คร่อม 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) 215

                  สรุป

                  หลักการคิดค่าเสื่อมแบบ 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 ให้ตัวอักษรกลับหน้าหลัง 216

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                  =Text.Combine([Custom.1])

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

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

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

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

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

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

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

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

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

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

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

                  สรุป

                  นี่ก็เป็นตัวอย่างแนวทางของการกลับตัวอักษรให้มองย้อนแบบใน 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) 230

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

                  วิธีคำนวณค่าเสื่อมราคาแบบยอดลดลงทวีคูณ (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) 231

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

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

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

                  ดังนั้นในชีวิตจริง หลายๆ เคสที่ต้องการใช้ 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) 233

                  สรุป

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                  โอ้ว จะเห็นว่ามีอะไรไม่รู้เกินมาตั้ง 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) 239

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

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

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

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

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

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

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

                  สมมติผมสนใจแค่ภาษาไทยกับ 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) 242

                  จากนั้นผมจะใช้ 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) 243

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

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

                  จากนั้นเราค่อยเอา 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) 245
                  สารพัดวิธีกำจัดอักขระที่ไม่ต้องการออกจากข้อความ (Clean Bad Characters) 246

                  สรุป

                  คิดว่าเป็นไงบ้างกับกำจัดอักขระที่ไม่ต้องการออกจากข้อความ ที่ผมแนะนำให้ครับ ใครอ่านแล้วได้ประโยชน์ อ่านแล้วทำตามไม่ได้ หรือว่ามีวิธีอะไรดีๆ อยากจะแชร์ก็ช่วย 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 247
                • เปรียบเทียบ 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 248

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

                  MAX

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

                  LASTDATE

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

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

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

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

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

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

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

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

                  ที่ทำแบบนี้ไม่ได้ เพราะ 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 252

                  ดูเหมือนว่าการใช้ 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 253

                  จะเห็นวาส 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 ที่มีช่วงเวลาเริ่มต้นกับสิ้นสุดคนละวัน 254

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

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

                  ผูก Relationship 2 เส้น

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

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

                  ทีนี้พอเราสร้าง 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 ที่มีช่วงเวลาเริ่มต้นกับสิ้นสุดคนละวัน 256

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

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

                  OrderTX=COUNTROWS(Orders)

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

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

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

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

                  การคำนวณ 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 ที่มีช่วงเวลาเริ่มต้นกับสิ้นสุดคนละวัน 258

                  สรุป

                  ดังนั้นถ้าเลือกได้ ควรจะมีเส้น 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 (ฉบับเทพเอ็กเซล) 259

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

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

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

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

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

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

                  เริ่มเขียน 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 (ฉบับเทพเอ็กเซล) 263

                  พอเรามี 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 (ฉบับเทพเอ็กเซล) 264

                  ทีนี้เรามาเขียนเงื่อนไขสำหรับ 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 (ฉบับเทพเอ็กเซล) 265

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

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

                  ทำ 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 (ฉบับเทพเอ็กเซล) 267

                  จากนั้นเราค่อยเขียน 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 (ฉบับเทพเอ็กเซล) 268

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

                  อย่างไรก็ตาม หากอยากจะเรียงตามยอดมากไปน้อย แต่อยากเอา 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 (ฉบับเทพเอ็กเซล) 269

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

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

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

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

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

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

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

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

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

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

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

                  IsChild = ISFILTERED(dProduct[ProductSubcategory])

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

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

                  ทีนี้เราจะทำ 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 (ฉบับเทพเอ็กเซล) 274

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

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

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

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

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

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

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

                  สารบัญ 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 278

                  หลักการโดยรวมคือ เราจะเอาผลลัพธ์จาก 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 279

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

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

                  ทำ 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 281

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                  วิธี Export ข้อมูลจาก Power Query ที่เยอะเกินล้านบรรทัดออกมาเป็น Text File 291
                • วิธี 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 อัน แบบสลับแถว 292

                  แนวคิด

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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