การคำนวณหาอัตราค่าใช้ไฟฟ้าในบ้านเรือนที่อยู่อาศัย - Source Code Visual Basic 6

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 6/11/2552   เวลา: 02:48
(อ่าน : 48060) 
ก่อนอื่นต้องขอแจ้งให้บางท่านทราบไว้ก่อนว่า นี่เป็นโปรแกรมที่คำนวณหาอัตราค่าไฟฟ้าที่ต้องจ่ายให้กับการไฟฟ้าน่ะครับ ไม่ใช่โปรแกรมที่ใช้คำนวณหาพลังงาน จากอุปกรณ์ไฟฟ้าต่างๆที่มีอยู่ในบ้าน หรือคำนวณหา Power Factor หรืออะไรต่อมิอะไรทางไฟฟ้าo่ะ ... อิอิอิอิอิ ... โจทย์ข้อนี้เป็นโจทย์ที่ไม่ยากนักหรอกครับ และ เขียนขึ้นมาเอาไว้ให้สำหรับผู้ที่พึ่งเริ่มต้นโดยเฉพาะ เพื่อให้รู้จักฝึกการวิเคราะห์โจทย์ ก่อนที่จะลงมือเขียนโปรแกรม (ต่อเนื่องมาจากโปรแกรมตัดเกรดก็ได้น่ะครับ ... 55555+ ... เห็นมันฮิตในการนำมาสอนกันซ่ะเหลือเกิน เอิ๊กๆๆๆๆ) ประโยชน์อีกทางหนึ่งก็เอาไว้ให้สำหรับบุคคลทั่วๆไปใช้งานก็ได้น่ะ อย่างเช่นผมเนี่ยแหละ เอ๊ะ ... พอสักกลางๆเดือนเราก็นำหน่วยไฟฟ้าปัจจุบันมาเทียบกับครั้งก่อน เพื่อจะได้ประมาณการออกว่าเดือนนี้ใช้ไฟไปมากหรือน้อย ... หากมากไปเราก็จะประหยัดได้ทันท่วงที ก่อนที่ค่าไฟจะพุ่งกระฉูดไปมากกว่านี้ ... เดี๋ยวหาเงินค่าเทอมของเด็กมหาลัยไม่ทัน ... 55555+

เอาล่ะครับ ... พี่น้อง ... โปรแกรมตัวนี้จะเป็นตัวอย่างของการใช้ไฟฟ้าประเภท 11 สำหรับการใช้ไฟฟ้าในบ้านเรือนที่อยู่อาศัย (อ่านรายละเอียดเพิ่มเติม ... ที่นี่) และเพื่อให้ง่ายต่อการวิเคราะห์โจทย์ ผมจึงเลือกเอาลักษณะการใช้ไฟฟ้าที่บ้านผมเอง ซึ่งใช้พลังงานไฟฟ้าเกินกว่า 150 หน่วยต่อเดือน เพราะเงื่อนไขมันน้อยกว่าแบบที่ใช้พลังงานไฟฟ้าน้อยกว่า 150 หน่วยต่อเดือน
1.2 ใช้พลังงานไฟฟ้าเกินกว่า 150 หน่วยต่อเดือน
การใช้ไฟฟ้า อัตราค่าไฟฟ้าจริง การอุดหนุนค่าไฟฟ้า อัตราค่าไฟฟ้าที่เรียกเก็บ
ระบบผลิตไฟฟ้า (บาท/หน่วย) ระบบส่ง (บาท/หน่วย) ระบบจำหน่าย (บาท/หน่วย) ค่าบริการ (บาท/เดือน) ระบบจำหน่าย (บาท/หน่วย) ค่าบริการ (บาท/เดือน) ค่าพลังงานไฟฟ้า (บาท/หน่วย) ค่าบริการ (บาท/เดือน)
ค่าบริการรายเดือน       40.90   -   40.90
หน่วยที่
0 - 150
1.5518 0.2818 0.4849   - 0.5138   1.8047  
หน่วยที่
151 – 400
1.5518 0.2818 0.4849   0.4596   2.7781  
หน่วยที่ 401 เป็นต้นไป 1.5518 0.2818 0.4849   0.6595   2.9780  


ตัวอย่างรูปใบแจ้งค่าไฟฟ้าี้ ... ไม่ใช่ของผมหรอกครับ
จ่ายขนาดนี้ก็น่าจะเป็นฮาเร็มแล้ว โอ้ ... ลัลลา ... ป๋าทองก้อน

