เปลี่ยนเลขอารบิกเป็นเลขไทย แบบง่าย ๆ จะทำอย่างไร ถ้าไม่ใช้ฟอนต์ TH Sarabun IT๙ ด้วยเหตุผลที่เขียนไปแล้ว
หลังจากเขียนถึงเหตุผลที่ไม่อยากให้ใช้ TH Sarabun IT๙ กันไปแล้ว ทีนี้มาถึงการหาทางออกสำหรับผู้ที่ต้องการเปลี่ยนเลขอารบิกให้เป็นเลขไทยแบบรวดเดียวกันบ้าง ในกรณีที่ได้เอกสาร (หรือ copy ข้อความมาจากที่อื่น) ที่เป็นเลขอารบิก
เปลี่ยนเลขอารบิกเป็นเลขไทย ด้วย Find and Replace
วิธีแรก เป็นวิธีแก้ไขแบบบ้าน ๆ ไม่ต้องอาศัยทริกอะไรเลย ก็คือ Find and Replace คือ ค้นหา (Find) ๑ แล้วแทนที่ (Replace) ด้วย 1 ทำแบบนี้ไปจนครบ 10 เลข
เราเรียกหน้าต่าง Find and Replace ด้วยการกด Ctrl + H เลยจ้ะ ง่าย ๆ
หรือไปที่แท็บ Home แล้วเลือกสัญลักษณ์แว่นขยาย (หรือ Editing) กดเลือก Replace ก็ได้ไม่ต่างกัน
แม็ค: ให้กด cmd+f หรือ แท็บ Home แล้วเลือกสัญลักษณ์แว่นขยาย (หรือ Editing) กดเลือก Replace

