Author: lungthi

  • VBA คืออะไร?

    Visual Basic for Applications (VBA) เป็นภาษาสำหรับเขียนโปรแกรมหรือชุดคำสั่ง เพื่อให้ Microsoft Office ทำงานในแบบที่ผู้เขียนต้องการได้

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

    โดยเฉพาะงาน copy and paste ข้อมูลเดิม ๆ เยอะ ๆ หลาย ๆ ไฟล์ ซึ่งทำให้เราเหนื่อย ทำผิดพลาดได้ง่าย นำไปสู่ความน่าเบื่อในที่สุด

    จากประสบการ์ส่วนตัว บางทีเป็นงานที่อาจกินเวลาในแต่ละวันของเราไปเกือบครึ่ง หรืออย่างน้อยก็ 1/3 จนบางทีทำให้บางคนถึงกับนิ้วล็อคไปแล้วด้วยซ้ำ

    หรือบางงานอาจจะเป็นการตรวจสอบข้อมูล หรือการจัดรูปแบบ แบบเดิม ๆ ซ้ำ ๆ

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

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

    ในบางที่มีข้อมูลเป็นฐานข้อมูลให้ใช้ ส่วนนี้จะสบายเลย เพราะเราจะได้ข้อมูลพร้อมให้ดึงมาประมวลผลเลย

    แต่สำหรับที่ที่ไม่ได้ทำข้อมูลเป็นฐานข้อมูลไว้ ยังไงก็หนีไม่พ้นการ copy and paste หรือไม่ก็ใช้มาโคร (Macro) หรือเขียน VBA code ที่เรากำลังพูดถึงนี่ล่ะ

    VBA กับ Macro ต่างกันอย่างไร?

    • VBA เป็นชื่อภาษาที่ใช้เขียนโปรแกรม
    • Macro หรือ มาโคร คือ กลุ่มของคำสั่ง ซึ่งเราเขียนขึ้นและตั้งชื่อไว้ เพื่อให้สามารถเรียกใช้งานภายหลังได้

    โดยใน Microsoft Office เราสร้างมาโครได้ 2 ทางคือ

    • กดบันทึกไว้ (Record)
    • เขียนขึ้นมาเอง (Write)

    แน่ว่าทั้งสองวิธี ผลลัพธ์จะได้โค้ด (code) ภาษา VBA ออกมา และเราจะเป็นคนกำหนดชื่อให้มัน พร้อมกับกำหนดวิธีการเรียกใช้

    ในภาษาพูด ทั้ง VBA และ Macro สองคำนี้ อาจหมายถึงสิ่งเดียวกัน หากใช้ Microsoft 365 อย่างไรก็ตาม คำว่า Macro ไม่ได้จำกัดแค่ภาษา VBA เท่านั้น เป็นคำทั่วไป

    จะใช้ VBA ได้อย่างไร?

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

    แต่เราสามารถดูได้จากเมนู View > Macros > View Macros

    อย่างไรก็ตามแอพจะคอยเตือนเราและไม่เปิดใช้งาน Macros หากเราไม่กด Enable

    ถ้าเปิดไฟล์ Excel ที่มีมาโครแอพจะเตือนแบบนี้ และจะยังไม่เปิดใช้งานมาโครจนกว่าจะคลิก Enable Content
    หรือบางทีอาจแสดงข้อความแบบนี้

    เนื่องจากถ้าใช้ไม่เป็น แล้วกดไปเรื่อยอาจเกิด💥หายนะขึ้นได้เลย เช่น ข้อมูลในไฟล์หายไป โดยที่ Undo ไม่ได้ เพราะอะไรก็ตาม ที่ Macros ทำไปแล้ว จะ Undo ไม่ได้

    รวมถึงอาจติดไวรัสคอมพิวเตอร์ได้นะ โดยเฉพาะที่ดาวน์โหลดมาจากแหล่งที่ไม่น่าเชื่อถือ

    บันทึกไว้ใช้เอง โดยใช้ปุ่ม Record Macro…

    วิธีนี้เหมาะสำหรับงานที่ง่ายมาก ๆ อย่างเช่น กำหนดว่าคอลัมภ์ B ให้แสดงผลแบบเปอร์เซ็นต์ เป็นตัวหนา และสีดำเท่านั้น

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

    วิธีการบันทึุกมาโครไว้ใช้งาน
    โค้ด VBA ที่ได้จากการบันทึกด้านบน

    อย่างไรก็ตาม macros ที่เราบันทึกไว้ จะทำงานแบบ🥴ซื่อบื้อเลยนะ คือ เราทำไว้แบบไหนมันก็จะทำตามนั้นล่ะ

    เช่น ถ้าเราลบแถวที่ 2 และ 5 เพราะมันไม่มีข้อมูล คือเราดูแล้วล่ะ ว่าไม่มี ก็เลยลบ

    ครั้งต่อไปที่เราเรียกใช้งาน (run) มันก็จะลบแถวที่ 2 และ 5 🥲 ถึงแม้จะมีข้อมูลอยู่ก็ตาม

    เพราะการ record macro คือการบันทึกการกดเมาส์และคีย์บอร์ด ไม่ใช่ความคิดของเรา ✨ซึ่งประเด็นนี้สำคัญมาก✍️

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

    อีกอย่าง ⚠️หากเรากำหนด shortcut ให้ macros มันจะ overide หรือแทนที่ shortcut ของแอพโดยไม่ถามนะ เช่น Ctrl + p ปกติใช้สั่งพิมพ์ (แทนการเลื่อนเมาส์ไปกด File > Print)

    และสิ่งที่การบันทึกมาโครทำไม่ได้อีกอย่างคือ การ copy จากไฟล์หนึ่ง มา paste อีกไฟล์หนึ่ง หรือคนละไฟล์นั่นแหละครับ แม้จะเป็นไฟล์ Excel เหมือนกัน ก็ทำไม่ได้ น่าแปลกใจมาก 😒

    เขียนโค้ด VBA เอง

    เป็นทางเลือกสุดท้าย แต่คุ้มค่ามาก 😁 เพราะเป็นการใช้งานแบบที่เรากำหนดเอง

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

    หากเขียนมาโครเอง เราจะได้โค้ดออกมาประมาณนี้

    Private Sub Workbook_Open()
        Columns("B:B").Select
        With Selection
            .NumberFormat = "0.00%"
            .Font.Bold = True
            .Font.Color = vbBlack
            .Interior.Color = xlNone
        End With
        Range("A1").End(xlDown).Select
    End Sub

    และทุกครั้งที่เปิดไฟล์นี้ขึ้นมา มันจะทำงานเอง โดยที่เราไม่ต้องคลิกเมาส์เลย (ถ้าไม่นับการคลิกปุ่มเตือนว่า ไฟล์นี้มีมาโครจะให้มันทำงานไหม? 😂)

    ซึ่งเราทำได้ตามภาพ โดย

    1. กดปุ่ม Alt + F11 แล้วเลือกที่ ThisWorkbook
    2. เลือกดรอบดาวน์ (Drop Down) เป็น Workbook
    3. เลือกดรอบดาวน์ (Drop Down) เป็น Open
    4. พิมพ์คำสั่ง (โค้ด) ที่เหลือ นอกจากที่ Excel เตรียมไว้ให้

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

    ตัวอย่างถ้ามีคนเปลี่ยนรูปแบบดังนี้ แล้ว save ไว้ด้วย
    แต่เปิดมา แล้วกด Enable Content จะได้ผลดังนี้

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

    โดยถ้าจะให้อธิบายโค้ด ก็คือ

    Columns(“B:B”).Select เราเลือกคอลัมภ์ B ทั้งคอลัมภ์

    With Selection … End With ตรงนี้จะบอก Excel ว่า ที่เราเลือกไว้น่ะ ให้ทำ …

    .NumberFormat = “0.00%” แสดงจำนวนเป็นเปอร์เซ็นต์มีทศนิยม 2 หลัก
    .Font.Bold = True อักษรเป็นตัวหนา
    .Font.Color = vbBlack อักษรเป็นสีดำ
    .Interior.Color = xlNone ไม่ระบายสีเซลล์

    Range(“A1”).End(xlDown).Select เลือกแถวสุดท้ายที่มีข้อมูลของคอลัมภ์ A

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

    อย่างตอนเลือกเปอร์เซ็นต์ แล้วเพิ่มจุดทศนิยม จะได้โค้ดมา 2 บรรทัด ซึ่งถ้าเราสั่งเอง เราก็เลือกแค่แบบสุดท้ายก็พอ

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

    ถ้าหากอยากให้เพิ่มเติมตรงไหน ก็ทิ้งคอมเม้นต์ไว้ด้านล่างได้เลยครับ 😁

  • แก้ปัญหา Access เตือน Save to SharePoint site

    เดือนก่อน ผม update ฐานข้อมูล Access ที่ใช้กันในแผนก แล้ว share ให้ทีมใช้ และเจอปัญหามีข้อความเตือน ดังภาพด้านบน

    คือมี SAVE CHANGES Save your changes to the server. พร้อมปุ่ม Save to SharePoint Site ให้กด

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

    สาเหตุก็คือ บางทีเราไป Save ไฟล์ไว้ใน SharePoint หรือบางทีก็ OneDrive นี่ล่ะ และระบบก็เพิ่ม Property หนึ่งให้กับไฟล์เรา ทีนี้ Access ก็เลยคอยเตือน

    อย่างไรก็ตาม ตามคำแนะนำเขาก็ไม่แนะนำให้เราใช้ Access ทั้งใน SharePoint และ OneDrive อยู่แล้วล่ะ แต่กรณีของผมคือ ผม save ทุกอย่างไว้ใน OneDrive เลยเจอปัญหานี้

    วิธีแก้คือ เราต้องเขียน VBA code เพื่อลบ Property นี้ออก โดยใช้คำสั่งนี้

    CurrentDb.Properties.Delete "PublishURL"

    แต่ก็จะไปเจอปัญหาว่า เมื่อเปิด Access มาใช้งานรอบถัดไป จะขึ้น Error 😂 เนื่องจากพอลบไปแล้ว รอบถัดไประบบก็จะเตือนว่า Property ที่สั่งให้ลบนี้ไม่มีนะ

    ซึ่งวิธีแก้ปัญหามี 2 วิธี คือ 1. ลบโค้ดที่ใส่ไปออกซะ กับ 2. คือ เขียนโค้ดเพิ่มให้เช็คว่ามี Property ที่ชื่อ “PublishURL” อยู่ไหม? หากมีให้ลบ ถ้าไม่มีก็แล้วไป จะได้โค้ดประมาณนี้

    Sub deletePublishUrl()
    
        If propertyExists("PublishURL") Then
            CurrentDb.Properties.Delete "PublishURL"
        End If
    	
    End Function
    
    
    Private Function propertyExists(ByVal propName As String) As Boolean
            
        propertyExists = False
        
        Dim prop As Variant
        
        For Each prop In CurrentDb.Properties
            If prop.Name = propName Then
                propertyExists = True
            End If
        Next prop
            
    End Function

    โดยโค้ดประกอบไปด้วย 2 ส่วนคือ Sub-procedure ที่ชื่อ deletePublishUrl เป็นตัวเรียกใช้งานฟังก์ชันที่ชื่อ propertyExists อีกที และต้องใส่อาร์กิวเมนต์เป็นชื่อ Property ที่เราต้องการตรวจสอบเข้าไป ซึ่งในที่นี้คือ “PublishURL”

    หากมี Property นี้ ฟังก์ชันก็จะให้ค่ากลับมาเป็นจริง (TRUE) ซึ่งจะทำให้ขั้นตอนทดสอบค่า IF ของ Sub-procedure ที่ชื่อ deletePublishUrl เป็นจริง แล้วค่อยสั่งให้คำสั่ง CurrentDb.Properties.Delete "PublishURL" ทำงาน

    หากฟังก์ชัน propertyExists ให้ค่ากลับมาเป็นเท็จ (False) คำสั่งส่วนนี้ก็จะถูกข้ามไป

    เพียงเท่านี้ก็เรียบร้อยครับ ตอนนี้ผมยังไม่เจอปัญหามีข้อความเตือนขึ้นมาอีกนะ หวังว่าจะเป็นประโยชน์กับทุกคน

    หากมีปัญหาอะไรยังไง comment ไว้ได้เลยครับ 😁

  • ใช้ฟังก์ชัน FILTER กรองเอาเฉพาะตัวเลขในคอลัมภ์

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

    โดยปกติ Excel ทำได้โดยใช้ Autofilter ในตารางได้อยู่แล้วล่ะ

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

    และคิดว่าฟังก์ชัน FILTER คงทำได้แหละ และไปค้นเจอใน Google Groups นี้ และก็ตรงกับที่อยากใช้พอดี

    การใช้ฟังก์ชัน FILTER กรองเราเฉพาะตัวเลขในคอลัมภ์

    โดยฟังก์ชัน FILTER จะใช้กรองข้อมูลที่ตรงกับเงื่อนไขที่ระบุไว้จาก Range อื่น

    และเราจะใช้ร่วมกับอีก 3 ฟังก์ชัน (แต่ไม่ยากนะ 😁 อย่าพึ่งรีบหนีไปล่ะ) ก็คือฟังก์ชัน

    • VALUE() ซึ่งให้ตัวเลขกลับมา แม้ว่าในเซลล์นั้น ๆ จะเป็นตัวเลขที่เก็บในรูปแบบข้อความ (number stored as text)
    • ISERROR() ซึ่งบอกว่าสูตรที่เราใช้ error ไหม? ถ้ามีจะใช้ค่ากลับมาเป็น TRUE อย่างเช่น ISERROR(VALUE(“5”)) จะให้ค่ากลับมาเป็น FALSE ก็คือไม่ error เพราะค่าของ 5 เป็นจำนวน ไม่ใช่ข้อความ
    • NOT() จะให้ค่าตรรกะตรงกันข้าม จาก TRUE เป็น FALSE และจาก FALSE เป็น TRUE อย่างเช่น NOT(ISERROR(VALUE(“5”))) จะให้ค่ากลับมาเป็น TRUE

    ใครอยากดูไฟล์ตัวอย่าง คลิกตรงนี้และ File > Save as > Download a copy จาก OneDrive ได้เลยนะครับ

    จากภาพตัวอย่างข้อมูลจะอยู่ในคอลัมภ์ A ส่วนผลลัพธ์จะอยู่คอลัมภ์ C

    โดยสูตรที่ใช้คือ

    =FILTER(A2:A25,NOT(ISERROR(VALUE(A2:A25)))*(A2:A25<>""))
    • A2:A25 เป็น Range ที่มีข้อมููลทั้งหมด (ทั้งตัวเลข ข้อความ และไม่มีข้อมูล)
    • NOT(ISERROR(VALUE(A2:A25))) คือ บอกฟังก์ชัน FILTER ว่า เอาเฉพาะเซลล์ที่ทดสอบว่าเป็นตัวเลขแล้วไม่ error นะ
    • ส่วน *(A2:A25<>””) ก็คือ บอกฟังก์ชัน FILTER ว่าเซลล์ที่ไม่มีข้อมูลก็ไม่เอานะ ใครสงสัยส่วนนี้ อ่านวิธีใช้งานฟังก์ชัน FILTER เพิ่มได้

    ถ้าเราต้องการแค่ข้อความล่ะ ไม่เอาตัวเลข

    👍 ถูกต้องแล้วครับ เอาฟังก์ชัน NOT ออกไปซะ จบเลย

    โดยสูตรที่ใช้เหลือแค่นี้

    =FILTER(A2:A25,ISERROR(VALUE(A2:A25))*(A2:A25<>""))

    ก็คือ เราบอกฟังก์ชัน FILER ว่า เอาเฉพาะเซลล์ที่ทดสอบว่าเป็นตัวเลขแล้วเกิด error

    เอิ่ม! แล้วทำไมไม่ใช้ฟังก์ชัน UNIQUE ร่วมกับ COUNT ไปเลยล่ะ

    😒 บอกตรง ๆ เลยว่่า พึ่งนึกออกตอนเขียนโพสต์นี้ล่ะครับ 😶‍🌫️

    สำหรับคนที่ งง ว่าอะไรของมึ้ง…

    คือฟังก์ชัน COUNT มันนับเฉพาะตัวเลขอยู่แล้ว ส่วนฟังก์ชัน UNIQUE ก็จะกรองเอาเฉพาะข้อมูลที่ไม่ซ้ำมาให้

    ดังนั้นสิ่งที่ผมต้องการจริง ๆ ก็คือ ใช้สูตรแค่นี้ก็ได้

    =COUNT(UNIQUE(A2:A25))

    โอ้ย… นกเอี้ยงบินมาเกาะเพียบเลย ต้องไปนอนแล้วล่ะ 😂✌️

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

    =COUNTA(UNIQUE(FILTER(A2:A25,ISERROR(VALUE(A2:A25))*(A2:A25<>""))))

    ใช้สูตร =COUNTA(UNIQUE(A2:A25)) เลยไม่ได้ เพราะตัวเลขนับเป็นข้อความใน Excel ด้วย หากสงสัยลองดูในไฟล์ตัวอย่างนะครับ

    มีข้อสงสัยตรงไหน หรืออยากให้เขียนอะไรเพิ่มเติม comment ไว้ได้เลยนะครับ 😘

    🥴 ปล. ผมนึกออกแล้วว่ากรณีงานของผม ทำไมต้องใช้ฟังก์ชัน FILTER ใช่แค่ COUNT ร่วมกับ UNIQUE ไม่ได้ผล เพราะผมมีเงื่อนไขเพิ่มเติมในอีก 2 คอลัมภ์ ซึ่งต้องไปใช้ร่วมกับฟังก์ชัน COUNTIFS อีกที

  • ข้อดีของการใช้ Format as Table ใน Excel

    ข้อดีของการใช้ Format as Table ใน Excel

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

    โพสต์นี้จึงอยากแนะนำข้อดีของการใช้ Format as Table ใน Excel ว่าจะช่วยให้เราทำงานได้ง่ายและเร็วขึ้นได้ยัง

    Table คืออะไร?

    สำหรับผมแล้ว table (ที่ไม่ใช้ data tables ในส่วนของการทำ what-if analysis) คือ การตั้งชื่อ range เพื่อให้เราสามารถเรียกใช้งานได้ง่ายขึ้นมาก ๆ โดยใช้ปุ่ม Format As Table ในแถบ Home หรือกด Ctrl + T

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

    1. ไม่ต้องเสียเวลาปรับสีและรูปแบบ

    เป็นข้อดึที่เห็นเป็นรูปอธรรมที่สุด ทำแล้วเห็นเลย เพียงแค่เลือกรูปแบบที่โดนใจจากรายการที่มีให้ หลังจากนั้นก็ไม่ต้องทำอะไรแล้ว โดยเฉพาะส่วนที่เรียกว่า banded row ซึ่งก็คือแถวคู่กับแถวคี่สีไม่เหมือนกัน ซึ่งถ้าคุณใช้ Format as Table นะ Excel จัดการให้เสร็จสรรพ

    และถ้าอยากเปลี่ยนรูปแบบก็แค่เลือกรูปแบบไหม่ ไม่ต้องไปปรับทีและแถวหรือทีละคอลัมภ์

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

    2. ใส่ Filter ให้โดยอัตโนมัติ

    คงไม่ต้องอธิบายเยอะ ก็คือ เราไม่ต้องไปคลิกเมาส์เพื่อใส่ Filter สำหรับกรองข้อมูลเอง หรือถ้าไม่อยากให้มีก็เลือกไม่ให้แสดงจาก contextual tab

    3. หัวตารางจะอยู่ให้เห็นเสมอ

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

    แต่ถ้าใช้ Format as Table ชื่อคอลัมภ์จะกลายเป็นหัวตารางไปเลย ดูในภาพด้านล่าง

    4. ตารางจะขยายออกโดยอัตโนมัติ

    เมื่อข้อมูลเราถูกทำเป็นตารางข้อมูลแล้ว เมื่อเพิ่มข้อมูลไม่ว่าจะแถวต่อไป หรือคอลัมภ์ถัดไป ตารางข้อมูลของเราจะขยายเพิ่มไปอัตโนมัติ

    แต่หาเราไม่ต้องการ เราก็สามารถ Undo ได้ ซึ่ง Excel จะหยุดขยายตารางออกมา แต่ข้อมูลที่พึ่งจะพิมพ์เข้าไปยังคงอยู่

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

    5. ตารางข้อมูลจะเป็น named range โดยอัตโนมัติ

    named range เป็นอีกฟังก์ชันหนึ่งที่ผมมักแนะนำให้คนใกล้ตัวใช้เสมอ โดยเฉพาะคนที่มีสูตร (formulas) ในไฟล์เยอะ ๆ เพราะเวลาอ่านมันเข้าในง่ายกว่าเยอะ เช่น

    =C5 + C5 * $B$3

    ถ้าเทียบกับ

    =[@Price] + [@Price] * VAT

    จะเห็นว่าสูตรคำนวณสิ่งเดียวกัน (ซึ่งในที่นี้ก็คือ ราคาขาย = ราคาสินค้า + ภาษีมูลค่าเพิ่ม) จะเห็นว่าสูตรด้านล่างจะดูเป็นภาษาที่มนุษย์เข้าใจได้ง่ายกว่า

    แต่สำหรับคนที่ยังไม่เคยใช้ตารางข้อมูลแบบนี้อาจจะงงงงหน่อย โดย [@Price] จะหมายถึงให้เอาข้อมูลในคอลัมภ์ชื่อ Price ในแถวเดียวกันมา

    โดยแนวทางการเรียกชื่อส่วนต่าง ๆ ใน table จะเป็นไปตามตารางนี้ และสมมติว่า table ของเราอยู่ที่ range A1:E202

    การเรียกข้อมูลในตารางคำอธิบายRange ที่จะอ้างถึง
    tblOrders[#All]อ้างถึงทุกส่วนของตารางข้อมูล ไม่ว่าจะเป็นหัวตาราง ข้อมูลในตาราง รวมไปถึงผลรวม หรือ total (ถ้ามี)$A$1:$E$202
    tblOrders[#Header]อ้างถึงเฉพาะแถวที่เป็นหัวตาราง หรือ Header row เท่านั้น$A$1:$E$1
    tblOrders[#Data]อ้างถึงเฉพาะส่วนข้อมูลของตาราง เท่านั้น$A$2:$E$201
    tblOrders[ColumnHeaderName]อ้างถึงข้อมูลในคอลัมภ์นั้น ๆ เท่านั้น เช่น tblOrders[TotalAmount]$E$2:$E$201
    tblOrders[#Totals]อ้างถึงเฉพาะแถวที่เป็นผลรวม ถ้ามีนะ ส่วนถ้าไม่มีก็จะได้ null หรือไม่มีค่าอะไรส่งกลับมา ก็คือไม่มีอะไรแสดงออกมานั่นล่ะ$A$202:$E$202

    ใส่ตัวกรอง การเรียงลำดับ และตัวช่วยค้นหา ให้แต่ละคอลัมภ์อัตโนมัติ

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

    เติมสูตรคำนวณในคอลัมภ์เดียวกันอัตโนมัติ

    อย่างเช่น หากผมอยากใส่สูตรที่จะบอกว่า order ในแต่ละแถวนั้นเกิดขึ้นเดือนไหน ต่อจากคอลัมภ์สุดท้ายของ table

    ผมแค่พิมพ์สูตรนี้

    =CHOOSE(MONTH([@TimeStamp]),"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","")

    ต่อจากข้อมูลในคอลัมภ์ F แถวไหนก็ได้ Excel จะเติมสูตรนี้ในแถวอื่นให้อัตโนมัติ ที่เหลือเราแค่ไปตั้งชื่อคอลัมภ์เอง เพราะปกติ Excel จะตั้งให้เป็น Column1

    เพิ่มข้อมูลในกราฟให้โดยอัตโนมัติ

    หากเรามีกราฟที่แสดงผลจากข้อมูลใน table
    เมื่อเราเติมข้อมูลเข้าไปใน table ข้อมูลที่ก็จะถูกแสดงผลเพิ่มในกราฟด้วย หรือ Dynamic Charts

    โดยสรุป

    การนำข้อมูลที่มีอยู่แปลงเป็น table (Format as Table) ช่วยให้เราประหยัดเวลาในการทำงานไปหลายอย่างมาก

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

    ดังนั้นควรใช้ table ร่วมกับ data validate ด้วย เพื่อป้องกันการป้อนข้อมูลและผลลัพธ์ที่ผิดพลาด

  • CapCut PC couldn’t load ttvideoeditor.dll

    CapCut PC couldn’t load ttvideoeditor.dll

    Today I just replaced my SSD and installed a clean install of Windows 11.

    So I thought I’d install CapCut, a new video editing app that seems pretty easy to use, so I wanted to give it a try.

    The problem encountered after the installation is finished is an error “couldn’t load ttvideoeditor.dll” as shown in the picture.

    I wasn’t sure what caused it. I also couldn’t find a solution on the internet too.

    So I thought, umm… never mind, just continue using the Davinci Resolve. Let’s wait for them to fix the problem.

    So I installed Davinci Resove. And it appears that Davinci Resolve says the Mfplat.dll file is missing.

    I’m confused. I guess it might be because I’m using Windows 11 N. I don’t know which software bundle is missing.

    And I found the Mfplat.dll file in the below video on YouTube and paste it in “C:\Windows\System32” folder as he told, without reinstalling the Davinci Resolve. Once opened, it works normally as usual.

    The surprising thing is that when I open CapCut again, it works too and passed Environment Testing as well, as in the picture.

    Hope this method can solves your problem too.

    Have fun editing your video. 😊

    😶‍🌫️ Update: 6-Jun-23, Another potential way to fix the problem officially is by install the “Media Feature Pack list for Windows N editions

  • สูตรสุ่มตัวเลขแบบไม่ซ้ำใน Excel

    ⚠ ข้อควรระวัง – สูตรนี้ใช้ได้เฉพาะใน Excel 365 และ Excel 2021 ซึ่งสนับสนุนการใช้ dynamic array เท่านั้น

    โดยจะใช้ฟังก์ชัน SORTBY, SEQUENCE และ RANDARRAY ทำงานร่วมกัน โดยจะเริ่มจากง่าย ๆ ไม่ต้องใส่ตัวเลือกอะไรเยอะแยะไปก่อน

    =SORTBY(SEQUENCE(n),RANDARRAY(n))

    โดยที่ n คือ จำนวนสุ่มที่เราต้องการ และตัวอย่างในภาพคือ 10 ซึ่งจะเห็นว่าสูตรนี้เหมือนแค่เอาเลข 1 ถึง 10 มาเรียงสลับตำแหน่งกันเฉย ๆ

    ซึ่งบางท่านไม่ได้ต้องการแบบนี้

    การสุ่มจำนวนเต็มแบบไม่ซ้ำ

    คราวนี้หากเราใส่ตัวเลือกเพิ่มเติมเข้าไปในฟังก์ชัน SEQUENCE ดังนี้

    • n คือ จำนวนที่จะสุ่มเหมือนเดิม
    • start คือ เริ่มสุ่มจากเลขอะไร
    • step คือ ให้เพิ่มขึ้นทีละเท่าไหร่
    =SORTBY(SEQUENCE(n,,start,step),RANDARRAY(n))

    โดยตัวอย่างในภาพคือ เราต้องการสุ่ม 10 เลข เริ่มจาก 100 และเพิ่มขึ้นทีละ 3

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

    แต่หากไม่ต้องการแบบนี้ ลองดูอีกแบบด้านล่าง ซึ่งอาจมีความซับซ้อนกว่านิดหน่อย แต่ไม่มีการกำหนด step ไว้

    การสุ่มจำนวนเต็มแบบไม่ซ้ำ (แบบที่ 2)

    • n คือ จำนวนที่จะสุ่ม
    • start คือ เริ่มสุ่มจากเลขอะไร
    • stop คือ สุ่มถึงเลขอะไร
    =INDEX(UNIQUE(RANDARRAY(n^2, , start, stop, TRUE)), SEQUENCE(n))

    การสุ่มเลขมีทศนิยมแบบไม่ซ้ำ

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

    =INDEX(UNIQUE(RANDARRAY(n^2, , min, max, FALSE)), SEQUENCE(n))

    สำหรับ ไฟล์ตัวอย่าง นี้ อย่างลืมนะว่า สูตรที่เราใช้เป็น dynamic arrays ดังนั้นถ้าจะ copy ให้เลือกที่แถว 2 เท่านั้น


    หากเลือกที่แถวอื่น ❌ จะเห็นสูตรเป็นสีเทา ๆ 😁

  • สูตร Excel สำหรับแยกชื่อและนามสกุล ด้วยฟังก์ชัน TEXTBEFORE และ TEXTAFTER

    ผมเคยเขียนวิธีการแยกชื่อ-สกุลออกมากันไปแล้วตอนหนึ่ง โดยใช้ Text to Columns ในแถบ Data

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

    ซึ่งถ้าความต้องการเป็นแบบนั้น เราก็จะต้องให้สูตร หรือไม่ก็ฟังก์ชันแหละ โดยสำหรับผู้ใช้ Office 365 ตอนนี้ฟังก์ชัน TEXTBEFORE() กับ TEXTAFTER() น่าจะเปิดให้ใช้แล้ว

    สำหรับผู้ที่ไม่มี 2 ฟังก์ชันดังกล่าว ก็สามารถใช้ LEFT() และ RIGHT() รวมกับ FIND() และ LEN() ได้

    แต่ก่อนอื่นมาดูข้อมูลก่อน

    ตัวอย่างข้อมูลที่จะใช้ฟังก์ชัน TEXTBEFORE() และ TEXTAFTER() แยกชื่อ-สกุล

    จากภาพตารางข้อมูลด้านบน ช่องข้อมูลหลักของเราจะเป็นคอลัมภ์ A ซึ่งจะเป็นชื่อ-สกุล รวมอยู่ในเซลล์เดียวกัน แยกด้วย spacebar ส่วนคอลัมภ์ B จะเป็นชื่อที่เราจะใช้ TEXTBEFORE() แยกออกมา และคอลัมภ์ C จะใช้ TEXTAFTER()

    การใช้งาน TEXTBEFORE()

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

    =TEXTBEFORE(text,delimiter,[instance_num],[match_mode],[match_end],[if_not_found])
    • text – ก็คือข้อความ หรือเซลล์ที่เราจะดึงข้อมูลออกมา
    • delimiter – เป็นอักษร หรือข้อความที่เราจะบอกให้ฟังก์ชันหา และเอาข้อความที่อยู่ก่อนหน้านี้ออกมาให้เรา
    • instance_num [ไม่ต้องใส่ก็ได้] – แต่ถ้าใช้หมายถึงจะเลือกจากการเจอ delimiter ครั้งที่เท่าไหร่ ปกติค่านี้เป็น 1 แต่ถ้าตัวเลขติดลบ เช่น -1 ฟังก์ชันจะค้นจากด้านหลังย้อนกลับมา
    • match_mode [ไม่ต้องใส่ก็ได้] – ใช้กำหนดว่าเราต้องการแยกความแตกต่างระหว่างตัวเล็กกับตัวใหญ่หรือไม่ (ภาษาอังกฤษ) ปกติค่าเป็น 0 คือจะแยก a กับ A ว่าต่างกัน ถ้ากำหนดเป็น 1 จะไม่สนใจจะเป็น a หรือ A ฟังก์ชันจะหยุด
    • match_end [ไม่ต้องใส่ก็ได้] – ใส่เพิ่มให้ delimiter เป็นตัวอักษรสุดท้ายไหม ซึ่งในทางปฏิบัติคือ ถ้าไม่พบ delimiter ผลลัพธ์จะเป็นข้อความที่ใส่ไปนั่นเอง ปกติค่าจะเป็น 0 คือ ไม่ต้องทำ ถ้าไม่พบผลลัพธ์จะเป็น #N/A หรือข้อความที่เรากำหนดเองในอาร์กิวเมนต์สุดท้าย ส่วนถ้ากำหนดเป็น 1 ผลลัพธ์ก็คือ ค่าที่อยู่ในเซลล์ หรือข้อความที่เราใส่เข้าไปในอาร์กิวเมนต์แรก
    • if_not_found [ไม่ต้องใส่ก็ได้] – ใช้กำหนดข้อความที่จะให้แสดง หากไม่พบ delimiter ในค่าที่อยู่ในเซลล์ หรือข้อความที่เราใส่เข้าไปในอาร์กิวเมนต์แรก ปกติหากไม่พบผลลัพธ์จะเป็น #N/A ส่วนถ้าจะกำหนดก็คือ ใส่ข้อความของเราในเครื่องหมายคำพูด (double quote) เช่น “Not found” หรือ “ไม่พบ” เป็นต้น

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

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

    โดยสูตรที่เราใช้ใน B2 ก็คือ

    =TEXTBEFORE(A2," ")

    ก็จะเห็นว่า เราจะได้เฉพาะข้อความที่อยู่หน้า spacebar กลับมา

    การใช้งาน TEXTAFTER()

    =TEXTAFTER(text,delimiter,[instance_num], [match_mode], [match_end], [if_not_found])

    โดยจะสังเกตว่าอาร์กิวเมนต์ต่าง ๆ จะเหมือนกับ TEXTBEFORE() ทุกอย่าง แต่จะได้ผลลัพธ์ที่ตรงกันข้ามคือ ได้ข้อความที่อยู่หลัง delimiter กลับมา

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

    โดยสูตรที่ใช้ใน C2 ก็คือ

    =TEXTAFTER(A2," ")

    และเราจะได้เฉพาะข้อความที่อยู่หลัง spacebar กลับมา

    การแยกชื่อด้วยฟังก์ชัน LEFT() ร่วมกับ FIND()

    สำหรับผู้ที่ไม่มีฟังก์ชัน TEXTBEFORE() ในช่อง B2 เราจะใช้สูตร

    =LEFT(A2,FIND(" ",A2)-1)

    โดยฟังก์ชัน LEFT() จะดึงตัวอักขระเริ่มจากทางซ้าย (ซึ่งบางทีผมก็เรียกว่า “ข้อความ” นะ 😅) ตามจำนวนที่เราใส่ไว้ในอาร์กิวเมนต์ที่ 2 ซึ่งในที่นี้เราใช้ฟังก์ชัน FIND() ซึ่งจะบอกว่าไปเจออักขระ หรือข้อความที่เราใส่ในอาร์กิวเมนต์แรก ว่าเจอเป็นลำดับที่เท่าไหร่

    และเหตุที่ต้องลบ 1 ออกจากค่าที่ FIND() ส่งกลับมา เพราะ FIND() จะส่งตำแหน่งที่เจอ (ในตัวอย่างนี้คือ spacebar) กลับมา อย่างใน B2 คือตำแหน่งที่ 4 แต่เราต้องการแค่ 3 อักขระ ก็คือ “ชยา”

    ส่วนหากใครไม่ได้ลบออก 1 อักขระที่เราไม่เห็นเพราะมันเป็น spacebar แต่ถ้าใช้ฟังก์ชัน LEN() ซึ่งจะบอกว่าข้อความนั้นมี 4 อักขระ

    ⚠️ฟังก์ชัน FIND() จะเป็นสนใจความแตกต่างระหว่างตัวเล็กกับตัวใหญ่ในภาษาอังกฤษนะ ถ้าเราไม่สนใจให้ใช้ฟังก์ชัน SEARCH() แทน

    การแยกนามสกุลด้วยฟังก์ชัน RIGHT() ร่วมกับ LEN() และ FIND()

    ส่วนการแยกนามสกุล เราจะใช้สูตรนี้

    =RIGHT(A2,LEN(A2)-FIND(" ",A2))

    โดยฟังก์ชัน RIGHT() จะดึงอักขระเริ่มจากด้านขวาของอาร์กิวเมนต์ที่เราใส่เข้าไป ตรงกันข้ามกับ LEFT()

    ส่วนอาร์กิวเมนต์ที่ 2 เราจะใช้ฟังก์ชัน LEN() ซึ่งจะบอกว่า A2 มีอักขระทั้งหมดกี่ตัว และในตัวอย่างคือ 13 อักขระ แล้วมาหักลบออกด้วยค่าที่ฟังก์ชัน FIND() ไปเจอ spacebar มา ซึ่งก็คือ 4 จะเหลือ 9 อักขระ ดังนั้นผลลัพธ์ก็เลยเป็น “ภัชรปรีดา”

    จะเห็นได้ชัดว่ากรณีแยกนามสกุลฟังก์ชัน TEXTAFTER() ช่วยทำให้การพิมพ์สูตรของเราดูง่ายขึ้นเยอะเลย

  • การทำตัวเลือก drop down แบบค้นหาได้

    การทำตัวเลือก drop down แบบค้นหาได้

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

    ตัวอย่างที่งานฝ่ายบุคคลพบบ่อยได้แก่ คนที่ชื่อ “นา” แผนก Operation นี่เขาชื่อจริงว่าอะไรนะ โดยเฉพาะคนที่ไม่ได้ส่งเมล์หาคนคนนั้นบ่อย ๆ

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

    ตัวอย่างคือ ถ้าเราพิมพ์คำว่า “นา” เข้าไป จะมีเฉพาะรายชื่อพนักงานที่มีคำนี้อยู่ในชื่อมาให้เลือก

    ก่อนอื่นข้อมูลตัวอย่างอยู่ในซีตชื่อ “data” โดยข้อมูลนี้ได้จากการสุ่มมาจาก https://kidhaina.com/thainamegenerator.html และเหมือนเช่นเคย (สำหรับผม 😁) ข้อมูลทำการ Format as Table แล้ว และตั้งชื่อเป็น tblData

    ข้อมูลพนักงานที่เราใช้นำมาทำตัวอย่าง

    มีอีก 2 คอลัมภ์ที่นำข้อมูลที่มีอยู่มาเชื่อมกัน โดยคอลัมภ์ i หรือ forlookup จะใช้แสดงผลลัพธ์เมื่อผู้ใช้เลือกชื้อใดชื่อหนึ่ง

    ส่วนคอลัมภ์ j หรือ forsearch ใช้เพื่อช่วยให้เราสามารถค้นหาได้ทั้งภาษาไทยและภาษาอังกฤษ ดังภาพ

    2 คอลัมภ์ที่นำข้อมูลที่มีอยู่มาเชื่อมกัน

    ฟังก์ชันที่ใช้กรองข้อมูล

    สำหรับการกรองข้อมูลที่มีอยู่เทียบกับข้อมูลที่ถูกพิมพ์เขามา เราจะใช้ฟังก์ชัน FILTER(), SEARCH() และ ISNUMBER() ทำงานร่วมกัน

    สำหรับตัวอย่างผมแยกชีต “Data” กับ “Search” ออกจากกัน โดยข้อมูลที่จะให้ผู้ใช้พิมพ์และเลือกตัวเลือกจะอยู่ในเซลล์ B2 ของชีตชื่อ “Search”

    ของเริ่มจากฟังก์ชัน SEARCH() ซึ่งใช้สำหรับค้นหาตัวอักษรหรือข้อความ โดยไม่สนความแตกต่างของตัวใหญ่หรือตัวเล็กในภาษาอังกฤษ โดยสูตรผมจะใส่ในเซลล์ L2 ตามนี้ก่อน

    =SEARCH(Search!$B$2,tblData[forsearch])

    ในที่นี้หมายถึงให้ค้นหาคำว่า “นา” ซึ่งถูกพิมพ์ไว้ในเซลล์ B2 ของชีตชื่อ Search โดยผลลัพธ์จะเป็นดังภาพ ซึ่งก็คือในแถว 6 เจอคำนี้อยู่ลำดับที่ 16 ส่วนแถวที่ 8 เจอที่ตัวแรก ไปเรื่อย ๆ

    แต่เราจะใช้เฉพาะแถวที่เป็นผลเป็นตัวเลข เราก็เลยต้องพึ่งฟังก์ชัน ISNUMBER() ซึ่งผลจะได้เป็นไม่ TRUE ก็จะเป็น FALSE ดังภาพ

    =ISNUMBER(SEARCH(Search!$B$2,tblData[forsearch]))

    และเราจะใช้ค่านี้ส่งเข้าไปให้ฟังก์ชัน FILTER() ช่วยกรองเอาเฉพาะข้อมูลที่ตรงกับที่พิมพ์มา ซึ่งก็คือค่าเป็น TRUE และสูตรจะกลายเป็น

    =FILTER(tblData[ชื่อ-สกุล],ISNUMBER(SEARCH(Search!$B$2,tblData[forsearch])),"Not found")

    โดยอาร์กิวเมนต์ตัวแรกจะเป็นข้อมูลที่เราต้องการ ซึ่งในที่นี้คือคอลัมภ์ “ชื่อ-สกุล” เพราะต้องการแสดงข้อมูลจากคอลัมภ์นี้

    และเป็นสูตรที่เราใช้ก่อนหน้านี้ ⚠️ ซึ่งจะค้นหาจากคอลัมภ์ชื่อ “forsearch” เพราะเราต้องการค้นหาทั้งภาษาไทยและภาษาอังกฤษ

    สุดท้ายถ้าไม่พบให้ส่งค่า “Not found” กลับมา

    ผลลัพธ์หลังใช้ร่วมกับฟังก์ชัน FILTER()

    จะเห็นว่าเราจะใช้เฉพาะชื่อพนักงานที่มีคำว่า “นา” อยู่ด้วยกลับมา

    และหากเราต้องการเรียงข้อมูลด้วย เราสามารถใส่ฟังก์ช้น SORT() เพิ่มเข้าไปอีกชั้นหนึ่งได้ และสูตรก็จะกลายเป็น

    =SORT(FILTER(tblData[ชื่อ-สกุล],ISNUMBER(SEARCH(Search!$B$2,tblData[forsearch])),"Not found"))
    ผลลัพธ์หลังจากที่เราใช้ฟังก์ชัน SORT เพิ่มเข้าไป

    โดยฟังก์ชัน FILTER() จะให้ข้อมูลกลับมาเป็นไดนามิก อาร์เรย์ (dynamic array) ซึ่งผลลัพธ์จะส่งกลับมามากกว่า 1 ค่า และจะเรียงลงไปตามแถวเรื่อย ⚠️ ดังนั้นคอลัมภ์ L ไม่ควรจะมีอะไรนอกจากนี้ ไม่เช่นนั้นข้อมูลจะถูกวางทับไป แต่ถ้าเราจะแก้ไขอะไรก็แก้ไขแค่ L2 เท่านั้น

    เมื่อเสร็จจากการเตรียมรายการข้อมูลที่จะให้ผู้พิมพ์เลือกแล้ว เราจะกลับไปที่ชีต Search และเลือกเซลล์ B2 เพื่อทำ Data Validation (Data > Data Validation > Data Validation…)

    ที่ Allows: เลือกเป็น List และที่ Source: เลือกเป็นชีต Data เซลล์ L2 และพิมพ์เครื่องหมาย # เปิดท้าย 💡 เพื่อให้ Excel ดึงรายการด้านล่างมาดด้วย ดังภาพ

    =Data!$L$2#

    และ💥ที่ลืมไม่ได้คือ เราต้องยกเลิก Error Alert ของ Data Validation ของเซลล์นี้ด้วย ไม่เช่นนั้นเราจะพิมพ์ค่าอื่น นอกเหนือจากที่มีข้อมูลไม่ได้ และ Excel จะแสดง Error ให้ผู้ใช้ทราบ

    ซึ่งถ้าพิมพ์ข้อมูลที่ไม่พบ รายการจะแจ้งว่า “Not found” อยู่แล้ว

    คลิกที่แถบ Error Alert และคลิกที่เครื่องหมายถูกที่มีอยู่ให้หายไป ซึ่งจะได้ลักษณะดังภาพ

    เมื่อทำเสร็จ สมมติเราลองพิมพ์ “ya” เข้าไป เพื่อหาผู้ที่ในชื่อมีคำนี้ ก็จะได้ผลลัพธ์ดังภาพ

    ทดลองค้นด้วยภาษาอังกฤษ

    และหากเราเลือกเป็น “ชยา ภัชรปรีดา (คิด)” ในช่อง D2 ก็จะแสดงชื่อและแผนกของคน ๆ นั้นขึ้นมา ดังภาพด้านล่างนี้

    ใช้ XLOOKUP() ไปด้วยข้อมูลกลับมาแสดงผล

    เพียงเท่านี้ก็เรียบร้อยแล้วครับ หากติดขัดตรงไหนดูจากไฟล์ตัวอย่าง หรือ comment ไว้ด้านล่างได้นะครับ

  • การใส่เครื่องหมายคำพูดในสูตร Excel

    อาจมีบางครั้งเหมือนกันที่เราต้องการใช้ผลลัพธ์ใน Excel ที่เป็นเครื่องหมายคำพูด หรือเครื่องหมายอัญประกาศ หรือบางคนก็เรียกว่า “ฟันหนู” (มีหลายชื่อเหมือนกันแฮะ) โดยในภาษาอังกฤษก็คือ double quote (“) หรือเรียกเต็มคือ double quotation mark นั่นเอง

    และก็เป็นที่รู้กันอยู่แล้วว่า double quote ใช้สำหรับกำหนดช่วงของข้อความในสูตร Excel เช่น ถ้าเราใช้สูตร =A1&" นิ้ว" และในเซลล์ A1 มีค่าเท่ากับ 3 ผลลัพธ์ในเซลล์ที่เราใส่สูตรไว้จะแสดงเป็น 3 นิ้ว

    ตัวอย่างการเพิ่มข้อความ (string) ในสูตร Excel

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

    ตัวอย่าง error ที่เกิดขึ้นหากเราใส่เครื่องหมายคำพูดใน Excel ไม่ครบคู่

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

    วิธีการใส่เครื่องหมายคำพูดในผลลัพธ์ที่ถูกต้อง

    หรือหากใครใช้สูตรที่ซับซ้อนเกรงว่าจะงง เราสามารถใช้ฟังก์ชัน CHAR() แทนการใช้ escape string ก็ได้ โดยรหัส ASCII ของเครื่องหมายคำพูดคือ 34 จากภาพด้านล่างสูตรในเซลล์ E2 จะเป็น =D2&CHAR(34) และจะได้ผลลัพธ์เป็น 6"

    การใช้ฟังก์ชัน CHAR เพื่อแสดงเครื่องหมายคำพูด

  • การตัดข้อมูลซ้ำออกใน Excel

    สำหรับใครที่เจอปัญหาที่จะต้องกรอง หรือตัดข้อมูลซ้ำออกบ่อย ๆ โดยเฉพาะข้อมูลที่มาจาก Microsoft Forms หรือ Google Forms ซึ่งตั้งแต่ก่อนจะต้องใช้ advance filter มาช่วยจัดการ แต่ค่อนข้างจะใช้หลายคลิกถึงจะได้เฉพาะข้อมูลที่ต้องการ รวมถึงหากข้อมูลเปลี่ยนไปข้อมูลที่กรองออกมาแล้ว จะไม่เปลี่ยนแปลงตาม (ไม่ dynamic update) ตอนนี้ใน Excel มีฟังก์ชันชื่อ UNIQUE มาช่วยแก้ไขปัญหานั้นแล้ว

    ฟังก์ชัน UNIQUE ใน Excel

    ⚠ แต่ต้องบอกไว้ก่อนว่า จะใช้ได้เฉพาะผู้ที่เป็นสมาชิก Office 365 หรือ Excel 2021 เป็นต้นไป โดยฟังก์ชันนี้จะกรองเอาเฉพาะข้อมูลที่ไม่ซ้ำกันมาให้เรา

    ตัวอย่างการใช้ฟังก์ชัน UNIQUE และการใช้ร่วมกับฟังก์ชัน SORT

    การใช้งานฟังก์ชัน UNIQUE

    วิธีใช้งานง่าย ๆ คือใช้สูตร =UNIQUE(A2:A40) ใน cell แรกที่เราต้องการจะใส่ข้อมูลที่ผลการกรอกข้อมูลจะออกมา

    ไวยากรณ์ (Syntax)

    =UNIQUE(array,[by_col],[exactly_once])
    • array ก็คือ range ข้อมูล หรือจะใส่ข้อมูลเป็น array ก็ได้ (หมายถึงฟังก์ชันที่ให้ค่ากลับมาเป็น array)
    • by_col 💬 ไม่จำเป็นต้องระบุ จะเป็น FALSE โดยปริยาย แต่ถ้ากำหนด TRUE จะกำหนดให้กรองข้อมูลโดยดูจากคอลัมภ์ (ใช้ในกรณีข้อมูลที่จะกรองมาในแบบคอลัมภ์) เพราะปกติฟังก์ชัน UNIQUE จะกรองในแบบแถว (row)
    • exactly_once 💬 ไม่จำเป็นต้องระบุ จะเป็น FALSE โดยปริยาย แต่ถ้ากำหนดเป็น TRUE

    ตัวอย่างการกรองข้อมูลซ้ำแบบคอลัมภ์

    สำหรับอีกตัวอย่างเป็นการกรองข้อมูลที่เรียงมาแบบคอลัมภ์ โดยแถวที่ 1 ในไฟล์ตัวอย่างจะสุ่มตัวเลขจากคอลัมภ์ B ถึง Z

    และในแถวที่ 4 จะเป็นผลลัพธ์จากการตัดข้อมูลซ้ำออกไปแล้ว โดยข้อมูลซ้ำในแถวที่ 1 จะถูกไฮไลท์สีแดงไว้

    การกรองเอาเฉพาะข้อมููลที่พบเพียงครั้งเดียว

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

    ซึ่งจากในภาพจะเห็นว่า มีเพียง 2 คน แต่ถ้าเปิดจากไฟล์ตัวอย่างข้อมูลอาจแตกต่างไปจากนี้ ทั้งตัวอย่างใน sheet ที่ 2 และ 3 เพราะข้อมูลได้มาจากการสุ่ม

    หากลองใช้แล้วติดปัญหาอะไร ใส่ comment ไว้ได้เลยนะครับ 😄