วิธีคิดค่าไฟฟ้า ... วิเคราะห์โจทย์นั่นเอง
    กรณีที่ 1 ... สมมุติใช้ไฟจำนวน 71 หน่วย
  • ซึ่งไม่เกิน 150 หน่วย (อัตราต่อหน่วย = 1.8047 บาท) และ มีค่า FT = 0.9255 บาท
    • (1) ค่าไฟฟ้าพื้นฐาน 71 x 1.8047 = 169.03 บาท
    • (2) ค่า FT (จำนวนหน่วย x FT) หรือ 71 x 0.9255 = 65.71 บาท
    • (3) ค่าบริการรายเดือน = 40.90 บาท
    • (4) เอา (1) + (2) + (3) รวมเป็นเงิน = 234.74 บาท
    • (5) คิดภาษี 7% = 16.43 บาท
    • (6) เอา (4) + (5) รวมเป็นเงินที่ต้องชำระ = 251.18 บาท
    กรณีที่ 2 ... สมมุติใช้ไฟจำนวน 236 หน่วย
  • ซึ่งมากกว่า 150 หน่วย แต่ไม่เกิน 250 หน่วย และ มีค่า FT = 0.9255 บาท
      ต้องแยกการคำนวณออกเป็น 2 ส่วน คือ
      • ส่วนที่ไม่เกิน 150 หน่วย (อัตราต่อหน่วย = 1.8047 บาท)
      • ส่วนที่เกิน 150 หน่วย แต่ไม่เกิน 400 หน่วย (อัตราต่อหน่วย = 2.7781 บาท)
    • (1) 150 หน่วยแรก (150 x 1.8047) = 270.71 บาท
    • หน่วยที่เกิน คือ 236 - 150 = 86 หน่วย
    • (2) หน่วยที่เหลือ (86 x 2.7781) = 238.92 บาท (สังเกตว่าเปลี่ยนตัวคูณด้วย)
    • (3) ค่า FT (จำนวนหน่วย x FT) หรือ 236 x 0.9255 = 218.42 บาท
    • (4) ค่าบริการรายเดือน = 40.90 บาท
    • (5) เอา (1) + (2) + (3) + (4) รวมเป็นเงิน = 768.94 บาท
    • (6) คิดภาษี 7% = 53.83 บาท
    • (7) เอา (5) + (6) รวมเป็นเงินที่ต้องชำระ = 822.76 บาท
    กรณีที่ 3 ... สมมุติใช้ไฟจำนวน 648 หน่วย
  • ซึ่งมากกว่า 400 หน่วย และ มีค่า FT = 0.9255 บาท
      ต้องแยกการคำนวณออกเป็น 3 ส่วน คือ
      • ส่วนที่ไม่เกิน 150 หน่วย (อัตราต่อหน่วย = 1.8047 บาท)
      • ส่วนที่เกิน 150 หน่วย แต่ไม่เกิน 400 หน่วย หรือ 400 - 150 = 250 หน่วย (อัตราต่อหน่วย = 2.7781 บาท)
      • ส่วนที่เกิน 400 หน่วยขึ้นไป (อัตราต่อหน่วย = 2.9780 บาท)
    • (1) 150 หน่วยแรก (150 x 1.8047) = 270.71 บาท ...
    • (2) 250 หน่วยต่อไป (250 x 2.7781) = 694.53 บาท
    • หน่วยที่เกินจาก 400 หน่วย คือ 648 - 400 = 238 หน่วย
    • (3) หน่วยที่เหลือ (238 x 2.9780) = 1,744.67 บาท (สังเกตว่าเปลี่ยนตัวคูณด้วย)
    • (4) ค่า FT (จำนวนหน่วย x FT) หรือ 648 x 0.9255 = 599.72 บาท
    • (5) ค่าบริการรายเดือน = 40.90 บาท
    • (6) เอา (1) + (2) + (3) + (4) + (5) รวมเป็นเงิน = 2,344.40 บาท
    • (7) คิดภาษี 7% = 164.11 บาท
    • (8) เอา (6) + (7) รวมเป็นเงินที่ต้องชำระ = 2,508.51 บาท
    เห็นหรือยังครับพี่น้อง ... หากไม่เข้าใจถึงกระบวนการขั้นตอนของวิธีคิดค่าไฟฟ้า ก็ไม่มีทางที่จะเขียนเป็นโปรแกรมออกมาได้หรอกครับ ... สำหรับมือใหม่แล้วก็ควรที่จะต้องออกแบบผังงาน หรือ Flow Chart ก่อนด้วย ไม่ใช่รีบนั่งหันหน้าเข้าหาจอภาพ มือก็พิมพ์ก็อกๆแก็กๆออกมาทันที ไปไม่รอดได้ง่ายๆหรอกครับ เพราะการออกแบบผังงานก่อน จะทำให้เรามองภาพได้ชัดเจนมากกว่านี้ ... เพราะจาก 3 กรณีตัวอย่าง นี่แหละที่มัน คือ กระบวนการ Process และ ภายใต้ Process มันก็จะมีเรื่องของเงื่อนไข (Condition) เพื่อทำการตัดสินใจ (Decision) ซึ่งคำตอบก็มีแค่ จริง หรือ เท็จ จากนั้นก็ค่อยสั่งให้มันไปทำอะไร ที่ไหน ... ไม่ใช่เขียนโค้ดคำนวณเกรดได้เท่านั้น แล้วเออออตัวเองว่า "เขียนโปรแกรมเป็นแล้ว (โว้ย)"
    ค่าบริการรายเดือน ที่มาของการคิด ผมก็ไม่รู้หรอกว่ามันมาได้ยังไง ... ก็คงประมาณว่า 40.9 บาท คิดเผื่อไว้ก่อนเลย ตอนเสียเวลามายกหม้อ เอ้ย ถอดมิเตอร์ออกเมื่อโดนตัดไฟ ส่วนอีก 107 บาท เขาคิดค่าเอามาใส่กลับคืน ... ก้ากกกกกกกกๆๆๆๆ ... คิดแบบขำๆครับ อย่าซีเรียส ... 55555+
