วิธีจัดการเลขไทยใน Excel และ Power BI

ในช่วงนี้มีประเด็นในโลก Social เกี่ยวกับ “การใช้เลขไทยในเอกสารราชการ” ทำให้อ่านยาก ลามไปที่ถึงที่มาของเลขไทยและวัฒนธรรมไทยอันดีงาม (ไปได้ไงเนี่ย…) ซึ่งในที่นี้ผมจะไม่ขอพูดถึงเรื่องดราม่าอันนั้น แต่จะมาพูดถึงวิธีที่ Excel และ Power BI จัดการกับเลขไทยดีกว่า มาดูกันดีกว่าครับว่ามีอะไรน่าสนใจบ้าง?

เลขไทยจัดการไม่ยากอย่างที่คิด(ถ้าทำงานในฐานะตัวเลข)

ถ้าเราพิมพ์ตัวเลขไทย หรือ Copy เลขไทยลงไปใน Excel เองเลย ปกติ Excel จะมองอันนั้นเป็นตัวเลขอยู่แล้วนะครับ เช่น ถ้าพิมพ์เลขไทย ๑๒๓๔ เนี่ย excel จะมองว่าค่าที่แท้จริงของมันคือ 1234 อยู่แล้ว ดังนั้นไม่ใช่ปัญหา (ไม่ว่า Region ใน Control Panel จะตั้งค่าเป็น Thai หรือ US/UK ก็ตาม)

ถ้ามองว่าค่าที่แท้จริงเป็น 1234 แปลว่า ที่เราเห็นเป็นเลขไทย มันเป็นแค่ Format หรือรูปลักษณ์ภายนอก ดังนั้นวิธีแก้ไข คือ แค่เราปรับ Format ให้มันเป็นเลขอารบิกปกติ เช่น ปรับให้กลายเป็น General หรือ Number ก็จบ

ตอนยังมี Number Format เป็นเลขไทย
ตอนปรับ Number Format ช่องเดิมเลย ให้กลายเป็นเลขปกติ

ในทางกลับกันก็แปลว่า ถ้าเดิมเราทำงานกับเลขอารบิกอยู่ เราก็สามารถแปลงให้เห็นเป็นเลขไทยได้เช่นกัน ด้วยการใส่ Number format ที่เหมาะสม ใน Custom โดยมี Code [$-th-TH,D00] นำหน้า แล้วตามด้วย Custom Format มาตรฐาน เช่น

ถ้าอยากได้เลขจำนวนเต็มก็แบบนี้

[$-th-TH,D00]0

ถ้าอยากมี ทศนิยม 2 ตำแหน่ง ก็ใช้อันนี้

[$-th-TH,D00]0.00

ถ้าอยากมี Comma คั่นหลักพัน ก็ใช้อันนี้

[$-th-TH,D00]#,##0

จะเห็นว่าเราใช้การปรับ Format ได้อย่างอิสระ ดังนั้นข้าราชการทั้งหลายไม่จำเป็นต้องไปนั่งพิมพ์เลขไทยแต่แรกนะ ยากจะตาย!!

ข้อควรระวัง!

อย่างไรก็ตาม ถ้าเราพิมพ์เลขไทยในฐานะที่เป็นข้อความ เช่น พิมพ์เป็นส่วนหนึ่งของข้อความไปเลย อันนี้มันจะเก็บข้อมูลในฐานะข้อความจริงๆ ซึ่งการจะมาแก้เป็นเลขอารบิกภายหลังจะยุ่งหน่อย คือ ต้องใช้หลักการแทนที่อักขระ ๐๑๒๓๔๕๖๗๘๙ แต่ละตัวด้วย 0123456789 ซึ่งทำได้หลายวิธี เช่น

  • ซึ่งจะใช้ find/replace ทีละตัว 10 ครั้ง
  • ใช้ฟังก์ชัน SUBSTITUTE ทีละตัว 10 ครั้ง
  • จะใช้มาโคร/VBAช่วย
  • ถ้าใครมี Excel 365 จะเขียนฟังก์ชันด้วย LAMBDA มาจัดการก็ได้
  • แต่ในบทความนี้ผมจะใช้การเขียนฟังก์ชันใน Power Query มาช่วยจัดการซึ่งอ่านได้ในตอนท้ายของบทความครับ (เพราะวิธีนี้ใช้กับ Power BI ได้ด้วย)

การ Save / เปิด ไฟล์เป็น Text, CSV ที่มีเลขไทย

ถ้าสมมติเรามีเลขไทยใน Excel ได้ตามต้องการแล้ว เช่น