โอเค งั้นเรามาเขียน VBA เพื่อ “ค้นหาและแทนที่” และทำปุ่มไว้กด เพื่อจะได้เปลี่ยนเลขอารบิกเป็นไทยโดยคลิกเพียงแค่คลิกเดียว
หลักการก็คือให้ค้นหา (find) เลข 0 – 9 แล้วแทนที่ (replace) ด้วย ๐ – ๙ หมายเหตุ ตัวอย่างที่ใช้จะทำด้วย Microsoft 365 ในวินโดวส์ เวอร์ชันอื่นอาจมีหน้าตาแตกต่างกันเล็กน้อย
VBA เปลี่ยนเลขอารบิกเป็นเลขไทย
เปิด Word ขึ้นมา คลิกที่ View > Macros ใส่ชื่ออะไรก็ได้ในช่อง macro name คลิก Create เพื่อเข้าสู่ visual basic
ลบทุกอย่างไปก่อน แล้ว ใส่คำสั่งนี้เข้าไปแทน
Sub arabic_to_thai()
For i = 0 To 9
With Selection.Find
.Text = Chr(48 + i)
.Replacement.Text = Chr(240 + i)
.Wrap = wdFindContinue
End With
Selection.Find.Execute Replace:=wdReplaceAll
Next
End Sub
อธิบายโค้ด
บรรทัดที่เขียนว่า Sub arabic_to_thai () คือการตั้งชื่อ จำชื่อนี้ไว้ หรือจะเปลี่ยนเป็นอะไรก็ได้ตามที่ต้องการ แต่เวลาที่เราจะรันโค้ดนี้ เราจะเรียกชื่อนี้
คำสั่งไม่มีอะไรมาก แค่ค้นหาเลข 0 – 9 แล้วแทนที่ด้วย ๐ – ๙
ตัว Chr(48) เป็น Ascii code ของ 0 (เลขศูนย์ อาราบิก) แล้วก็ไล่ไปทีละตัว ส่วน Chr(240) เป็น Ascii code ของ ๐ (เลขศูนย์ ไทย)
ในทางกลับกัน เราก็ใช้โค้ดเดิมนี่แหละ สลับที่ค้นหากับแทนที่กัน เราก็จะได้โค้ดสำหรับเปลี่ยนเลขไทยเป็นเลขอารบิก
ซึ่งเราจะตั้งชื่อว่า thai_to_arabic ก็แล้วกัน
Sub thai_to_arabic()
For i = 0 To 9
With Selection.Find
.Text = Chr(240 + i)
.Replacement.Text = Chr(48 + i)
.Wrap = wdFindContinue
End With
Selection.Find.Execute Replace:=wdReplaceAll
Next
End Sub
เราเอามาวางต่อเนื่องกันได้เลย
คำสั่งนี้มีคำสั่งย่อย 2 คำสั่ง คือ arabictothai กับ thaitoarabic คือบรรทัดที่เขียนว่า Sub arabictothai () กับ Sub thaitoarabic() ตัวนี้จะเป็นการตั้งชื่อมาโคร
คำสั่งไม่มีอะไรมาก แค่ค้นหาเลข 0 – 9 แล้วแทนที่ด้วย ๐ – ๙ หรือในทางกลับกัน ค้นหาเลข ๐ – ๙ แล้วแทนที่ด้วย 0 – 9 ตัว Chr(48) เป็น Ascii code ของ 0 (เลขศูนย์ อาราบิก) แล้วก็ไล่ไปทีละตัว ส่วน Chr(240) เป็น Ascii code ของ ๐ (เลขศูนย์ ไทย)
วิธีใช้งาน
วิธีใช้ก็ง่ายแสนง่าย ไปที่ View > Macros คลิกที่ชื่อมาโครที่ต้องการแล้วกด Run
ลองดูก่อนว่าใช้งานได้ไม่มีปัญหา
Customize Quick Access Toolbar
ถ้าหากว่าใช้งานได้ตรงตามที่ต้องการแล้ว เราจะมาสร้างปุ่มไว้ใช้งานต่อไปในอนาคต โดยจะเอาปุ่มไปไว้ที่ปุ่ม Quick Access Toolbar ที่อยู่ด้านบน
วิธีการก็คือ คลิกปุ่ม Customize Quick Access Toolbar ที่อยู่ด้านบน
เลือก More Commands
ไดอะล็อกบล็อก Customize จะแสดงขึ้นมา
เลือกตรง Choose Command From ให้เป็น macro เป็นการจำกัดการค้นหาให้ง่ายขึ้น ไม่อย่างนั้นจะมีคำสั่งให้เลือกมากเกินไปจะหาไม่เจอ
คลิกเลือก macro ที่ต้องการ ในที่นี้คือ Arcbic_to_Thai กับ Thai_to_Arabic แล้วกด Add ให้ไปอยู่หน้าต่างด้านขวา
และเพื่อความสวยงามจำง่าย เปลี่ยน Icon ชื่อของปุ่ม โดยคลิกเลือก Macro ที่ต้องการแล้วกด Modify เลือก icon และอาจจะเปลี่ยนชื่อก็ได้หากต้องการ
เพียงเท่านี้ก็จะได้มาโครเอาไว้ใช้งาน
เพียงเท่านี้ก็จะได้มาโครเอาไว้ใช้งาน
TIP: ลิบรา ไรท์เตอร์ เรียกใช้จาก Tools > Macros > Organize Macro > Libre Office Basic > My Macro > New
ปรับปรุง VBA รองรับ encoding อีกแบบ
มีคนส่งคำถามมาว่า ได้ลองทำตามที่เขียนด้านบนนี้แล้วใช้ไม่ได้ผล คือ พอเปลี่ยนแล้วแทนที่จะเป็นเลขไทย กลายเป็นอักขระต่างดาวอะไรก็ไม่รู้ ไม่สามารถใช้โค้ดที่ให้ไว้ได้
ความคิดแรกที่โผล่มาในหัวเลยก็คือ มันต้องเป็นเรื่องของ encoding แน่ ๆ เลย
ภาษาไทยในคอมพิวเตอร์มันดันมีหลายมาตรฐาน TIS-620 Window 874 Unicode 8 ก็เลยขอให้ทางผู้ถาม ลองแปลงเลข 0123456789 ให้เป็นเลขไทย แล้วจับภาพหน้าจอมาว่า อักขระแปลก ๆ ไม่ใช่เลขไทยที่ว่านั้นหน้าตาเป็นอย่างไร
เมื่อได้เห็นแล้วก็เข้าใจ ก็เลยอนุมานได้ว่า ปัญหาไม่ได้ยากเย็นอะไร น่าจะเป็นที่รหัสภาษา หรือว่า encoding จริง ๆ
คือ Chr(240) ที่เคยใช้แทนเลข ๐ (ศูนย์ไทย) กลายเป็นอักขระอื่นที่ไม่ใช่ เลข ๐ (ศูนย์ไทย) แก้แค่ตรงนี้ที่เดียวก็น่าจะได้ ไม่ใช่เรื่องยากอะไร
แต่คิดว่าคงต้องอธิบายเพิ่มเติมสักหน่อยว่า ทำไม Code VBA ที่เขียนไปข้างต้น พอไปใช้บางเครื่องแล้วใช้ไม่ได้
ในโค้ด VBA ตามตัวอย่าง ใช้ Chr แทนลำดับตัวเลขในระบบ ASCII คือ ตรงโค้ดที่เขียน Chr(48 + i)
ดูในตาราง ASCII (โปรดดูที่หน้า ASCII Code ประกอบ) ลำดับ 48 คือ 0 (Digit zero)
และเลื่อนลงมาดูตัวที่เราใช้แทนในคือ ลำดับที่ 240 คือ ๐ (THAI DIGIT ZERO)
นั่นคือการกำหนดให้ค้นหาเลข 0 (อารบิก) แล้วแทนที่ด้วย ๐ (ศูนย์ไทย)
แต่ถ้าระบบปฎิบัติการที่เราใช้ ไม่ได้ใช้ ASCII ผลลัพธ์มันก็ต้องต่างไปเป็นธรรมดา ซึ่งจากที่มีคนพบปัญหาก็คือ แทนที่มันจะออกมาเป็นเลข 0 แต่กลายเป็นตัว ð
ซึ่งเมื่อเทียบลำดับ 240 กับตารางนี้ ก็จะเห็นว่ามันตรงกัน
เมื่อรู้ว่าปัญหาเกิดจากอะไร เราก็มาวิธีแก้ ปัญหาคือเมื่อเป็น Unicode แล้วแล้วจะเปลี่ยนเป็นอะไรดีล่ะ? อันนี้ก็ต้องมาทำความเข้าใจกับไวยากรณ์ของมันอีกสักหน่อย
โค้ดอักขระ ที่เราคุ้นเคยกันจะมีอยู่ 3 แบบ คือ
Chr และ Chr$ จะส่งค่าของอักขระที่ใช้โค้ด ASCII (หรือ ANSI)
ChrB และ ChrB$ ส่งข้อมูลไบต์ที่มีอยู่ในสตริงแทนที่จะส่งกลับอักขระซึ่งอาจเป็นหนึ่งหรือสองไบต์ ChrB จะส่งกลับค่าไบต์เดียวเสมอ
Chr$ and ChrB$ จะเป็น String
ChrW จะส่งคืนสตริงที่มีอักขระ Unicode ยกเว้นบนแพลตฟอร์มที่ไม่รองรับ Unicode ซึ่งในกรณีนี้ การทำงานจะเหมือนกับฟังก์ชัน Chr ทุกประการ
Visual Basic สำหรับ Mac ไม่รองรับสตริง Unicode ดังนั้น ChrW(n) จึงไม่สามารถส่งคืนอักขระ Unicode ทั้งหมดสำหรับค่า n ในช่วง 128–65,535 ได้เหมือนกับในวินโดวส์ แต่ ChrW(n) จะพยายาม “คาดเดาที่ดีที่สุด” สำหรับค่า Unicode n ที่มากกว่า 127
ดังนั้น ไม่ควรใช้ ChrW ในสภาพแวดล้อม Macintosh (อันนี้อ้างอิงจาก https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/chr-function)
ดังนั้น สิ่งที่ต้องเปลี่ยนก็คือ Chr ที่จะใช้กับเลขไทย ให้เปลี่ยนมาใช้ ChrW แทน ซึ่งตัวเลขไทยใน Unicode จะเริ่มเลข ๐ ที่ 3664 (แบบ decimal code ดูรายละเอียดที่ https://www.codetable.net/unicodecharacters?page=12) ดังนั้น เราจะเปลี่ยนเล็กน้อยดังนี้
Sub arabic_to_thai()
For i = 0 To 9
With Selection.Find
.Text = Chr(48 + i)
.Replacement.Text = ChrW(3664 + i)
.Wrap = wdFindContinue
End With
Selection.Find.Execute Replace:=wdReplaceAll
Next
End Sub
Sub thai_to_arabic()
For i = 0 To 9
With Selection.Find
.Text = ChrW(3664 + i)
.Replacement.Text = Chr(48 + i)
.Wrap = wdFindContinue
End With
Selection.Find.Execute Replace:=wdReplaceAll
Next
End Sub
ซึ่งเมื่อลองให้ผู้สอบถามเปลี่ยน ก็ใช้งานได้ไม่มีปัญหา และหวังว่าจะช่วยท่านที่ประสบปัญหาอยู่ได้
อ่านเพิ่มเติม