การใช้งาน Bahtonly
กระทู้เก่าบอร์ด อ.Yeadram

 4,903   19
URL.หัวข้อ / URL
การใช้งาน Bahtonly

ก่อนหน้านี้ผมเคยถามเรื่องการดึง Bahttext โดยใช้ฟังชั่นจาก Excel
เเต่ตอนนี้เขาให้เปลี่ยนเป็นเเปลงตัวเลขเป็นอักษรภาษาอังกฤษ
ผมจึงอยากทราบวิธีกาดึงครับ

Code เก่าผม


Private Sub Command159_Click()
IsSaveClicked = True
    Me.Dirty = False
    MsgBox "ºÑ¹·Ö¡¢éÍÁÙÅàÃÕºÃéÍÂáÅéÇ"
End Sub

Function ExcelBathtext(value As Double) As String
If value = 0 Then
ExcelBathtext = ""
Else
ExcelBathtext = WorksheetFunction.BahtText(value)
End If
End Function
Private Sub cmdBahtOnly_Click()
alphabet.value = ExcelBathtext(grant_tot.value)
End Sub

Private Sub Command71_Click()
DoCmd.OpenReport "invoice_report_001", acViewPreview, , "[invoiceid] = " & Me.invoiceid.value
alphabet.value = ExcelBathtext(grant_tot.value)
End Sub

Private Sub Form_Error(DataErr As Integer, Response As Integer)
    If MsgBox("¡ÃسҺѹ·Ö¡¢éÍÁÙÅ", vbQuestion + vbYesNo, "Save Record?") = vbYes Then
        IsSaveClicked = True
        Me.Dirty = False
        MsgBox "ºÑ¹·Ö¡¢éÍÁÙÅàÃÕºÃéÍÂáÅéÇ"
    Else
        IsSaveClicked = False
    End If
    Response = acDataErrContinue
End Sub

Private Sub Command63_Click()
DoCmd.RunCommand acCmdSaveRecord
MsgBox "¢éÍÁÙÅ·Ó¡Òúѹ·Ö¡àÃÕºÃéÍÂáÅéÇ", vbOKOly, "á¨é§Ê¶Ò¹ÐºÑ¹·Ö¡"
Me.Recalc
alphabet.value = ExcelBathtext(grant_tot.value)
End Sub

Private Sub Command72_Click()
On Error GoTo Err_Command72_Click


    DoCmd.GoToRecord , , acNewRec

Exit_Command72_Click:
    Exit Sub

Err_Command72_Click:
    MsgBox Err.Description
    Resume Exit_Command72_Click
    
End Sub

---------------------------------
ผมได้ Add-in ฟังชั้น BahtOnly มาไว้ใน Excel เเล้วครับ เเต่ไม่ทราบว่าจะสามารถดึงมาใช้งานได้เหมือนกันหรือไม่
หรือ มีวิธีที่ง่ายกว่านี้หรือเปล่าครับ
เช่น 245.30 = Two Hundred Forty Five Bahts and Thirty Satangs          

19 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R17304
ทำไมไม่เอา Code มาใส่ใน Access เลยล่ะครับ จะได้ไม่ต้องดึงจาก Excel
2 @R17307
ครับผมคือตอนนี้ผมก็อยากได้ Code มาวางเลยนะครับ
เช่นตอนนี้ผมได้ Code มาเเล้ว
เเล้วได้สร้าง Module ขึ้นมาชื่อ BahtText เเล้วนำ Code ไปวางในนั้น
เช่นตามนี้
-------------------------------------------
Function BahtText(InputCurrency As Currency) As String
    Dim DigitSave, UnitSave, DigitName, DigitName1, UnitName, Satang, StrTmp, StrTmp1 As String
    Dim DecimalValue, CurrDigit, PrevDigit, StrLen, DigitBase, ScanDigit As Integer
    Dim IntegerValue As Double

    ' init variable
    DigitName = "ÈÙ¹Âì ˹Öè§ Êͧ ÊÒÁ ÊÕè ËéÒ Ë¡ à¨ç´ á»´ à¡éÒ"    ' name of digit number
    DigitName1 = "ÂÕè ÊÒÁ ÊÕè ËéÒ Ë¡ à¨ç´ á»´ à¡éÒ"        ' name of digit number in another call
    UnitName = "áʹ ÅéÒ¹ ÊÔº ÃéÍ ¾Ñ¹ ËÁ×è¹"      ' name of digit base
    BahtText = ""
    Satang = ""

    ' check for negative val
    If InputCurrency < 0 Then
        InputCurrency = -InputCurrency
        BahtText = "ź"
    End If

    StrTmp1 = Format(InputCurrency, "0.00")             ' rounds up to 2 decimals
    InputCurrency = Val(StrTmp1)
    IntegerValue = Int(InputCurrency)                           ' get integer value
    DecimalValue = (InputCurrency - IntegerValue) * 100             ' get 2 decimal values

    ' check for zeto val
    If IntegerValue = 0 And DecimalValue = 0 Then
        Satang = "ÈÙ¹ÂìºÒ·¶éǹ"
        GoTo locExit
    End If

    ' translate integer val to name if necesary
    If IntegerValue > 0 Then
        StrTmp = Left(StrTmp1, Len(StrTmp1) - 3)        ' get string of integer val
        StrLen = Len(StrTmp)                                 ' get string len
        CurrDigit = 0

        ' scan integer string and compute its name
        For ScanDigit = StrLen To 1 Step -1
            ' save previous digit
            PrevDigit = CurrDigit
            ' get digit base
            DigitBase = ScanDigit Mod 6
            ' convert digit character to numeric value
            CurrDigit = Asc(Mid(StrTmp, StrLen - ScanDigit + 1, 1)) - 48
            ' get unit name from its base
            UnitSave = RTrim(Mid(UnitName, DigitBase * 5 + 1, 5))
            ' get number name from Currdigit, depends on the digit base
            DigitSave = RTrim(Mid(IIf(DigitBase = 2, DigitName1, DigitName), CurrDigit * 5 + 1, 5))

            ' base ten and number 1
            If DigitBase = 1 And CurrDigit = 1 And PrevDigit <> 0 Then
               DigitSave = "àÍç´"
            End If

            ' first digit base may be base million or 1
            If DigitBase = 1 And ScanDigit < 6 Then
               UnitSave = ""
            End If

            ' ignore add digit name in result string if it is zero
            If CurrDigit <> 0 Then
               BahtText = BahtText + DigitSave + UnitSave
            ElseIf DigitBase = 1 Then
               BahtText = BahtText + UnitSave
            End If
        Next ScanDigit

        BahtText = BahtText + "ºÒ·"
    End If

    ' if no decimal value
    If DecimalValue = 0 Then
        Satang = "¶éǹ"
    ' compute decimal val to name, there are only 2 digit
    Else
        StrTmp = Right(StrTmp1, 2)

        ' name ot first digit
        CurrDigit = Asc(Left(StrTmp, 1)) - 48
        PrevDigit = CurrDigit

        If CurrDigit > 0 Then
            Satang = RTrim(Mid(DigitName1, CurrDigit * 5 + 1, 5)) + "ÊÔº"
        End If

        ' name of last digit
        CurrDigit = Asc(Right(StrTmp, 1)) - 48

        If CurrDigit > 0 Then
            Satang = Satang + IIf(CurrDigit = 1 And PrevDigit <> 0, "àÍç´", RTrim(Mid(DigitName, CurrDigit * 5 + 1, 5)))
        End If

        ' store result and unit
        Satang = Satang + "ʵҧ¤ì"
    End If

locExit:
    ' store result to BahtText
    BahtText = BahtText + Satang
End Function
--------------------------------------


--------------------------------------



- จากรูปที่ 2 ผมต้องการให้เเสดงอักษรใน Textbox ชื่อ BahtText
- เมื่อมีการกดปุ่มบันทึกข้อมูล ในปุ่ม command63
- ข้อมูลที่จะนำมาเเสดงจะอยู่ใน Textbox ชื่อ grant_tot

รบกวนด้วยครับ ผมได้อ่านจากในหลายๆท่านเเล้วยังงงๆนะครับ เลยอยากจะให้อธิบายจากของผมเลย มีอะไรจะให้เพิ่มเติมเเจ้งได้นะครับ ขอบคุณอีกครั้งครับ
3 @R17308
--------------------------------------
4 @R17309
ที่ Text Box ที่แสดงตัวเลข ให้เปลี่ยนชื่อหน่อยนะครับ
อาจเปลี่ยนเป็น txtGrandTot

ส่วน Text Box ที่แสดงข้อความให้กำหนด Control Source เป็น

=BahtText([txtGrandTot])
5 @R17311
ทำการเเก้ไข เเล้วครับในช่องตัวอักษรขี้น #Name?
ครับต้องเเก้ไขตรงไหนบ้างรบกวนอีกทีครับ

ขอบคุณครับ
6 @R17313
รบกวนแปะรูปให้ดูหน่อยครับ

1. txtGrandTot
2. Text Box แสดงข้อความตัวเลข

ขอเห็น Properties แสดง Name, Control Source
7 @R17314


ตามนี้ครับ
8 @R17315
9 @R17316
10 @R17317
ส่งไฟล์มาให้ดูดีกว่าครับ คงมีอะไรผิดที่ไหนซักแห่ง
11 @R17318
ผมทำไฟล์ตัวอย่างไว้ให้แล้วนะครับ
ทิ้งอีเมลไว้ละกัน เดี๋ยวจะได้ส่งให้
12 @R17335
ขอบคุณมากครับ E-Mail : auyzeed@mail.com

เด๋วผมอัพไฟล์ส่งให้ครับ


13 @R17336
เเก้ไขครับ

ขอบคุณมากครับ E-Mail : auyzeed@gmail.com

เด๋วผมอัพไฟล์ส่งให้ครับ
14 @R17337
http://cloud.northgatebangkok.com/owncloud/public.php?service=files&t=a646f396b0b3990c64f43473436f9254


http://cloud.northgatebangkok.com/owncloud/public.php?service=files&t=f8a6f76be5fdfc35ec835e1ba9c40003


ไฟล์ตามนี้นะครับ ขอบคุณมากนะครับที่ช่วยเป็นธุระให้
จะมี 2 ไฟล์ คือไฟล์ ที่ใช้ฟังชั่นจาก Excel
และไฟล์ จาก VB Code
บอกตามตรงเลยครับไม่เคยเขียนโปรเเกรม Access เลยงมไม่ถูกครับ

ขอบคุณครับ
15 @R17338
แฮกเลย ปัญหาซับซ้อนมากมาย

บอกตามตรง (อย่าโกรธกันเน้อ ถ้าโกรธก็ขอโทษจริงๆ)

1. vba bahttext ที่คุณใส่มานั้น ไม่ OK ครับ เพราะการตัดคำไม่ถูกต้อง
2. มันมี Name: BahtText ซ้ำ ซึ่งผมหาไม่เจอว่ามันซ้ำกันที่ไหน

ผมถึงได้พยายามสอนนักเรียนของผมว่าเวลาตั้งชื่อ Control ให้แบ่งโดยใช้ Prefix เข้าช่วย เช่น
Table ก็ใช้ tblชื่อตาราง เช่น tblCustomer, tblData อะไรงี้

ซึ่งการใช้ Prefix นี้เขามาชื่อว่า "Hungarian notation" เพราะมีการใช้งานกันจริงๆ เวลาเขียน Code เริ่มจาก C ก่อน แล้วมา VB แล้วก็มาที่ Access

ดังนั้นใช้กันนะครับ เวลาแก้ Code จะได้ไม่ยาก แล้วจะไม่ค่อยเกิด Error แบบที่คุณพบ

(บ่นมาก เดี๋ยวโดนโกรธ)

ตอนนี้ผมแก้ไข BahtText ของคุณแล้วนะครับ สามารถใช้งานได้แล้ว เดี๋ยวจะส่งกลับไปทางอีเมล

ผมแก้ Code ให้แล้วนะครับ
และผมเปลี่ยนชื่อ BahtText ของคุณเป็น newBahtText ทดสอบแล้ว OK
16 @R17340
โอ้วๆ ขอบคุณมากครับผม

ผมจะพยายามศึกษาข้อผิดพลาดต่อไป
ขอบคุณอีกครั้งครับ
17 @R17344
http://cloud.northgatebangkok.com/owncloud/public.php?service=files&t=a646f396b0b3990c64f43473436f9254


http://cloud.northgatebangkok.com/owncloud/public.php?service=files&t=f8a6f76be5fdfc35ec835e1ba9c40003

ขอโทดนะครับ ลิ้งเสีย อยากได้โค้ดเอาไปศึกษาต่ออะครับ รบกวนช่วยอัพให้ใหม่ด้วยนะครับ ขอบคุณครับ
18 @R17369
เด็กใหม่หัดทำ
บอก Mail มาครับเด๋วผมส่งให้ครับเนื่องจากผมได้ปิดไปเเล้ว

19 @R17372
myimportantmy@yahoo.com ขอบคุณมากครับ ถ้ามีปัญหาตรงไหนที่ไม่เข้าใจ เดี๋ยวผม mail ไปถามนะครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.1749s