เปลี่ยนเลขอารบิกเป็นเลขไทย (ใน Microsoft Word)

เปลี่ยนเลขอารบิกเป็นเลขไทย
หัวข้อ:

เปลี่ยนเลขอารบิกเป็นเลขไทย แบบง่าย ๆ จะทำอย่างไร ถ้าไม่ใช้ฟอนต์ 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

VBA เปลี่ยนเลขอารบิกเป็นเลขไทย

ใส่คำสั่งนี้เข้าไป

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 และอาจจะเปลี่ยนชื่อก็ได้หากต้องการ

Macro

เพียงเท่านี้ก็จะได้มาโครเอาไว้ใช้งาน

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

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

หมายเหตุ สำหรับวิธีเปลี่ยนเลขใน Excel โปรดอ่านที่นี่

ArcGIS cmd Coordinate System data DataManagement Datum directory encoding folder Font GDB GIS GISBasics IDE Indian 1975 install interpreter Microsoft 365 organised Python Thai VBA WGS 1984

Other Posts