จากนั้นหากเราต้องการ Save เป็นไฟล์ Text, CSV ก็ทำได้ เช่น แบบนี้ (เลือกเป็น CSV UTF-8)

ซึ่งในไฟล์ csv ถ้าลองไปเปิดใน notepad ก็จะเห็นบันทึกข้อมูลมาเป็นแบบนี้

จากนั้นในอนาคต เวลาเราดับเบิ้ลคลิ๊กเปิดไฟล์ CSV อันนั้นขึ้นมา (มันจะใช้ Excel เปิดอยู่แล้ว) ก็จะไม่มีปัญหา เราจะเห็นเป็นเหมือนเดิมเลย แค่ไม่มี format ตัวหนา/สี แต่ก็ยังเห็นเลขไทย ที่มีค่าที่แท้จริงเป็นตัวเลขถูกต้อง

แต่ถ้ากรณีเราดับเบิ้ลคลิ๊กเปิดไฟล์ CSV ที่ได้มาจากคนอื่นที่ Save แล้วดันเป็นภาษามนุษย์ต่างดาวแบบนี้ แสดงว่ามันใช้ Encoding ผิดตัวในการตีความอักขระในไฟล์นั้นๆ อย่าเพิ่งตกใจ… ถ้าใช้ Excel 2016 ขึ้นไปให้ใช้ Power Query เปิดก็ได้ แล้วเลือก Encoding ให้ถูกต้อง

การใช้ Power Query ใน Excel จัดการเลขไทยแบบง่าย

เลือก Get Data จาก Text,CSV ที่มีปัญหาซะ

เลือก Encoding ที่อ่านภาษาไทยออก ให้ลอง 65001:UTF-8 กับ 874:Thai (Windows) ดู ว่าอันไหนอ่านออกบ้างมั้ย? ในที่นี้ UTF-8 อ่านออก จากนั้นกด Transform Data เพื่อจัดการหัวตารางให้เรียบร้อย

ลบ Step Change Type ออก แล้วกด Use First Row as Header ใหม่อีกที จะได้ผลลัพธ์แบบนี้

จะเห็นว่าคอลัมน์จำนวน มันตีความเลขไทยเป็นข้อความ (ABC) ซึ่งจริงๆ ไม่ถูกต้อง แต่การแก้ใน Power Query จะค่อนข้างยุ่ง ดังนั้นเราจะโหลดผลลัพธ์ออกไปใน Excel เลย แล้วไปจัดการใน Excel ดังนั้นให้กด Close & Load to… แล้วออกมาเป็น Table ใน Excel เราจะพบว่า Excel ก็จะมองเลขไทยเป็น Text ไปด้วย

แต่วิธีแก้ใน Excel ง่ายมาก แค่สร้างคอลัมน์ใหม่ข้างๆ แล้ว เอาคอลัมน์เลขไทยไปคูณ 1 เพื่อบังคับให้เป็นตัวเลขก็จบเลย

วิธีจัดการเลขไทยใน Power Query / Power BI แบบจบในตัว

ในกรณีที่เราต้องไปทำรายงานใน Power BI เราต้องจัดการให้จบใน Power Query เลย ซึ่งขั้นตอนถ้าจะทำด้วย Replace Value 10 รอบก็ได้ แต่ก็จะค่อนข้างยุ่งยาก ดังนั้นผมจึงเขียนฟังก์ชันขึ้นมาจัดการเรื่องนี้ให้แล้วครับ ชื่อว่า ThepThaiNumbertoArabic (ไปโหลดฟังก์ชันนี้ และฟังก์ชันอื่นๆ ที่น่าสนใจมากมายได้จากที่นี่)

ถ้าใครอยากรู้ว่าในฟังก์ชันมีอะไร ก็จะประมาณนี้ครับ

(OriginalText as text) as text =>
let
    TextList=Text.ToList(OriginalText),
    ZipReplace=List.Zip({{"๐".."๙"},{"0".."9"}}),
    Result=List.ReplaceMatchingItems(TextList,ZipReplace,Comparer.OrdinalIgnoreCase),
    ResultCombine=Text.Combine(Result)
in
    ResultCombine

แค่มีฟังก์ชันของผมและเรียกใช้ฟังก์ชันนั้นกับคอลัมน์ที่ต้องการด้วย Invoke Custom Function ก็จะใช้ได้เลย

กรณีที่ต้องการ Convert เป็นตัวเลข ก็จะสามารถกด Change Type อีกทีได้ตามปกติแล้ว

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


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *