เปลี่ยนเลขอารบิกเป็นเลขไทย แบบง่าย ๆ จะทำอย่างไร ถ้าไม่ใช้ฟอนต์ TH Sarabun IT๙ ด้วยเหตุผลที่เขียนไปแล้ว
หมายเหตุ ในนี้จะนำเสนอ 3 วิธี
- วิธีแรก เป็นการใช้ Find and Replace ธรรมดา
- วิธีที่ 2 จะใช้ VBA เป็นตัวช่วย อธิบายให้ทีละขั้นตอน เชื่อว่าไม่ยาก ค่อย ๆ ทำไปทีละขั้น
- วิธีที่ 3 จริง ๆ ก็วิธีที่ 2 นั่นแหละ แต่ว่าเปลี่ยนโค้ดเล็กน้อย เพราะบางท่่านพบปัญหาจาก VBA ในข้อ 2
หลังจากเขียนถึงเหตุผลที่ไม่อยากให้ใช้ TH Sarabun IT๙ กันไปแล้ว ทีนี้มาถึงการหาทางออกสำหรับผู้ที่ต้องการเปลี่ยนเลขอารบิกให้เป็นเลขไทยแบบรวดเดียวกันบ้าง ในกรณีที่ได้เอกสาร (หรือ copy ข้อความมาจากที่อื่น) ที่เป็นเลขอารบิก
เปลี่ยนเลขอารบิกเป็นเลขไทยแบบบ้าน ๆ
วิธีแรก เป็นวิธีแก้ไขแบบบ้าน ๆ ไม่ต้องอาศัยทริกอะไรเลย ก็คือ Find and Replace คือ Find ๑ Replace ด้วย 1 ทำแบบนี้ไปจนครบ 10 เลข กด Ctrl + H เลยจ้ะ ง่าย ๆ
แต่ถ้าต้องทำตั้งแต่ ๐ – ๙ บางคนก็ว่ายุ่งยาก โอเค งั้นเรามาเขียน VBA เพื่อ “ค้นหาและแทนที่” โดยคลิกเพียงแค่คลิกเดียว เราจะสร้าง code ให้ find แล้ว 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 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

แต่อย่างนั้นอาจจะไม่สะดวกเพราะคลิกหลายที ลองมาทำคีย์ลัดใน tools bar เรียกใช้มาโครให้ง่ายขึ้น
คลิกเมนู Customize Quick Access Toolbar > More Commands
ไดอะล็อกบล็อก Customize จะแสดงขึ้นมา เลือกตรง Choos Command From ให้เป็น macro คลิกเลือก macro ที่ต้องการแล้วกด Add ให้ไปอยู่หน้าต่างด้านขวา
เปลี่ยน Icon ชื่อของปุ่ม โดยคลิกเลือก Macro ที่ต้องการแล้วกด Modify เลือกicon และอาจจะเปลี่ยนชื่อก็ได้หากต้องการ

เพียงเท่านี้ก็จะได้มาโครเอาไว้ใช้งาน
TIP: ลิบรา ไรท์เตอร์ เรียกใช้จาก Tools > Macros > Organize Macro > Libre Office Basic > My Macro > New
หากโค้ดข้างต้นใช้งานไม่ได้
มีคนส่งคำถามมาว่า ได้ลองทำตามที่เขียนในเรื่อง เปลี่ยนเลขอารบิกเป็นไทยใน Word แล้ว ใช้ไม่ได้ผล คือ พอเปลี่ยนแล้วแทนที่จะเป็นเลขไทย กลายเป็นอักขระต่างดาวอะไรก็ไม่รู้ ไม่สามารถใช้โค้ดที่ให้ไว้ได้
ความคิดแรกที่โผล่มาในหัวเลยก็คือ มันต้องเป็นเรื่องของ encoding แน่ ๆ เลย อย่างที่เคยเขียนไปแล้วว่าภาษาไทยในคอมพิวเตอร์มันดันมีหลายมาตรฐาน TIS-620 Window 874 Unicode 8 ก็เลยขอให้ทางผู้ถาม ลองแปลงเลข 0123456789 ให้เป็นเลขไทย แล้วจับภาพหน้าจอมาว่า อักขระแปลก ๆ ไม่ใช่เลขไทยที่ว่านั้นหน้าตาเป็นอย่างไร

เมื่อได้เห็นแล้วก็เข้าใจ ก็เลยอนุมานได้ว่า ปัญหาไม่ได้ยากเย็นอะไร คือ Chr(240)ที่เคยใช้แทนเลข ๐ (ศูนย์ไทย) จะต้องเปลี่ยนใหม่ แก้แค่ตรงนี้ที่เดียวก็น่าจะได้ ไม่ใช่เรื่องยากอะไร
แต่คิดว่าคงต้องอธิบายเพิ่มเติมสักหน่อยว่า ทำไม Code VBA ที่เขียนไปข้างต้น พอไปใช้บางเครื่องแล้วใช้ไม่ได้
คือในโค้ด VBA ที่ใช้นั้น ใช้ Chr แทนลำดับตัวเลข ในระบบ ASCII คือ ตรงโค้ดที่เขียน Chr(48 + i) (ซึ่งก่อนหน้าได้กำกับว่า For i = 0 To 9) นั่นคือเรากำหนด encodingของตัวอักขระที่ 48 เป็น 0 ซึ่งก็คือ ลำดับ 48 ใน Decimal code (โปรดดูที่หน้า ASCII Code ประกอบ) และที่เราให้แทนที่ด้วย Chr(240 + i) ก็คือให้แทนที่ด้วย ๐ (เลขศูนย์ไทย)
ดังนั้น แทนที่มันจะออกมาเป็นเลข 0 แต่กลายเป็นตัว ð อันนี้ก็เข้าใจได้ไม่ยากว่าตัว 240 มันไม่ใช่ เลข ๐ ซะแล้ว ตัว encoding ที่เครื่องคอมพิวเตอร์นั้นทำงานอยู่ในอีกแบบหนึ่ง ซึ่งเมื่อเทียบกับตารางนี้ ก็จะเห็น่ามันตรงกัน
อันนี้คือเหตุผลว่าทำไม โค้ดที่เคยใช้มันถึงไม่ทำงาน หรือ ทำงานแปลก ๆ แทนที่จะแปลงตัวเลขเป็นไทยกลายเป็นตัวต่างดาวไปซะงั้น
เมื่อรู้ว่าปัญหาเกิดจากอะไร เราก็มาวิธีแก้ ปัญหาคือเมื่อเป็น Unicode แล้วแล้วจะเปลี่ยนเป็นอะไรดีล่ะ? อันนี้ก็ต้องมาทำความเข้าใจกับไวยากรณ์ของมันอีกสักหน่อย
โค้ดอักขระ ที่เราคุ้นเคยกันจะมีอยู่ 3 แบบ คือ
Chr และ Chr$ จะส่งค่าของอักขระที่ใช้โค้ด ASCII (หรือ ANSI)
ChrB และ ChrB$ ส่งข้อมูลไบต์ที่มีอยู่ในสตริงแทนที่จะส่งกลับอักขระซึ่งอาจเป็นหนึ่งหรือสองไบต์ ChrB จะส่งกลับค่าไบต์เดียวเสมอ
Chr$ and ChrB$ จะเป็น String
ChrW จะส่งกลับสตริงที่มีอักขระ Unicode ยกเว้นบนแพลตฟอร์มที่ไม่ได้รับการสนับสนุน Unicode ใน Mac ไม่สนับสนุนการใช้ ChrW(n) จะไม่สามารถส่งกลับอักขระ Unicode ทั้งหมดสำหรับค่า n ในช่วง 128 – 65535 สำหรับค่า Unicode n ที่มากกว่า 127 ไม่ควรใช้ ChrW ใน Mac
ดังนั้น สิ่งที่ต้องเปลี่ยนก็คือ 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
ซึ่งเมื่อลองให้ผู้สอบถามเปลี่ยน ก็ใช้งานได้ไม่มีปัญหา และหวังว่าจะช่วยท่านที่ประสบปัญหาอยู่ได้