วันจันทร์ที่ 9 เมษายน พ.ศ. 2555

การแยกคำนำหน้าชื่อ ชื่อ และนามสกุล ไว้คนละเซลล์ ด้วย Excel VBA

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

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

ตัวอย่าง

ให้ท่านแยกคำนำหน้าชื่อ ชื่อ และนามสกุล จากข้อมูลข้างล่างนี้ ออกเป็นคนละเซลล์กัน


วิธีการ มีดังนี้
  1. เปิดหน้าต่าง VBA ของ Excel โดยกดปุ่ม Alt + F11
  2. ไปที่เมนู Insert > Module (แทรก > โมดูล)
  3. คลิกที่ Module1 และพิมพ์โค้ดข้างล่างนี้

    Function getTitle(thisFullName As String) As String
    Dim Titles As Variant
    Dim myCount As Integer

    ' สร้างตัวแปร Array ชื่อ Titles เพื่อเก็บคำนำหน้าชื่อ สามารถเพิ่มได้อีกไม่จำกัด
    ' ต้องให้ นางสาว มาก่อน นาง มิฉะนั้นจะตรวจสอบนางสาวไม่ได้

    Titles = Array("นาย", "นางสาว", "นาง", "เด็กชาย", "ด.ช.", "ว่าที่ ร.ต.")
    For myCount = 0 To UBound(Titles)
        getTitle = Left(thisFullName, Len(Titles(myCount)))
          If Titles(myCount) = getTitle Then
            Exit Function
            Else
            getTitle = blank
          End If
    Next myCount
    End Function

    Function getFirstName(thisFullName As String) As String
    Dim thisTitle As String
    Dim firstName As String
    Dim spacePos As Integer
    thisTitle = getTitle(thisFullName)
    spacePos = InStr(thisFullName, " ")
    If spacePos = 0 Then 'ถ้าไม่มีช่องว่าง
        firstName = Trim(Mid(thisFullName, Len(thisTitle) + 1, Len(thisFullName) - Len(thisTitle)))
    Else
        firstName = Trim(Mid(thisFullName, Len(thisTitle) + 1, InStr(thisFullName, " ") - Len(thisTitle)))
    End If
    getFirstName = firstName
    End Function

    Function getLastName(thisFullName As String) As String
    Dim lastName As String
    Dim spacePos As Integer
    spacePos = nameAndTitle = InStr(thisFullName, " ")
    If spacePos = 0 Then 'ถ้าไม่มีช่องว่าง แสดงว่าไม่มีนามสกุล
        lastName = Trim(Mid(thisFullName, InStr(thisFullName, " "), Len(thisFullName)))
    Else
        lastName = blank
    End If
    getLastName = lastName
    End Function
  4. บันทึกไว้ และกลับไปที่ Sheet ข้อมูล
จากโค้ดข้างบน มีการสร้างฟังก์ชัน 3 ฟังก์ชัน คือ
  • getTitle() สำหรับแยกคำนำหน้าชื่อ การใช้งานถ้าจะให้สมบูรณ์ ต้องเพิ่มคำนำหน้าให้ครบ เช่น "เด็กหญิง", "ด.ญ.", "ม.ล." และอื่น ๆ ที่มีในข้อมูล เป็นต้น โดยทุกคำที่เพิ่ม ต้องอยู่ในเครื่องหมายคำพูดด้วย
  • getFirstName() สำหรับแยกชื่อตัว 
  • getLastName() สำหรับแยกนามสกุล
การเรียกใช้งาน
  1. กลับไปที่ Sheet ข้อมูล
  2. ที่เซลล์ D2 พิมพ์ =getTitle(B2) แล้วกด Ctrl + Enter เพื่อให้ส่วนที่เลือกอยู่ตำแหน่งเดิม

  3. ลาก Fill handle ลงมาให้ถึงเซลล์ D4

  4. ที่เซลล์ E2 พิมพ์ =getFirstName(B2) แล้วกด Ctrl + Enter


  5. ดับเบิ้ลคลิกที่ Fill handle จะได้ชื่อครบทุกคน
  6. ที่เซลล์ F2 พิมพ์ =getLastName(B2) แล้วกด Ctrl + Enter


  7. ดับเบิ้ลคลิกที่ Fill handle จะได้นามสกุลครบทุกคน

การบันทึกไฟล์ Excle 2010 ต้องบันทึกเป็นไฟล์นามสกุล .xlsm เนื่องจากมีโค้ดอยู่ด้วย

เป็นอันเสร็จ ถ้ามีข้อมูลน้อย ๆ ก็ไม่มีปัญหา ถ้ามีข้อมูลเยอะ ๆ ต้องทำตามข้างบนนี้ จะสะดวกกว่ามาก

ไม่มีความคิดเห็น:

แสดงความคิดเห็น