ดาวน์โหลด
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
 ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
 ดาวน์โหลด Microsoft Visual Basic Service Pack 6


Design Time


Run Time

เริ่มต้นกระบวนการทำงาน

Option Explicit

' อัตราค่าบริการ ประเภท 11 บ้านที่อยู่อาศัย
' คือใช้พลังงานไฟฟ้าเกิน 150 หน่วยต่อเดือน
Const FeePaid As Double = 40.9
' คือ 40.9 บาท เป็นค่าบริการถอดมิเตอร์ (ล่วงหน้า) ... ส่วน 107 บาท เป็นบริการใส่กลับคืน (ตามหลัง) ... 55555+ คิดได้ไงเนี่ย ....

PriVate Sub cmdCalElectric_Click()
    Dim FirstUnit As Double                     ' ไม่เกิน 150 หน่วย (150 หน่วยแรก)
    Dim SecondUnit As Double              ' มากกว่า 150 หน่วย แต่ไม่เกิน 400 หน่วย (หรือ 400 - 150 = 250 หน่วย)
    Dim ThirdUnit As Double                   ' มากกว่า 400 หน่วยขึ้นไป
    Dim SumElectricCost As Double     ' (1) ผลรวมของค่าไฟฟ้ามาตรฐาน
    Dim SumFT As Double                       ' (2). ค่า FT คูณจำนวนหน่วย
    Dim Vat As Double                               ' (3). เอา 1 + 2 แล้วหาค่าภาษี 7%
    Dim TotalAmount As Double            ' (4)  เอา 1 + 2 + 3 คืออัตราค่าไฟฟ้าทั้งหมด
    
    If txtUnit.Text = 0 Or IsNull(txtUnit.Text) Then Exit Sub
    If txtFT.Text = "" Or IsNull(txtFT.Text) Then txtFT.Text = "0"
    txtSummary.Text = ""
        
    ' กรณีแรกใช้ไฟฟ้าระหว่าง 0 - 150 หน่วย 
    If Val(txtUnit.Text) <= 150 Then
        FirstUnit = Val(txtUnit.Text) * 1.8047
        ' บวกค่าบริการด้วย (สงสัยว่ามันบริการอะไร ...)
        SumElectricCost = FirstUnit + FeePaid
        SumFT = Val(txtUnit.Text) * Val(txtFT.Text)
        Vat = ((SumElectricCost + SumFT) * 7) / 100
        TotalAmount = SumElectricCost + SumFT + Vat
        txtSummary.Text = "==================" & vbCrLf & _
                                            "รวมจำนวนเงิน =    " & Format(SumElectricCost, "#,##0.00") & vbCrLf & _
                                            "ค่า FT =               " & Format(SumFT, "#,##0.00") & vbCrLf & _
                                            "==================" & vbCrLf & _
                                            "รวมเงินค่าไฟฟ้า =  " & Format(SumElectricCost + SumFT, "#,##0.00") & vbCrLf & _
                                            "ภาษีมูลค่าเพิ่ม =     " & Format(Vat, "#,##0.00") & vbCrLf & vbCrLf & _
                                            "รวมเงินที่ต้องชำระ: " & Format(TotalAmount, "#,##0.00") & " บาท."
    
    ' ใช้ไฟฟ้าระหว่าง 151 - 400 หน่วย (หรือ 400 - 150 = 250 หน่วย)
    ElseIf (Val(txtUnit.Text) > 150) And (Val(txtUnit.Text) <= 400) Then
        FirstUnit = 150 * 1.8047
        SecondUnit = (Val(txtUnit.Text) - 150) * 2.7781
        SumElectricCost = Format(FirstUnit + SecondUnit + FeePaid, "#,##0.00")
        SumFT = Val(txtUnit.Text) * Val(txtFT.Text)
        Vat = ((SumElectricCost + SumFT) * 7) / 100
        TotalAmount = SumElectricCost + SumFT + Vat
        txtSummary.Text = "150 หน่วยแรก =  " & Format(FirstUnit, "#,##0.00") & vbCrLf & _
                                            "250 หน่วยต่อไป = " & Format(SecondUnit, "#,##0.00") & vbCrLf & _
                                            "==================" & vbCrLf & _
                                            "รวมจำนวนเงิน =    " & Format(SumElectricCost, "#,##0.00") & vbCrLf & _
                                            "ค่า FT =               " & Format(SumFT, "#,##0.00") & vbCrLf & _
                                            "==================" & vbCrLf & _
                                            "รวมเงินค่าไฟฟ้า =  " & Format(SumElectricCost + SumFT, "#,##0.00") & vbCrLf & _
                                            "ภาษีมูลค่าเพิ่ม =     " & Format(Vat, "#,##0.00") & vbCrLf & vbCrLf & _
                                            "รวมเงินที่ต้องชำระ: " & Format(TotalAmount, "#,##0.00") & " บาท."
    
    ' ใช้ไฟฟ้าตั้งแต่ 401 หน่วยขึ้นไป
    ElseIf (Val(txtUnit.Text) > 400) Then
        FirstUnit = 150 * 1.8047
        SecondUnit = 250 * 2.7781
        ThirdUnit = (Val(txtUnit.Text) - 400) * 2.978
        SumElectricCost = FirstUnit + SecondUnit + ThirdUnit + FeePaid
        SumFT = Val(txtUnit.Text) * Val(txtFT.Text)
        Vat = ((SumElectricCost + SumFT) * 7) / 100
        TotalAmount = SumElectricCost + SumFT + Vat
        txtSummary.Text = "150 หน่วยแรก = " & Format(FirstUnit, "#,##0.00") & vbCrLf & _
                                            "250 หน่วยต่อไป = " & Format(SecondUnit, "#,##0.00") & vbCrLf & _
                                            "400 หน่วยขึ้นไป = " & Format(ThirdUnit, "#,##0.00") & vbCrLf & _
                                            "==================" & vbCrLf & _
                                            "รวมจำนวนเงิน = " & Format(SumElectricCost, "#,##0.00") & vbCrLf & _
                                            "ค่า FT =               " & Format(SumFT, "#,##0.00") & vbCrLf & _
                                            "==================" & vbCrLf & _
                                            "รวมเงินค่าไฟฟ้า =  " & Format(SumElectricCost + SumFT, "#,##0.00") & vbCrLf & _
                                            "ภาษีมูลค่าเพิ่ม =     " & Format(Vat, "#,##0.00") & vbCrLf & vbCrLf & _
                                            "รวมเงินที่ต้องชำระ: " & Format(TotalAmount, "#,##0.00") & " บาท."
    End If
    
    ' =========== แถม ===========
    ' กรณีของการใช้ Select Case ...
    'Select Case Val(txtUnit.Text)
    '    Case 0 To 150
    '        MsgBox "0 - 150 (หรือ 150 หน่วยแรก)"
    '    Case 151 To 400
    '        MsgBox "151 - 400 (หรือ 250 หน่วย)"
    '    Case Else
    '        MsgBox "401หน่วย ขึ้นไป"
    'End Select
    ' ==========================
    
    Call HLText(txtUnit)
End Sub

' จะใช้ตัวนี้ได้ก็ต่อเมื่อตั้งค่าคุณสมบัติของฟอร์ม KeyPreview = True ก่อนด้วยครับ
' หมายความว่าเราสามารถใช้ปุ่มฟังค์ชั่นต่างๆของฟอร์มได้ ...
PriVate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
        ' กดปุ่มฟังค์ชั่น F8
        Case vbKeyF8
            Call cmdCalElectric_Click
            
        ' กดปุ่มฟังค์ชั่น F10
        Case vbKeyF10
            End
    End Select
End Sub

PriVate Sub Form_Load()

    Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
    
    txtUnit.Text = ""
    txtFT.Text = "0.9255"
    txtSummary.Text = ""
    
End Sub

PriVate Sub txtFT_GotFocus()
    ' ฟังค์ชั่นนี้อยู่ใน modFunction เพื่อเลือกข้อมูลใน Text Box ทั้งหมด
    Call HLText(txtFT)
End Sub

PriVate Sub txtFT_KeyPress(KeyAscii As Integer)
    If KeyAscii = vbKeyReturn Then
        KeyAscii = 0
        Call cmdCalElectric_Click
    Else
        ' ฟังค์ชั่นนี้อยู่ใน modFunction เพื่อตรวจสอบการกดคีย์ 0 - 9 และ จุดทศนิยม
        KeyAscii = CheckCurrency(KeyAscii, txtFT)
    End If
End Sub

PriVate Sub txtUnit_KeyPress(KeyAscii As Integer)
    ' กดปุ่ม Enter ส่งรหัส ASCII =13
    If KeyAscii = vbKeyReturn Then
        KeyAscii = 0
        Call cmdCalElectric_Click
    Else
        ' ฟังค์ชั่นนี้อยู่ใน modFunction เพื่อตรวจสอบการกดคีย์ 0 - 9 เท่านั้น
        KeyAscii = CheckDigitOnly(KeyAscii)
    End If
End Sub
ส่วนของฟังค์ชั่น (modFunction.bas)

Option Explicit

' ทำไฮไลท์สำหรับ Text Box
Public Sub HLText(ByRef sText)
    On Error Resume Next
    With sText
        .SelStart = 0
        .SelLength = Len(sText.Text)
    End With
End Sub

' ตรวจสอบค่าใน Text Box ให้รับเฉพาะตัวเลขเท่านั้น
Function CheckDigitOnly(Index As Integer) As Integer
    Select Case Index
        Case 48 To 57
            CheckDigitOnly = Index
        Case 8
            ' Back Space
        Case 13
            ' Enter
        
        Case Else
            Index = 0
    End Select
    CheckDigitOnly = Index
End Function

' ตรวจสอบค่าใน Text Box ให้รับเฉพาะตัวเลข และ จุดทศนิยมเท่านั้น
Function CheckCurrency(Index As Integer, Ctrl As TextBox) As Integer
    Select Case Index
        Case 48 To 57
            ' 0 - 9 and Return index = KeyAscii
        Case 8
            ' Back Space and Return index = KeyAscii
        Case 13
            ' Enter and Return index = KeyAscii
        Case 46 ' รหัส Ascii Code  ของเครื่องหมายจุดครับพี่น้อง
            If InStr(Ctrl, ".") Then Index = 0 ' ใช้ฟังค์ชั่น InStr (In String) เพื่อหาเครื่องหมายจุดใน TextBox
        Case Else
            Index = 0
    End Select
    CheckCurrency = Index ' Return ค่ากลับตามที่ได้ตรวจสอบ
End Function
Conclusion:
สำหรับผู้ที่พึ่งเริ่มต้นในการเขียนโปรแกรม ก็จงพยายามหัดมองหาโจทย์ต่างๆ ที่อยู่ใกล้ๆกับตัวเราเองนั่นแหละครับ เพื่อนำมาตั้งเป็นคำถามให้กับตัวเราได้ลองฝึกคิด ฝึกทำดู อย่าพยายามไปหลงทางวนเวียนอยู่แต่เพียงในตำรากันนักเลยครับ ... มันจะสนุก จะมัน หรือ มีแนวคิดจินตนาการต่อไปได้ยังไงล่ะครับ