Skip to content

Instantly share code, notes, and snippets.

@touchiep
Last active June 27, 2024 05:54
Show Gist options
  • Save touchiep/94e31d81c75c9e34ca5d6629c3dea513 to your computer and use it in GitHub Desktop.
Save touchiep/94e31d81c75c9e34ca5d6629c3dea513 to your computer and use it in GitHub Desktop.
[VBA][Excel] ThaiTime แปลงเวลาเป็นคำพูดบอกเวลาภาษาไทย
Public Function ThaiTime(InTime, Optional TimeType As Integer = 1, Optional CType As Integer = 0)
'Version 4.0
'แปลงเลขเวลาเป็นคำอ่าน
'TimeType รองรับได้ 6 แบบ
'1 ระบบ 24 ชั่วโมงแบบราชการ
'2 ระบบ 6 ชั่วโมงแบบ 2490
'3 ระบบ 6 ชั่วโมงแบบสมียใหม่ 2535
'4 ระบบ 24 ชั่วโมงแบบทหาร
'5 ระบบ 8 ยาม แบบอยุธยา 2076
'6 ระบบ 8 ยาม แบบรัตนโกสินทร์ 2443
'CType รองรับได้ 3 แบบ
'0 = อักษรไทย
'1 = อักษรโรมัน แบบราชบัณทิตยสถาน
'2 = อักษรโรมัน แบบแสดงตัวเน้นเสียง (Accent Tone Mark)
'Dependency
'ThaiNSound, ThNSound, ThaiNString, ThNString, U2W
'Version History
'1.0 รองรับการอ่านเวลาแบบ 1, 2, 3
'2.0 รองรับการอ่านเวลาแบบ 4
'3.0 รองรับการอ่านเวลาแบบ 5, 6
'4.0 รองรับการแสดงผลแบบอักษรโรมัน ทั้งแบบราชบัณฑิตยสถานและแบบเน้นเสียง
Application.Volatile
Dim Th6h(23), Thm6h(23), tInput, ThH, ThM, ThS
Dim ThYm, ThNl, ThBt, ThNt, ThPn, ThPr, DSec, ThNv, ThDN
Select Case CType
Case 0
'Classic
Th6h(0) = "เที่ยงคืน"
Th6h(1) = "ตีหนึ่ง"
Th6h(2) = "ตีสอง"
Th6h(3) = "ดีสาม"
Th6h(4) = "ตีสี่"
Th6h(5) = "ตีห้า"
Th6h(6) = "ย่ำรุ่ง"
Th6h(7) = "โมงเช้า"
Th6h(8) = "สองโมง"
Th6h(9) = "สามโมง"
Th6h(10) = "สี่โมง"
Th6h(11) = "ห้าโมง"
Th6h(12) = "เที่ยงวัน"
Th6h(13) = "บ่ายโมง"
Th6h(14) = "บ่ายสองโมง"
Th6h(15) = "บ่ายสามโมง"
Th6h(16) = "บ่ายสี่โมง"
Th6h(17) = "บ่ายห้าโมง"
Th6h(18) = "ย่ำค่ำ"
Th6h(19) = "ทุ่มหนึ่ง"
Th6h(20) = "สองทุ่ม"
Th6h(21) = "สามทุ่ม"
Th6h(22) = "สี่ทุ่ม"
Th6h(23) = "ห้าทุ่ม"
'Modern
Thm6h(0) = "เที่ยงคืน"
Thm6h(1) = "ตีหนึ่ง"
Thm6h(2) = "ตีสอง"
Thm6h(3) = "ตีสาม"
Thm6h(4) = "ตีสี่"
Thm6h(5) = "ตีห้า"
Thm6h(6) = "หกโมงเช้า"
Thm6h(7) = "เจ็ดโมง"
Thm6h(8) = "แปดโมง"
Thm6h(9) = "เก้าโมง"
Thm6h(10) = "สิบโมง"
Thm6h(11) = "สิบเอ็ดโมง"
Thm6h(12) = "เที่ยงวัน"
Thm6h(13) = "บ่ายโมง"
Thm6h(14) = "บ่ายสอง"
Thm6h(15) = "บ่ายสาม"
Thm6h(16) = "สี่โมงเย็น"
Thm6h(17) = "ห้าโมงเย็น"
Thm6h(18) = "หกโมงเย็น"
Thm6h(19) = "หนึ่งทุ่ม"
Thm6h(20) = "สองทุ่ม"
Thm6h(21) = "สามทุ่ม"
Thm6h(22) = "สี่ทุ่ม"
Thm6h(23) = "ห้าทุ่ม"
Case 1
'Classic
Th6h(0) = "thiang khuen "
Th6h(1) = "ti nueng "
Th6h(2) = "ti song "
Th6h(3) = "ti sam "
Th6h(4) = "ti si "
Th6h(5) = "ti ha "
Th6h(6) = "yam rung "
Th6h(7) = "mong chao "
Th6h(8) = "song mong "
Th6h(9) = "sam mong "
Th6h(10) = "si mong "
Th6h(11) = "ha mong "
Th6h(12) = "thiang wan "
Th6h(13) = "bai mong "
Th6h(14) = "bai song mong "
Th6h(15) = "bai sam mong "
Th6h(16) = "bai si mong "
Th6h(17) = "bai ha mong "
Th6h(18) = "yam kham "
Th6h(19) = "thum nueng "
Th6h(20) = "song thum "
Th6h(21) = "sam thum "
Th6h(22) = "si thum "
Th6h(23) = "ha thum "
'Modern
Thm6h(0) = "thiang khuen "
Thm6h(1) = "ti nueng "
Thm6h(2) = "ti song "
Thm6h(3) = "ti sam "
Thm6h(4) = "ti si "
Thm6h(5) = "ti ha "
Thm6h(6) = "hok mong chao "
Thm6h(7) = "chet mong "
Thm6h(8) = "paet mong "
Thm6h(9) = "kao mong "
Thm6h(10) = "sip mong "
Thm6h(11) = "sip et mong "
Thm6h(12) = "thiang wan "
Thm6h(13) = "bai mong "
Thm6h(14) = "bai song "
Thm6h(15) = "bai sam "
Thm6h(16) = "si mong yen "
Thm6h(17) = "ha mong yen "
Thm6h(18) = "hok mong yen "
Thm6h(19) = "nueng thum "
Thm6h(20) = "song thum "
Thm6h(21) = "sam thum "
Thm6h(22) = "si thum "
Thm6h(23) = "ha thum "
Case 2
'Classic
Th6h(0) = U2W("116 238 105 97 110 103 32 107 101 117 110 32")
Th6h(1) = U2W("100 116 101 101 32 110 232 117 110 103 32")
Th6h(2) = U2W("100 116 101 101 32 115 335 110 103 32")
Th6h(3) = U2W("100 116 101 101 32 115 259 97 109 32")
Th6h(4) = U2W("100 116 101 101 32 115 232 101 32")
Th6h(5) = U2W("100 116 101 101 32 104 226 97 32")
Th6h(6) = U2W("121 226 109 32 114 251 110 103 32")
Th6h(7) = U2W("109 111 104 110 103 32 99 104 225 111 32")
Th6h(8) = U2W("115 335 110 103 32 109 111 104 110 103 32")
Th6h(9) = U2W("115 259 97 109 32 109 111 104 110 103 32")
Th6h(10) = U2W("115 232 101 32 109 111 104 110 103 32")
Th6h(11) = U2W("104 226 97 32 109 111 104 110 103 32")
Th6h(12) = U2W("116 238 105 97 110 103 32 119 97 110 32")
Th6h(13) = U2W("98 224 97 105 32 109 111 104 110 103 32")
Th6h(14) = U2W("98 224 97 105 32 115 335 110 103 32 109 111 104 110 103 32")
Th6h(15) = U2W("98 224 97 105 32 115 259 97 109 32 109 111 104 110 103 32")
Th6h(16) = U2W("98 224 97 105 32 115 232 101 32 109 111 104 110 103 32")
Th6h(17) = U2W("98 224 97 105 32 104 226 97 32 109 111 104 110 103 32")
Th6h(18) = U2W("121 226 109 32 107 226 109 32")
Th6h(19) = U2W("116 251 109 32 110 232 117 110 103 32")
Th6h(20) = U2W("115 335 110 103 32 116 251 109 32")
Th6h(21) = U2W("115 259 97 109 32 116 251 109 32")
Th6h(22) = U2W("115 232 101 32 116 251 109 32")
Th6h(23) = U2W("104 226 97 32 116 251 109 32")
'Modern
Thm6h(0) = U2W("116 238 105 97 110 103 32 107 101 117 110 32")
Thm6h(1) = U2W("100 116 101 101 32 110 232 117 110 103 32")
Thm6h(2) = U2W("100 116 101 101 32 115 335 110 103 32")
Thm6h(3) = U2W("100 116 101 101 32 115 259 97 109 32")
Thm6h(4) = U2W("100 116 101 101 32 115 232 101 32")
Thm6h(5) = U2W("100 116 101 101 32 104 226 97 32")
Thm6h(6) = U2W("104 242 107 32 109 111 104 110 103 32 99 104 225 111 32")
Thm6h(7) = U2W("106 232 116 32 109 111 104 110 103 32")
Thm6h(8) = U2W("98 112 224 101 116 32 109 111 104 110 103 32")
Thm6h(9) = U2W("103 226 111 32 109 111 104 110 103 32")
Thm6h(10) = U2W("115 236 112 32 109 111 104 110 103 32")
Thm6h(11) = U2W("115 236 112 32 232 116 32 109 111 104 110 103 32")
Thm6h(12) = U2W("116 238 105 97 110 103 32 119 97 110 32")
Thm6h(13) = U2W("98 224 97 105 32 109 111 104 110 103 32")
Thm6h(14) = U2W("98 224 97 105 32 115 335 110 103 32")
Thm6h(15) = U2W("98 224 97 105 32 115 259 97 109 32")
Thm6h(16) = U2W("115 232 101 32 109 111 104 110 103 32 121 101 110 32")
Thm6h(17) = U2W("104 226 97 32 109 111 104 110 103 32 121 101 110 32")
Thm6h(18) = U2W("104 242 107 32 109 111 104 110 103 32 121 101 110 32")
Thm6h(19) = U2W("110 232 117 110 103 32 116 251 109 32")
Thm6h(20) = U2W("115 335 110 103 32 116 251 109 32")
Thm6h(21) = U2W("115 259 97 109 32 116 251 109 32")
Thm6h(22) = U2W("115 232 101 32 116 251 109 32")
Thm6h(23) = U2W("104 226 97 32 116 251 109 32")
End Select
Select Case VarType(InTime)
Case vbDate
'format as time
tInput = TimeValue(InTime)
ThH = hour(tInput)
ThM = Minute(tInput)
ThS = Second(tInput)
Case vbDecimal
'format as decimal
tInput = Int(InTime)
ThH = tInput
ThM = (InTime - tInput) * 100
ThS = 0
Case vbString
'format as text
If InStr(1, InTime, ":", vbTextCompare) >= 1 Then
tInput = TimeValue(InTime)
ThH = hour(tInput)
ThM = Minute(tInput)
ThS = Second(tInput)
ElseIf InStr(1, InTime, ".", vbTextCompare) >= 1 Then
tInput = TimeValue(Replace(InTime, ".", ":"))
ThH = hour(tInput)
ThM = Minute(tInput)
ThS = Second(tInput)
End If
Case vbDouble
'format as decimal
tInput = InTime
ThH = hour(tInput)
ThM = Minute(tInput)
ThS = Second(tInput)
Case Else
ThaiTime = "#ERR"
End Select
Select Case TimeType
Case 1 '24 ชม. ราชการ
Select Case CType
Case 0
ThaiTime = ThaiNSound(ThH) & "นาฬิกา"
If ThM > 0 Then ThaiTime = ThaiTime & " " & ThaiNSound(ThM) & "นาที"
If ThS > 0 Then ThaiTime = ThaiTime & " " & ThaiNSound(ThS) & "วินาที"
Case 1
ThaiTime = ThNSound(ThH, , , , False) & "nalika"
If ThM > 0 Then ThaiTime = ThaiTime & " " & ThNSound(ThM, , , , False) & "nathi"
If ThS > 0 Then ThaiTime = ThaiTime & " " & ThNSound(ThS, , , , False) & "winathi"
ThaiTime = LCase(ThaiTime)
Case 2
ThaiTime = ThNSound(ThH) & U2W("110 97 97 45 108 237 45 103 97 97")
If ThM > 0 Then ThaiTime = ThaiTime & " " & ThNSound(ThM) & U2W("110 97 97 45 116 101 101")
If ThS > 0 Then ThaiTime = ThaiTime & " " & ThNSound(ThS) & U2W("119 237 45 110 97 97 45 116 101 101")
ThaiTime = LCase(ThaiTime)
End Select
Case 2 '6 ชม. 2490
Select Case CType
Case 0
Select Case ThM
Case Is = 0
ThaiTime = Th6h(ThH)
Case Is = 30
ThaiTime = Th6h(ThH) & "ครึ่ง"
If InStr(1, ThaiTime, "ย่ำรุ่ง", vbTextCompare) > 0 Then ThaiTime = Replace(ThaiTime, "ย่ำรุ่ง", "ตีหก")
If InStr(1, ThaiTime, "ย่ำค่ำ", vbTextCompare) > 0 Then ThaiTime = Replace(ThaiTime, "ย่ำค่ำ", "หกโมง")
Case Is <= 45
ThaiTime = Th6h(ThH) & " " & ThaiNSound(ThM) & "นาที"
Case Is > 45
ThaiTime = "อีก" & ThaiNSound(60 - ThM) & "นาที " & Th6h(ThH + 1)
End Select
Case 1
Select Case ThM
Case Is = 0
ThaiTime = Th6h(ThH)
Case Is = 30
ThaiTime = Th6h(ThH) & " khrueng"
If InStr(1, ThaiTime, "yam rung", vbTextCompare) > 0 Then ThaiTime = Replace(ThaiTime, "yam rung", "ti hok")
If InStr(1, ThaiTime, "yam kham", vbTextCompare) > 0 Then ThaiTime = Replace(ThaiTime, "yam kham", "hok mong")
Case Is <= 45
ThaiTime = Th6h(ThH) & ThNSound(ThM, , , , False) & "nathi"
Case Is > 45
ThaiTime = "ik " & ThNSound(60 - ThM, , , , False) & "nathi " & Th6h(ThH + 1)
End Select
ThaiTime = LCase(ThaiTime)
Case 2
Select Case ThM
Case Is = 0
ThaiTime = Th6h(ThH)
Case Is = 30
ThaiTime = Th6h(ThH) & U2W("32 107 114 234 117 110 103")
If InStr(1, ThaiTime, U2W("121 226 109 32 114 251 110 103"), vbTextCompare) > 0 Then ThaiTime = Replace(ThaiTime, U2W("121 226 109 32 114 251 110 103"), U2W("100 116 101 101 32 104 242 107"))
If InStr(1, ThaiTime, U2W("121 226 109 32 107 226 109"), vbTextCompare) > 0 Then ThaiTime = Replace(ThaiTime, U2W("121 226 109 32 107 226 109"), U2W("104 242 107 32 109 111 104 110 103"))
Case Is <= 45
ThaiTime = Th6h(ThH) & ThNSound(ThM) & "naa-tee"
Case Is > 45
ThaiTime = U2W("232 101 107 32") & ThNSound(60 - ThM) & "naa-tee " & Th6h(ThH + 1)
End Select
ThaiTime = LCase(ThaiTime)
End Select
Case 3 '6 ชม. สมัยใหม่
Select Case CType
Case 0
Select Case ThM
Case Is = 0
ThaiTime = Thm6h(ThH)
Case Is = 30
ThaiTime = Thm6h(ThH) & "ครึ่ง"
If InStr(1, ThaiTime, "เช้า", vbTextCompare) > 0 Then ThaiTime = Replace(ThaiTime, "เช้า", "")
If InStr(1, ThaiTime, "เย็น", vbTextCompare) > 0 Then ThaiTime = Replace(ThaiTime, "เย็น", "")
Case Is <= 45
ThaiTime = Thm6h(ThH) & " " & ThaiNSound(ThM) & "นาที"
Case Is > 45
ThaiTime = "อีก" & ThaiNSound(60 - ThM) & "นาที " & Thm6h(ThH + 1)
End Select
Case 1
Select Case ThM
Case Is = 0
ThaiTime = Thm6h(ThH)
Case Is = 30
ThaiTime = Thm6h(ThH) & " khrueng"
If InStr(1, ThaiTime, "chao", vbTextCompare) > 0 Then ThaiTime = Replace(ThaiTime, "chao", "")
If InStr(1, ThaiTime, "yen", vbTextCompare) > 0 Then ThaiTime = Replace(ThaiTime, "yen", "")
Case Is <= 45
ThaiTime = Thm6h(ThH) & ThNSound(ThM, , , , False) & "nathi"
Case Is > 45
ThaiTime = "ik " & ThNSound(60 - ThM, , , , False) & "nathi " & Thm6h(ThH + 1)
End Select
ThaiTime = LCase(ThaiTime)
Case 2
Select Case ThM
Case Is = 0
ThaiTime = Thm6h(ThH)
Case Is = 30
ThaiTime = Thm6h(ThH) & U2W("32 107 114 234 117 110 103")
If InStr(1, ThaiTime, U2W("99 104 225 111"), vbTextCompare) > 0 Then ThaiTime = Replace(ThaiTime, U2W("99 104 225 111"), "")
If InStr(1, ThaiTime, "yen", vbTextCompare) > 0 Then ThaiTime = Replace(ThaiTime, "yen", "")
Case Is <= 45
ThaiTime = Thm6h(ThH) & ThNSound(ThM) & "naa-tee"
Case Is > 45
ThaiTime = U2W("232 101 107 32") & ThNSound(60 - ThM) & "naa-tee " & Thm6h(ThH + 1)
End Select
ThaiTime = LCase(ThaiTime)
End Select
Case 4 '24 ชม. แบบทหาร
Select Case CType
Case 0
If ThH < 10 And ThM < 10 Then
ThaiTime = "ศูนย์" & ThaiNSound(ThH, True) & "ศูนย์" & ThaiNSound(ThM, True)
ElseIf ThH < 10 And ThM >= 10 Then
ThaiTime = "ศูนย์" & ThaiNSound(ThH, True) & ThaiNString(ThM, "1")
ElseIf ThH >= 10 And ThM < 10 Then
ThaiTime = ThaiNSound(ThH, True) & "ศูนย์" & ThaiNString(ThM)
Else
ThaiTime = ThaiNSound(ThH, True) & ThaiNString(ThM, "1")
End If
Case 1
If ThH < 10 And ThM < 10 Then
ThaiTime = "sun " & ThNSound(ThH, True, , , False) & "sun " & ThNSound(ThM, True, , , False)
ElseIf ThH < 10 And ThM >= 10 Then
ThaiTime = "sun " & ThNSound(ThH, True, , , False) & ThNString(ThM, , , False)
ElseIf ThH >= 10 And ThM < 10 Then
ThaiTime = ThNSound(ThH, True, , , False) & "sun " & ThNString(ThM, , , False)
Else
ThaiTime = ThNSound(ThH, True, , , False) & ThNString(ThM, , , False)
End If
ThaiTime = LCase(ThaiTime)
Case 2
If ThH < 10 And ThM < 10 Then
ThaiTime = U2W("115 335 111 110 32") & ThNSound(ThH, True) & U2W("115 335 111 110 32") & ThNSound(ThM, True)
ElseIf ThH < 10 And ThM >= 10 Then
ThaiTime = U2W("115 335 111 110 32") & ThNSound(ThH, True) & ThNString(ThM)
ElseIf ThH >= 10 And ThM < 10 Then
ThaiTime = ThNSound(ThH, True) & U2W("115 335 111 110 32") & ThNString(ThM)
Else
ThaiTime = ThNSound(ThH, True) & ThNString(ThM)
End If
ThaiTime = LCase(ThaiTime)
End Select
Case 5 '12 ชม. แบบอยุธยา
'Convert to second in a day
DSec = (ThH * 3600) + (ThM * 60) + ThS
'Convert to Yaam
If DSec < 21600 Then
DSec = DSec + 21600
Else
If DSec < (43200 + 21600) Then
DSec = DSec - 21600
Else
DSec = DSec - (43200 + 21600)
End If
End If
ThYm = Int(DSec / 10800)
ThNl = Int((((DSec / 10800) - ThYm) * 10800) / 3600)
ThBt = Int(((((((DSec / 10800) - ThYm) * 10800) / 3600) - ThNl) * 3600) / 360)
ThNt = Int((((((((((DSec / 10800) - ThYm) * 10800) / 3600) - ThNl) * 3600) / 360) - ThBt) * 360) / 90)
ThPn = Int(((((((((((((DSec / 10800) - ThYm) * 10800) / 3600) - ThNl) * 3600) / 360) - ThBt) * 360) / 90) - ThNt) * 90) / 6)
ThPr = Int(((((((((((((((DSec / 10800) - ThYm) * 10800) / 3600) - ThNl) * 3600) / 360) - ThBt) * 360) / 90) - ThNt) * 90) / 6) - ThPn) * 6)
ThNv = Int(DSec / 3600)
Select Case CType
Case 0
Select Case ThH
Case Is = 0
ThaiTime = "สองยาม"
Case Is = 1, 2, 4, 5, 19, 20, 22, 23
ThaiTime = ThaiNSound(ThNv) & "ทุ่ม"
Case Is = 3
ThaiTime = "สามยาม"
Case Is = 6
ThaiTime = "ย่ำรุ่ง"
Case Is = 7, 8, 9, 10, 11
ThaiTime = ThaiNSound(ThNv) & "นาฬิกา"
Case Is = 12
ThaiTime = "ย่ำเที่ยง"
Case Is = 13, 14, 15, 16, 17
ThaiTime = "ชายแล้ว" & ThaiNSound(ThNv - 6) & "นาฬิกา"
Case Is = 18
ThaiTime = "ย่ำค่ำ"
Case Is = 21
ThaiTime = "ยามหนึ่ง"
End Select
If ThBt > 0 Then ThaiTime = ThaiTime & " " & ThaiNSound(ThBt) & "บาท"
If ThNt > 0 Then ThaiTime = ThaiTime & " " & ThaiNSound(ThNt) & "นาฑี"
If ThPn > 0 Then ThaiTime = ThaiTime & " " & ThaiNSound(ThPn) & "เพ็ชรนาฑี"
If ThPr > 0 Then ThaiTime = ThaiTime & " " & ThaiNSound(ThPr) & "ปราณ"
Case 1
Select Case ThH
Case Is = 0
ThaiTime = "song yam"
Case Is = 1, 2, 4, 5, 19, 20, 22, 23
ThaiTime = ThNSound(ThNv, , , , False) & "thum"
Case Is = 3
ThaiTime = "sam yam"
Case Is = 6
ThaiTime = "yam rung"
Case Is = 7, 8, 9, 10, 11
ThaiTime = ThNSound(ThNv, , , , False) & "nalika"
Case Is = 12
ThaiTime = "yam thiang"
Case Is = 13, 14, 15, 16, 17
ThaiTime = "chai laeo " & ThNSound(ThNv - 6, , , , False) & "nalika"
Case Is = 18
ThaiTime = "yam kham"
Case Is = 21
ThaiTime = "yam nueng"
End Select
If ThBt > 0 Then ThaiTime = ThaiTime & " " & ThNSound(ThBt, , , , False) & "bat"
If ThNt > 0 Then ThaiTime = ThaiTime & " " & ThNSound(ThNt, , , , False) & "na thi"
If ThPn > 0 Then ThaiTime = ThaiTime & " " & ThNSound(ThPn, , , , False) & "phet na thi"
If ThPr > 0 Then ThaiTime = ThaiTime & " " & ThNSound(ThPr, , , , False) & "pran"
ThaiTime = LCase(ThaiTime)
Case 2
Select Case ThH
Case Is = 0
ThaiTime = U2W("115 335 110 103 32 121 97 97 109")
Case Is = 1, 2, 4, 5, 19, 20, 22, 23
ThaiTime = ThNSound(ThNv) & U2W("116 251 109")
Case Is = 3
ThaiTime = U2W("115 259 97 109 32 121 97 97 109")
Case Is = 6
ThaiTime = U2W("121 226 109 32 114 251 110 103")
Case Is = 7, 8, 9, 10, 11
ThaiTime = ThNSound(ThNv) & U2W("110 97 97 45 108 237 45 103 97 97")
Case Is = 12
ThaiTime = U2W("121 226 109 32 116 238 105 97 110 103")
Case Is = 13, 14, 15, 16, 17
ThaiTime = U2W("99 104 97 97 105 32 108 225 101 119 32") & ThNSound(ThNv - 6) & U2W("110 97 97 45 108 237 45 103 97 97")
Case Is = 18
ThaiTime = U2W("121 226 109 32 107 226 109")
Case Is = 21
ThaiTime = U2W("121 97 97 109 32 110 232 117 110 103")
End Select
If ThBt > 0 Then ThaiTime = ThaiTime & " " & ThNSound(ThBt) & U2W("98 224 97 116")
If ThNt > 0 Then ThaiTime = ThaiTime & " " & ThNSound(ThNt) & U2W("110 97 97 45 116 101 101")
If ThPn > 0 Then ThaiTime = ThaiTime & " " & ThNSound(ThPn) & U2W("112 233 116 32 110 97 97 45 116 101 101")
If ThPr > 0 Then ThaiTime = ThaiTime & " " & ThNSound(ThPr) & U2W("98 112 114 97 97 110")
ThaiTime = LCase(ThaiTime)
End Select
Case 6 '12 ชม.แบบรัตนโกสินทร์ พ.ศ. 2443
'Convert to second in a day
DSec = (ThH * 3600) + (ThM * 60) + ThS
'Convert to Yaam
If DSec < 21600 Then
DSec = DSec + 21600
Else
If DSec < (43200 + 21600) Then
DSec = DSec - 21600
Else
DSec = DSec - (43200 + 21600)
End If
End If
ThNv = Int(DSec / 3600)
Select Case CType
Case 0
Select Case ThH
Case Is = 0
ThaiTime = "สองยาม"
Case Is = 1, 2, 4, 5, 20, 22, 23
ThaiTime = ThaiNSound(ThNv) & "ทุ่ม"
Case Is = 3
ThaiTime = "สามยาม"
Case Is = 6
ThaiTime = "ย่ำรุ่ง"
Case Is = 7
ThaiTime = "โมงเช้า"
Case Is = 8, 9, 10, 11
ThaiTime = ThaiNSound(ThNv) & "โมงเช้า"
Case Is = 12
ThaiTime = "ย่ำเที่ยง"
Case Is = 13
ThaiTime = "บ่ายโมง"
Case Is = 14, 15, 16, 17
ThaiTime = "บ่าย" & ThaiNSound(ThNv - 6) & "โมง"
Case Is = 18
ThaiTime = "ย่ำค่ำ"
Case Is = 19
ThaiTime = "ทุ่มหนึ่ง"
Case Is = 21
ThaiTime = "หนึ่งยาม"
End Select
If ThM > 0 Then ThaiTime = ThaiTime & " " & ThaiNSound(ThM, True) & "นาที"
Case 1
Select Case ThH
Case Is = 0
ThaiTime = "song yam"
Case Is = 1, 2, 4, 5, 20, 22, 23
ThaiTime = ThNSound(ThNv, , , , False) & "thum"
Case Is = 3
ThaiTime = "sam yam"
Case Is = 6
ThaiTime = "yam-rung"
Case Is = 7
ThaiTime = "mong chao"
Case Is = 8, 9, 10, 11
ThaiTime = ThNSound(ThNv, , , , False) & "mong chao"
Case Is = 12
ThaiTime = "yam-thiang"
Case Is = 13
ThaiTime = "bai mong"
Case Is = 14, 15, 16, 17
ThaiTime = "bai " & ThNSound(ThNv - 6, , , , False) & "mong"
Case Is = 18
ThaiTime = "yam-kham"
Case Is = 19
ThaiTime = "thum nueng"
Case Is = 21
ThaiTime = "nueng yam"
End Select
If ThM > 0 Then ThaiTime = ThaiTime & " " & ThNSound(ThM, True, , , False) & "na-thi"
ThaiTime = LCase(ThaiTime)
Case 2
Select Case ThH
Case Is = 0
ThaiTime = U2W("115 335 110 103 32 121 97 97 109")
Case Is = 1, 2, 4, 5, 20, 22, 23
ThaiTime = ThNSound(ThNv) & U2W("116 251 109")
Case Is = 3
ThaiTime = U2W("115 259 97 109 32 121 97 97 109")
Case Is = 6
ThaiTime = U2W("121 226 109 32 114 251 110 103")
Case Is = 7
ThaiTime = U2W("109 111 104 110 103 32 99 104 225 111")
Case Is = 8, 9, 10, 11
ThaiTime = ThNSound(ThNv) & U2W("109 111 104 110 103 32 99 104 225 111")
Case Is = 12
ThaiTime = U2W("121 226 109 32 116 238 105 97 110 103")
Case Is = 13
ThaiTime = U2W("98 224 97 105 32 109 111 104 110 103")
Case Is = 14, 15, 16, 17
ThaiTime = U2W("98 224 97 105 32") & ThNSound(ThNv - 6) & U2W("109 111 104 110 103")
Case Is = 18
ThaiTime = U2W("121 226 109 32 107 226 109")
Case Is = 19
ThaiTime = U2W("116 251 109 32 110 232 117 110 103")
Case Is = 21
ThaiTime = U2W("110 232 117 110 103 32 121 97 97 109")
End Select
If ThM > 0 Then ThaiTime = ThaiTime & " " & ThNSound(ThM, True) & U2W("110 97 97 45 116 101 101")
ThaiTime = LCase(ThaiTime)
End Select
Case Else
ThaiTime = "#N/A"
End Select
End Function
'dependency
Function ThaiNSound(ByVal sNum, Optional NavyFormat As Boolean = False, Optional sFormat As String = "", Optional NewForm As Boolean = False)
'Thai Number Sound 2.4 [004]
'by Pongsathorn Sraouthai
'for use with integer number only, if it was decimal, it will displaying as integer.
'NavyFormat = True: Use "หนึ่ง" as "เอ็ด" Default is False
'sFormat: If use any text, it will use as separator between place
'NewForm = True: use "เอ็ด" as "หนึ่ง" only in ten place. Default is False
Dim AllChar As String
Dim NumChar As String
Dim ColChar As String
Dim ColNum As Long
Dim N
Dim nPos As Long
Dim nStr As String, nDec As String
ColNum = 0
'Check if decimal number
nPos = InStr(1, sNum, ".", vbTextCompare)
If nPos >= 2 Then
nStr = Mid(sNum, 1, nPos - 1)
sNum = nStr
End If
If Len(sNum) > 15 Then Exit Function
For N = Len(sNum) To 1 Step -1
ColNum = ColNum + 1
Select Case Mid(sNum, N, 1)
Case Is = "0"
If val(sNum) = 0 Or sNum = "" Then
NumChar = U2W("3624 3641 3609 3618 3660") '"ศูนย์"
Else
NumChar = Empty
End If
Case Is = "1"
Select Case NewForm
Case False
If Len(sNum) >= ColNum And ColNum = 14 Or ColNum = 8 Or ColNum = 2 Then
NumChar = Empty
ElseIf ColNum = 13 Or ColNum = 7 Or ColNum = 1 Then
If NavyFormat = True Then
NumChar = U2W("3627 3609 3638 3656 3591") '"หนึ่ง" '2.51
Else
If Len(sNum) > ColNum And val(sNum) > 10 Then
NumChar = U2W("3648 3629 3655 3604") '"เอ็ด" '2.51
Else
NumChar = U2W("3627 3609 3638 3656 3591") '"หนึ่ง"
End If
End If
Else
NumChar = U2W("3627 3609 3638 3656 3591") '"หนึ่ง"
End If
Case True
If Len(sNum) >= ColNum And ColNum = 14 Or ColNum = 8 Or ColNum = 2 Then
NumChar = Empty
ElseIf Len(sNum) > ColNum And ColNum = 13 Or ColNum = 7 Or ColNum = 1 Then
If NavyFormat = False Then
If val(sNum) > 100 And Left(Right(sNum, 2), 1) = "0" Or val(sNum) > 100000000 And Left(Right(sNum, 9), 1) = "0" Or val(sNum) > 100000000000000# And Left(Right(sNum, 13), 1) = "0" Then
NumChar = U2W("3627 3609 3638 3656 3591") '"หนึ่ง"
Else
NumChar = U2W("3648 3629 3655 3604") '"เอ็ด" '2.51
End If
Else
NumChar = U2W("3627 3609 3638 3656 3591") '"หนึ่ง" '2.51
End If
Else
NumChar = U2W("3627 3609 3638 3656 3591") '"หนึ่ง"
End If
End Select
Case Is = "2"
If ColNum = 14 And Len(sNum) >= 14 Or ColNum = 8 And Len(sNum) >= 8 Or ColNum = 2 And Len(sNum) >= 2 Then
NumChar = U2W("3618 3637 3656") '"ยี่" '2.5
Else
NumChar = U2W("3626 3629 3591") '"สอง" '2.5
End If
Case Is = "3"
NumChar = U2W("3626 3634 3617") '"สาม"
Case Is = "4"
NumChar = U2W("3626 3637 3656") '"สี่"
Case Is = "5"
NumChar = U2W("3627 3657 3634") '"ห้า"
Case Is = "6"
NumChar = U2W("3627 3585") '"หก"
Case Is = "7"
NumChar = U2W("3648 3592 3655 3604") '"เจ็ด"
Case Is = "8"
NumChar = U2W("3649 3611 3604") '"แปด"
Case Is = "9"
NumChar = U2W("3648 3585 3657 3634") '"เก้า"
End Select
'case 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1
' ร้อย สิบ ล้าน แสน หมื่น พัน ร้อย สิบ ล้าน แสน หมื่น พัน ร้อย สิบ หน่วย
Select Case ColNum
Case Is = 1
ColChar = Empty
Case Is = 2, 8, 14
If Mid(sNum, N, 1) = "0" Then
ColChar = Empty
Else
ColChar = U2W("3626 3636 3610") '"สิบ"
End If
Case Is = 3, 9, 15
If Mid(sNum, N, 1) = "0" Then
ColChar = Empty
Else
ColChar = U2W("3619 3657 3629 3618") '"ร้อย"
End If
Case Is = 4, 10
If Mid(sNum, N, 1) = "0" Then
ColChar = Empty
ElseIf sFormat <> "" Then
ColChar = U2W("3614 3633 3609") & sFormat
Else
ColChar = U2W("3614 3633 3609") '"พัน"
End If
Case Is = 5, 11
If Mid(sNum, N, 1) = "0" Then
ColChar = Empty
Else
ColChar = U2W("3627 3617 3639 3656 3609") '"หมื่น"
End If
Case Is = 6, 12
If Mid(sNum, N, 1) = "0" Then
ColChar = Empty
Else
ColChar = U2W("3649 3626 3609") '"แสน"
End If
Case Is = 7, 13
If Mid(sNum, N, 1) = "0" Then
ColChar = Empty
ElseIf sFormat <> "" Then
ColChar = U2W("3621 3657 3634 3609") & sFormat
Else
ColChar = U2W("3621 3657 3634 3609") '"ล้าน"
End If
If Len(sNum) > 7 Then ColChar = U2W("3621 3657 3634 3609") '"ล้าน"
If Len(sNum) > 7 And sFormat <> "" Then ColChar = U2W("3621 3657 3634 3609") & sFormat
End Select
AllChar = NumChar & ColChar & AllChar
Next N
ThaiNSound = AllChar
End Function
Function ThaiNString(ByVal sNum, Optional sFormat As String = "0", Optional tFormat As Boolean = False)
'Thai Number String 2.3 [005]
'by Pongsathorn Sraouthai
'for use with integer number only, if it was decimal, it will displaying as integer
'sFormat
'0 = with separated space
'1 = no separated space
'any = use that as separator
'tFormat
'True = use โท as สอง
'False = not use (Default)
Dim AllChar As String
Dim NumChar As String
Dim N
Dim nPos, nStr, nDec
'Check if decimal number
nPos = InStr(1, sNum, ".", vbTextCompare)
If nPos >= 2 Then
nStr = Mid(sNum, 1, nPos - 1)
nDec = Mid(sNum, nPos + 1, Len(sNum) - nPos)
sNum = nStr
End If
For N = Len(sNum) To 1 Step -1
Select Case Mid(sNum, N, 1)
Case Is = "0"
NumChar = "ศูนย์"
Case Is = "1"
NumChar = "หนึ่ง"
Case Is = "2"
If tFormat = True Then
NumChar = "โท" '2.5
Else
NumChar = "สอง" '2.5
End If
Case Is = "3"
NumChar = "สาม"
Case Is = "4"
NumChar = "สี่"
Case Is = "5"
NumChar = "ห้า"
Case Is = "6"
NumChar = "หก"
Case Is = "7"
NumChar = "เจ็ด"
Case Is = "8"
NumChar = "แปด"
Case Is = "9"
NumChar = "เก้า"
End Select
Select Case sFormat
Case "0"
If Len(sNum) = 1 Then
AllChar = NumChar
Else
AllChar = NumChar & " " & AllChar
End If
Case "1"
If Len(sNum) = 1 Then
AllChar = NumChar
Else
AllChar = NumChar & AllChar
End If
Case Else
If Len(sNum) = 1 Then
AllChar = NumChar
Else
AllChar = NumChar & sFormat & AllChar
End If
End Select
Next N
If Len(sNum) > 1 And sFormat = "0" Then
AllChar = Mid(AllChar, 1, Len(AllChar) - 1)
End If
Select Case sFormat
Case "0"
ThaiNString = AllChar
Case "1"
ThaiNString = AllChar
Case ""
ThaiNString = AllChar
Case Else
If sNum <> "" And sNum <> "0" Then
ThaiNString = Left(AllChar, Len(AllChar) - 1)
ElseIf sNum = "0" Then '2.51
ThaiNString = "ศูนย์" '2.51
Else
ThaiNString = ""
End If
End Select
End Function
Function ThNSound(ByVal sNum, Optional NavyFormat As Boolean = False, Optional sFormat As String = "", Optional NewForm As Boolean = False, Optional AccentMode As Boolean = True)
'Thai Number Sound 2.4 Romanized
'by Pongsathorn Sraouthai
'for use with integer number only, if it was decimal, it will displaying as integer.
'NavyFormat = True: Use "หนึ่ง" as "เอ็ด" Default is False
'sFormat: If use any text, it will use as separator between place
'NewForm = True: use "เอ็ด" as "หนึ่ง" only in ten place. Default is False
'AccentMode = True: use accent symbol False: No accent symbol
Dim AllChar As String
Dim NumChar As String
Dim ColChar As String
Dim ColNum As Long
Dim N
Dim nPos As Long
Dim nStr As String, nDec As String
Dim Acc(0 To 20)
Select Case AccentMode
Case True
Acc(0) = U2W("115 335 111 110 32")
Acc(1) = U2W("78 232 117 110 103 32")
Acc(2) = U2W("83 335 110 103 32")
Acc(3) = U2W("83 259 97 109 32")
Acc(4) = U2W("83 232 101 32")
Acc(5) = U2W("72 226 97 32")
Acc(6) = U2W("72 242 107 32")
Acc(7) = U2W("74 232 116 32")
Acc(8) = U2W("66 112 224 101 116 32")
Acc(9) = U2W("71 226 111 32")
Acc(10) = U2W("83 236 112 32")
Acc(11) = U2W("200 116 32")
Acc(12) = U2W("89 234 101 32")
Acc(13) = U2W("82 243 105 32")
Acc(14) = U2W("80 97 110 32")
Acc(15) = U2W("77 232 117 110 32")
Acc(16) = U2W("83 259 101 110 32")
Acc(17) = U2W("76 225 97 110 32")
Case False
'sun nueng song sam si ha hok chet paet kao sip
'et yi roi phan muen saen lan
Acc(0) = "Sun "
Acc(1) = "Nueng "
Acc(2) = "Song "
Acc(3) = "Sam "
Acc(4) = "Si "
Acc(5) = "Ha "
Acc(6) = "Hok "
Acc(7) = "Chet "
Acc(8) = "Paet "
Acc(9) = "Kao "
Acc(10) = "Sip "
Acc(11) = "Et "
Acc(12) = "Yi "
Acc(13) = "Roi "
Acc(14) = "Phan "
Acc(15) = "Muen "
Acc(16) = "Saen "
Acc(17) = "Lan "
End Select
ColNum = 0
'Check if decimal number
nPos = InStr(1, sNum, ".", vbTextCompare)
If nPos >= 2 Then
nStr = Mid(sNum, 1, nPos - 1)
sNum = nStr
End If
If Len(sNum) > 15 Then Exit Function
For N = Len(sNum) To 1 Step -1
ColNum = ColNum + 1
Select Case Mid(sNum, N, 1)
Case Is = "0"
If val(sNum) = 0 Or sNum = "" Then
NumChar = Acc(0)
Else
NumChar = Empty
End If
Case Is = "1"
Select Case NewForm
Case False
If ColNum = 14 Or ColNum = 8 Or ColNum = 2 And Len(sNum) >= ColNum Then
NumChar = Empty
ElseIf ColNum = 13 Or ColNum = 7 Or ColNum = 1 Then
If NavyFormat = True Then
NumChar = Acc(1) '2.51
Else
If Len(sNum) > ColNum Then
NumChar = Acc(11) '2.51
Else
NumChar = Acc(1)
End If
End If
Else
NumChar = Acc(1)
End If
Case True
If ColNum = 14 Or ColNum = 8 Or ColNum = 2 And Len(sNum) >= ColNum Then
NumChar = Empty
ElseIf ColNum = 13 Or ColNum = 7 Or ColNum = 1 And Len(sNum) > ColNum Then
If NavyFormat = False Then
If val(sNum) > 100 And Left(Right(sNum, 2), 1) = "0" Or val(sNum) > 100000000 And Left(Right(sNum, 9), 1) = "0" Or val(sNum) > 100000000000000# And Left(Right(sNum, 13), 1) = "0" Then
NumChar = Acc(1)
Else
NumChar = Acc(11) '2.51
End If
Else
NumChar = Acc(1) '2.51
End If
Else
NumChar = Acc(1)
End If
End Select
Case Is = "2"
If ColNum = 14 And Len(sNum) >= 14 Or ColNum = 8 And Len(sNum) >= 8 Or ColNum = 2 And Len(sNum) >= 2 Then
NumChar = Acc(12) '"ยี่" '2.5
Else
NumChar = Acc(2) '"สอง" '2.5
End If
Case Is = "3"
NumChar = Acc(3) '"สาม"
Case Is = "4"
NumChar = Acc(4) '"สี่"
Case Is = "5"
NumChar = Acc(5) '"ห้า"
Case Is = "6"
NumChar = Acc(6) '"หก"
Case Is = "7"
NumChar = Acc(7) '"เจ็ด"
Case Is = "8"
NumChar = Acc(8) '"แปด"
Case Is = "9"
NumChar = Acc(9) '"เก้า"
End Select
'case 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1
' ร้อย สิบ ล้าน แสน หมื่น พัน ร้อย สิบ ล้าน แสน หมื่น พัน ร้อย สิบ หน่วย
Select Case ColNum
Case Is = 1
ColChar = Empty
Case Is = 2, 8, 14
If Mid(sNum, N, 1) = "0" Then
ColChar = Empty
Else
ColChar = Acc(10) '"สิบ"
End If
Case Is = 3, 9, 15
If Mid(sNum, N, 1) = "0" Then
ColChar = Empty
Else
ColChar = Acc(13) '"ร้อย"
End If
Case Is = 4, 10
If Mid(sNum, N, 1) = "0" Then
ColChar = Empty
ElseIf sFormat <> "" Then
ColChar = Acc(14) '"พัน" & sFormat
Else
ColChar = Acc(14) '"พัน"
End If
Case Is = 5, 11
If Mid(sNum, N, 1) = "0" Then
ColChar = Empty
Else
ColChar = Acc(15) ' "หมื่น"
End If
Case Is = 6, 12
If Mid(sNum, N, 1) = "0" Then
ColChar = Empty
Else
ColChar = Acc(16) '"แสน"
End If
Case Is = 7, 13
If Mid(sNum, N, 1) = "0" Then
ColChar = Empty
ElseIf sFormat <> "" Then
ColChar = Acc(17) '"ล้าน" & sFormat
Else
ColChar = Acc(17) '"ล้าน"
End If
If Len(sNum) > 7 Then ColChar = Acc(17) '"ล้าน"
If Len(sNum) > 7 And sFormat <> "" Then ColChar = Acc(17) & sFormat
End Select
AllChar = NumChar & ColChar & AllChar
Next N
ThNSound = AllChar
End Function
Function ThNString(ByVal sNum, Optional sFormat As String = "0", Optional tFormat As Boolean = False, Optional AccentMode As Boolean = True)
'Thai Number String 2.4 [005]
'by Pongsathorn Sraouthai
'for use with integer number only, if it was decimal, it will displaying as integer
'sFormat
'0 = with separated space
'1 = no separated space
'any = use that as separator
'tFormat
'True = use โท as สอง
'False = not use (Default)
'AccentMode
'True = use accent symbol
'False = No accent symbol
Dim AllChar As String
Dim NumChar As String
Dim N, Nt(10)
Dim nPos, nStr, nDec
'Check if decimal number
nPos = InStr(1, sNum, ".", vbTextCompare)
If nPos >= 2 Then
nStr = Mid(sNum, 1, nPos - 1)
nDec = Mid(sNum, nPos + 1, Len(sNum) - nPos)
sNum = nStr
End If
Select Case AccentMode
Case vbTrue
Nt(0) = U2W("115 335 111 110")
Nt(1) = U2W("110 232 117 110 103")
Nt(2) = U2W("115 335 110 103")
Nt(3) = U2W("115 259 97 109")
Nt(4) = U2W("115 232 101")
Nt(5) = U2W("104 226 97")
Nt(6) = U2W("104 242 107")
Nt(7) = U2W("106 232 116")
Nt(8) = U2W("98 112 224 101 116")
Nt(9) = U2W("103 226 111")
Nt(10) = U2W("116 111 104")
Case vbFalse
Nt(0) = "sun"
Nt(1) = "nueng"
Nt(2) = "song"
Nt(3) = "sam"
Nt(4) = "si"
Nt(5) = "ha"
Nt(6) = "hok"
Nt(7) = "chet"
Nt(8) = "paet"
Nt(9) = "kao"
Nt(10) = "tho"
End Select
For N = Len(sNum) To 1 Step -1
Select Case Mid(sNum, N, 1)
Case Is = "0"
NumChar = Nt(0)
Case Is = "1"
NumChar = Nt(1)
Case Is = "2"
If tFormat = True Then
NumChar = Nt(10) '2.5
Else
NumChar = Nt(2) '2.5
End If
Case Is = "3"
NumChar = Nt(3)
Case Is = "4"
NumChar = Nt(4)
Case Is = "5"
NumChar = Nt(5)
Case Is = "6"
NumChar = Nt(6)
Case Is = "7"
NumChar = Nt(7)
Case Is = "8"
NumChar = Nt(8)
Case Is = "9"
NumChar = Nt(9)
End Select
Select Case sFormat
Case "0"
If Len(sNum) = 1 Then
AllChar = NumChar
Else
AllChar = NumChar & " " & AllChar
End If
Case "1"
If Len(sNum) = 1 Then
AllChar = NumChar
Else
AllChar = NumChar & AllChar
End If
Case Else
If Len(sNum) = 1 Then
AllChar = NumChar
Else
AllChar = NumChar & sFormat & AllChar
End If
End Select
Next N
If Len(sNum) > 1 And sFormat = "0" Then
AllChar = Mid(AllChar, 1, Len(AllChar) - 1)
End If
Select Case sFormat
Case "0"
ThNString = AllChar
Case "1"
ThNString = AllChar
Case ""
ThNString = AllChar
Case Else
If sNum <> "" And sNum <> "0" Then
ThNString = Left(AllChar, Len(AllChar) - 1)
ElseIf sNum = "0" Then '2.51
ThNString = Nt(0) '2.51
Else
ThNString = ""
End If
End Select
End Function
Function U2W(iCode, Optional AddSpace As Boolean = False) As String
'Convert Unicode number to text [018]
Dim N, AllChar, str, ns()
str = Split(iCode, " ")
ReDim ns(UBound(str))
For N = UBound(str) To 0 Step -1
If IsNumeric(str(N)) Then
ns(N) = CLng(str(N))
Select Case AddSpace
Case True
AllChar = ChrW(ns(N)) & " " & AllChar
Case False
AllChar = ChrW(ns(N)) & AllChar
End Select
End If
Next
U2W = AllChar
End Function
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment