|
นี่เป็นโค้ดโปรแกรมที่ คำนวณหาอัตราค่าไฟฟ้าที่ต้องจ่ายให้กับการไฟฟ้าส่วนภูมิภาค ตามใบแจ้งหนี้ในแต่ละเดือนน่ะครับ ไม่ใช่โปรแกรมที่ใช้คำนวณหาพลังงาน จากอุปกรณ์ไฟฟ้าต่างๆที่มีอยู่ในบ้าน หรือคำนวณหา Power Factor หรืออะไรต่อมิอะไรทางไฟฟ้า ซึ่งเป็นการคิดค่าไฟฟ้าแบบขั้นบันได (ดูรายละเอียดประเภทที่ 1 บ้านอยู่อาศัย) โดยคิดจากการใช้หน่วยไฟฟ้าหลักๆ คือ หากไม่เกิน 150 และเกิน 150 หน่วยต่อเดือน แอดมินขอยกตัวอย่างจริงที่บ้านแอดมินก็แล้วกัน ...
วิธีการคิดแบบขั้นบันได ... (ดูภาพตารางประกอบ)
สมมุติว่าใช้ไฟจำนวน 636 หน่วย ซึ่งมากกว่า 400 หน่วย โดยมีค่า FT (ปัจจุบัน) = -0.1160 บาท
ต้องแยกการคำนวณออกเป็น 3 ส่วน คือ
ส่วนที่ไม่เกิน 150 หน่วย (อัตราต่อหน่วย = 3.2484 บาท)
ส่วนที่เกิน 150 หน่วย แต่ไม่เกิน 400 หน่วย หรือ 400 - 150 = 250 หน่วย (อัตราต่อหน่วย = 4.2218 บาท)
ส่วนที่เกิน 400 หน่วยขึ้นไป (อัตราต่อหน่วย = 4.4217 บาท)
(1) 150 หน่วยแรก (150 x 3.2484) = 487.26 บาท ...
(2) 250 หน่วยต่อไป (250 x 4.2218) = 1,055.45 บาท
หน่วยที่เกินจาก 400 หน่วย คือ 636 - 400 = 236 หน่วย
(3) หน่วยที่เหลือ (236 x 4.4217) = 1,043.52 บาท (สังเกตว่าเปลี่ยนตัวคูณด้วย)
(4) ค่า FT (จำนวนหน่วย x FT) หรือ 636 x -0.1160 = -73.78 บาท
(5) ค่าบริการรายเดือน = 38.22 บาท
(6) เอา (1) + (2) + (3) + (4) + (5) รวมเป็นเงิน = 2,550.68 บาท
(7) คิดภาษี 7% = 178.55 บาท
(8) เอา (6) + (7) รวมเป็นเงินที่ต้องชำระ = 2,729.23 บาท
มาดูโค้ดต้นฉบับกันเถอะ (VB.NET) ...
- Public Class frmCalElectrical
- Private Sub frmCalElectrical_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
- Me.Dispose()
- Application.Exit()
- End Sub
- Private Sub frmCalElectrical_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
- Select Case e.KeyCode
- Case Keys.F8
- Call btnProcess_Click(sender, e)
- Case Keys.F10
- Me.Close()
- End Select
- End Sub
- Private Sub frmCalElectrical_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
- Call SetupGridView(Me.DataGridView1)
- Call SetupGridView(Me.DataGridView2)
- Call InitData()
- txtUnit.Text = ""
- End Sub
- Private Sub SetupGridView(ByRef DGV As DataGridView)
- '// Initialize DataGridView Control
- With DGV
- .RowHeadersVisible = False
- .AllowUserToAddRows = False
- .AllowUserToDeleteRows = False
- .AllowUserToResizeRows = False
- .MultiSelect = False
- .SelectionMode = DataGridViewSelectionMode.CellSelect
- .Font = New Font("Tahoma", 9)
- ' Autosize Column
- .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
- .AutoResizeColumns()
- '// Even-Odd Color
- .AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
- ' Adjust Header Styles
- With .ColumnHeadersDefaultCellStyle
- .BackColor = Color.Navy
- .ForeColor = Color.Black ' Color.White
- .Font = New Font("Tahoma", 9, FontStyle.Bold)
- End With
- End With
- End Sub
- ' / Initialized DataGridView and put the sample data.
- Private Sub InitData()
- txtSummary.Text = ""
- txtMonthFee1.Text = "8.19"
- txtMonthFee2.Text = "38.22"
- txtFT.Text = "-0.1160"
- txtUnit.Text = "0"
- '//
- Me.DataGridView1.Columns.Clear()
- Me.DataGridView2.Columns.Clear()
- '// Declare columns type.
- Dim Column1 As New DataGridViewTextBoxColumn()
- Dim Column2 As New DataGridViewTextBoxColumn()
- '// Add new Columns
- DataGridView1.Columns.AddRange(New DataGridViewColumn() { _
- Column1, Column2 _
- })
- With DataGridView1
- .Columns(0).Name = "UnitName"
- .Columns(0).HeaderText = "จำนวนหน่วย"
- .Columns(0).ReadOnly = True
- .Columns(1).Name = "UnitPrice"
- .Columns(1).HeaderText = "ค่าพลังงานไฟฟ้า (บาท/หน่วย)"
- .Columns(1).ReadOnly = False
- End With
- '// DataGridView1
- Dim row = New String() {"15 หน่วยแรก (หน่วยที่ 0 – 15)", "2.3488"}
- DataGridView1.Rows.Add(row)
- row = {"10 หน่วยต่อไป (หน่วยที่ 16 – 25)", "2.9882"}
- DataGridView1.Rows.Add(row)
- row = {"10 หน่วยต่อไป (หน่วยที่ 26 – 35)", "3.2405"}
- DataGridView1.Rows.Add(row)
- row = {"65 หน่วยต่อไป (หน่วยที่ 36 – 100)", "3.6237"}
- DataGridView1.Rows.Add(row)
- row = {"50 หน่วยต่อไป (หน่วยที่ 101 – 150)", "3.7171"}
- DataGridView1.Rows.Add(row)
- row = {"250 หน่วยต่อไป (หน่วยที่ 151 – 400)", "4.2218"}
- DataGridView1.Rows.Add(row)
- row = {"เกิน 400 หน่วยขึ้นไป (หน่วยที่ 401 เป็นต้นไป)", "4.4217"}
- DataGridView1.Rows.Add(row)
- With Me.DataGridView1
- .Columns(1).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight
- .Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
- End With
- '// DataGridView2
- '// Declare columns type.
- Dim Col1 As New DataGridViewTextBoxColumn()
- Dim Col2 As New DataGridViewTextBoxColumn()
- '// Add new Columns
- DataGridView2.Columns.AddRange(New DataGridViewColumn() { _
- Col1, Col2 _
- })
- With DataGridView2
- .Columns(0).Name = "UnitName"
- .Columns(0).HeaderText = "จำนวนหน่วย"
- .Columns(0).ReadOnly = True
- .Columns(1).Name = "UnitPrice"
- .Columns(1).HeaderText = "ค่าพลังงานไฟฟ้า (บาท/หน่วย)"
- .Columns(1).ReadOnly = False
- End With
- row = {"150 หน่วยแรก (หน่วยที่ 0 – 150)", "3.2484"}
- DataGridView2.Rows.Add(row)
- row = {"250 หน่วยต่อไป (หน่วยที่ 151 – 400)", " 4.2218"}
- DataGridView2.Rows.Add(row)
- row = {"เกิน 400 หน่วยขึ้นไป (หน่วยที่ 401 เป็นต้นไป)", "4.4217"}
- DataGridView2.Rows.Add(row)
- With Me.DataGridView2
- .Columns(1).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight
- .Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
- End With
- End Sub
- Private Sub btnProcess_Click(sender As System.Object, e As System.EventArgs) Handles btnProcess.Click
- '// Trap Error
- If txtFT.Text = "" Then txtFT.Text = "0.00"
- If txtUnit.Text = "" Then txtUnit.Text = "0"
- If txtMonthFee1.Text = "" Then txtMonthFee1.Text = "0.00"
- If txtMonthFee2.Text = "" Then txtMonthFee2.Text = "0.00"
- '// เช็คค่าว่างในเซลล์
- For i = 0 To Me.DataGridView1.RowCount - 1
- If IsNothing(Me.DataGridView1.Rows(i).Cells(1).Value) Then Me.DataGridView1.Rows(i).Cells(1).Value = 0.0
- Next
- For i = 0 To Me.DataGridView2.RowCount - 1
- If IsNothing(Me.DataGridView2.Rows(i).Cells(1).Value) Then Me.DataGridView2.Rows(i).Cells(1).Value = 0.0
- Next
- '// CALCULATE
- Call CalElectrical()
- End Sub
- '// คำนวณผล
- Private Sub CalElectrical()
- 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 คืออัตราค่าไฟฟ้าทั้งหมด
- ' คิดแบบขั้นบันไดกรณีใช้พลังงานไฟฟ้าไม่เกิน 150 หน่วย/เดือน
- Dim intStep As Double
- Select Case Val(txtUnit.Text)
- Case 1 To 15 : intStep = Me.DataGridView1.Rows(0).Cells(1).Value
- Case 16 To 25 : intStep = Me.DataGridView1.Rows(1).Cells(1).Value
- Case 26 To 35 : intStep = Me.DataGridView1.Rows(2).Cells(1).Value
- Case 36 To 100 : intStep = Me.DataGridView1.Rows(3).Cells(1).Value
- Case 101 To 150 : intStep = Me.DataGridView1.Rows(4).Cells(1).Value
- Case 151 To 400 : intStep = Me.DataGridView1.Rows(5).Cells(1).Value
- Case Else : intStep = Me.DataGridView1.Rows(6).Cells(1).Value
- End Select
- ' / ---------------------------------------------------------------
- ' กรณีแรกใช้ไฟฟ้าระหว่าง 0 - 150 หน่วย
- If Val(txtUnit.Text) <= 150 Then
- FirstUnit = Val(txtUnit.Text) * intStep
- ' บวกค่าบริการด้วย (สงสัยว่ามันบริการอะไร ...)
- SumElectricCost = FirstUnit + Val(txtMonthFee1.Text) 'FeePaid
- SumFT = Val(txtUnit.Text) * Val(txtFT.Text)
- Vat = ((SumElectricCost + SumFT) * 7) / 100
- TotalAmount = SumElectricCost + SumFT + Vat
- txtSummary.Text = _
- "==================" & vbCrLf & _
- "รวมจำนวนเงิน" & vbTab & " = " & Format(SumElectricCost, "#,##0.00") & vbCrLf & _
- "ค่า FT" & vbTab & vbTab & " = " & Format(SumFT, "#,##0.00") & vbCrLf & _
- "==================" & vbCrLf & _
- "รวมเงินค่าไฟฟ้า" & vbTab & " = " & Format(SumElectricCost + SumFT, "#,##0.00") & vbCrLf & _
- "ภาษีมูลค่าเพิ่ม" & vbTab & " = " & Format(Vat, "#,##0.00") & vbCrLf & vbCrLf & _
- "รวมเงินที่ต้องชำระ: " & vbTab & " = " & Format(TotalAmount, "#,##0.00") & " บาท."
- '// -------------------------------------------------------------------------------
- '// ใช้ไฟฟ้าระหว่าง 151 - 400 หน่วย (หรือ 400 - 150 = 250 หน่วย)
- ElseIf (Val(txtUnit.Text) > 150) And (Val(txtUnit.Text) <= 400) Then
- FirstUnit = 150 * Me.DataGridView2.Rows(0).Cells(1).Value
- SecondUnit = 250 * Me.DataGridView2.Rows(1).Cells(1).Value
- SumElectricCost = Format(FirstUnit + SecondUnit, "#,##0.00")
- SumFT = Val(txtUnit.Text) * Val(txtFT.Text)
- Vat = ((SumElectricCost + SumFT) * 7) / 100
- TotalAmount = SumElectricCost + SumFT + Vat
- '//
- txtSummary.Text = _
- "150 หน่วยแรก" & vbTab & " = " & Format(FirstUnit, "#,##0.00") & vbCrLf & _
- "250 หน่วยต่อไป" & vbTab & " = " & Format(SecondUnit, "#,##0.00") & vbCrLf & _
- "==================" & vbCrLf & _
- "รวมจำนวนเงิน" & vbTab & " = " & Format(SumElectricCost, "#,##0.00") & vbCrLf & _
- "ค่า FT" & vbTab & vbTab & " = " & Format(SumFT, "#,##0.00") & vbCrLf & _
- "==================" & vbCrLf & _
- "รวมเงินค่าไฟฟ้า" & vbTab & " = " & Format(SumElectricCost + SumFT, "#,##0.00") & vbCrLf & _
- "ภาษีมูลค่าเพิ่ม" & vbTab & " = " & Format(Vat, "#,##0.00") & vbCrLf & vbCrLf & _
- "รวมเงินที่ต้องชำระ: " & vbTab & " = " & Format(TotalAmount, "#,##0.00") & " บาท."
- ' / ---------------------------------------------------------------
- ' ใช้ไฟฟ้าตั้งแต่ 401 หน่วยขึ้นไป
- ElseIf (Val(txtUnit.Text) > 400) Then
- FirstUnit = Format(150 * Me.DataGridView2.Rows(0).Cells(1).Value, "#,##0.0000")
- SecondUnit = Format(250 * Me.DataGridView2.Rows(1).Cells(1).Value, "#,##0.0000")
- ThirdUnit = Format((Val(txtUnit.Text) - 400) * Me.DataGridView2.Rows(2).Cells(1).Value, "#,##0.0000")
- 'SumElectricCost = FirstUnit + SecondUnit + ThirdUnit + 38.22 'FeePaid
- SumElectricCost = Format(FirstUnit + SecondUnit + ThirdUnit, "#,##0.0000") 'FeePaid
- SumFT = Format(Val(txtUnit.Text) * Val(txtFT.Text), "#,##0.0000")
- Vat = Format(((SumElectricCost + SumFT + Val(txtMonthFee2.Text)) * 7) / 100, "#,##0.0000")
- TotalAmount = Format(SumElectricCost + SumFT + Vat + Val(txtMonthFee2.Text), "#,##0.0000")
- '//
- txtSummary.Text = _
- "150 หน่วยแรก" & vbTab & " = " & Format(FirstUnit, "#,##0.00") & vbCrLf & _
- "250 หน่วยต่อไป" & vbTab & " = " & Format(SecondUnit, "#,##0.00") & vbCrLf & _
- (Val(txtUnit.Text) - 400) & " หน่วยที่เหลือ" & vbTab & " = " & Format(ThirdUnit, "#,##0.00") & vbCrLf & _
- "==================" & vbCrLf & _
- "รวมจำนวนเงิน" & vbTab & " = " & Format(SumElectricCost, "#,##0.00") & vbCrLf & _
- "ค่าบริการ" & vbTab & vbTab & " = " & Format(Val(txtMonthFee2.Text), "#,##0.00") & vbCrLf & _
- "ค่า FT" & vbTab & vbTab & " = " & Format(SumFT, "#,##0.00") & vbCrLf & _
- "==================" & vbCrLf & _
- "รวมเงินค่าไฟฟ้า" & vbTab & " = " & Format(SumElectricCost + SumFT + Val(txtMonthFee2.Text), "#,##0.00") & vbCrLf & _
- "ภาษีมูลค่าเพิ่ม" & vbTab & " = " & Format(Vat, "#,##0.00") & vbCrLf & vbCrLf & _
- "รวมเงินที่ต้องชำระ: " & vbTab & " = " & Format(TotalAmount, "#,##0.00") & " บาท."
- End If
- End Sub
- ' / ---------------------------------------------------------------
- ' / หากมีการแก้ไขในเซลล์ของตารางกริด เมื่อสิ้นสุดการแก้ไขให้เช็คค่าในหลัก Index = 1 (เก็บค่าอัตราราคา)
- Private Sub DataGridView1_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
- Select Case DataGridView1.Columns(DataGridView1.CurrentCell.ColumnIndex).Index
- Case 1
- If IsNothing(Me.DataGridView1.Rows(e.RowIndex).Cells(1).Value) Then Me.DataGridView1.Rows(e.RowIndex).Cells(1).Value = 0.0
- End Select
- End Sub
- Private Sub DataGridView2_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView2.CellEndEdit
- Select Case DataGridView2.Columns(DataGridView2.CurrentCell.ColumnIndex).Index
- Case 1
- If IsNothing(Me.DataGridView2.Rows(e.RowIndex).Cells(1).Value) Then Me.DataGridView2.Rows(e.RowIndex).Cells(1).Value = 0.0
- End Select
- End Sub
- ' / ---------------------------------------------------------------
- ' / ---------------------------------------------------------------
- ' / ขณะทำการแก้ไขข้อมูลในเซลล์ ตรวจสอบคีย์ที่กดลงไป
- Private Sub DataGridView1_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
- Select Case DataGridView1.Columns(DataGridView1.CurrentCell.ColumnIndex).Index
- '// ColumeIndex 1 is double.
- Case 1
- '// Force to validate value at ValidKeyPress Event.
- RemoveHandler e.Control.KeyPress, AddressOf ValidKeyPress
- AddHandler e.Control.KeyPress, AddressOf ValidKeyPress
- End Select
- End Sub
- Private Sub DataGridView2_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView2.EditingControlShowing
- Select Case DataGridView1.Columns(DataGridView1.CurrentCell.ColumnIndex).Index
- '// ColumeIndex 1 is double.
- Case 1
- '// Force to validate value at ValidKeyPress Event.
- RemoveHandler e.Control.KeyPress, AddressOf ValidKeyPress
- AddHandler e.Control.KeyPress, AddressOf ValidKeyPress
- End Select
- End Sub
- ' / ---------------------------------------------------------------
- ' / ---------------------------------------------------------------
- ' / เช็คการกดคีย์ที่อยู่ในเซลล์ของตารางกริด ให้รับค่าตัวเลขแบบทศนิยมได้เท่านั้น
- Private Sub ValidKeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs)
- Dim tb As TextBox = sender
- Select Case DataGridView1.CurrentCell.ColumnIndex
- Case 1 '// Double
- Select Case e.KeyChar
- Case "0" To "9"
- '// Allowed "."
- Case "."
- '// But it can present "." only one.
- If InStr(tb.Text, ".") Then e.Handled = True
- Case ChrW(Keys.Back)
- Case Else
- e.Handled = True
- End Select
- End Select
- End Sub
- Private Sub txtMonthFee1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtMonthFee1.KeyPress
- Dim KeyAscii As Short = Asc(e.KeyChar)
- If KeyAscii = 13 Then
- e.Handled = True
- SendKeys.Send("{TAB}")
- Else
- ' ตรวจสอบการ Return ค่ากลับว่า True หรือ False
- e.Handled = CheckCurrency(KeyAscii, txtMonthFee1.Text)
- End If
- End Sub
- Private Sub txtMonthFee2_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtMonthFee2.KeyPress
- Dim KeyAscii As Short = Asc(e.KeyChar)
- If KeyAscii = 13 Then
- e.Handled = True
- SendKeys.Send("{TAB}")
- Else
- ' ตรวจสอบการ Return ค่ากลับว่า True หรือ False
- e.Handled = CheckCurrency(KeyAscii, txtMonthFee2.Text)
- End If
- End Sub
- Private Sub txtUnit_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtUnit.KeyPress
- Dim KeyAscii As Short = Asc(e.KeyChar)
- If KeyAscii = 13 Then
- e.Handled = True
- Call btnProcess_Click(sender, e)
- Else
- ' ตรวจสอบการ Return ค่ากลับว่า True หรือ False
- e.Handled = CheckDigitOnly(KeyAscii)
- End If
- End Sub
- Private Sub txtFT_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtFT.KeyPress
- Dim KeyAscii As Short = Asc(e.KeyChar)
- If KeyAscii = 13 Then
- e.Handled = True
- Call btnProcess_Click(sender, e)
- Else
- ' ตรวจสอบการ Return ค่ากลับว่า True หรือ False
- e.Handled = CheckCurrency(KeyAscii, txtFT.Text)
- End If
- End Sub
- Private Sub btnReset_Click(sender As System.Object, e As System.EventArgs) Handles btnReset.Click
- Call InitData()
- End Sub
- Private Sub txtSummary_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles txtSummary.KeyDown
- e.SuppressKeyPress = True
- End Sub
- Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
- Me.Close()
- End Sub
- Private Sub ToolStripStatusLabel3_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripStatusLabel3.Click
- Process.Start("http://www.g2gnet.com/webboard")
- End Sub
- Private Sub ToolStripStatusLabel2_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripStatusLabel2.Click
- Process.Start("https://www.facebook.com/g2gnet")
- End Sub
- #Region "FUNCTION"
- ' / --------------------------------------------------------------------------------
- ' / ฟังค์ชั่นในการป้อนเฉพาะค่าตัวเลขได้เท่านั้น
- Function CheckDigitOnly(ByVal index As Integer) As Boolean
- Select Case index
- Case 48 To 57 ' เลข 0 - 9
- CheckDigitOnly = False
- Case 8, 13 ' Backspace = 8, Enter = 13
- CheckDigitOnly = False
- Case Else
- CheckDigitOnly = True
- End Select
- End Function
- ' / --------------------------------------------------------------------------------
- ' / ฟังค์ชั่นในการป้อนเฉพาะค่าตัวเลขและทศนิยมได้ตัวเดียวเท่านั้น
- Function CheckCurrency(index As Integer, tmpStr As String) As Boolean
- CheckCurrency = False
- Select Case index
- Case 48 To 57 ' เลข 0 - 9
- ' Allowed "."
- Case 46
- ' can present "." only one
- If InStr(tmpStr, ".") Then CheckCurrency = True
- Case 8, 13 ' Backspace = 8, Enter = 13
- Case Else
- CheckCurrency = True
- End Select
- End Function
- #End Region
- End Class
คัดลอกไปที่คลิปบอร์ด
มาดูโค้ดต้นฉบับ (VB6) ...
- Option Explicit
- ' อัตราค่าบริการ (กินเปล่า) ... ประเภท 11 บ้านที่อยู่อาศัย และเป็นประเภท 1.2
- ' คือใช้พลังงานไฟฟ้าเกิน 150 หน่วยต่อเดือน
- Const FeePaid As Double = 38.22 '/ ยังไม่ได้รวม Vat
- ' คือ 40.9 บาท เป็นค่าบริการถอดมิเตอร์ (ล่วงหน้า) ... ส่วน 107 บาท เป็นบริการใส่กลับคืน (ตามหลัง) ... 55555+ คิดได้ไงเนี่ย ....
- ' อัตราค่าไฟฟ้าที่ใช้งานเกิน 150 หน่วยขึ้นไป โดยคิดแบบขั้นบันได
- Const Unit150 As Double = 3.2484 '/ 150 หน่วยแรก
- Const Unit250 As Double = 4.2218 '/ 250 - 400
- Const Unit400 As Double = 4.4217 '/ เกิน 400 หน่วย
- 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 = ""
-
- ' คิดแบบขั้นบันไดกรณีใช้พลังงานไฟฟ้าไม่เกิน 150 หน่วย/เดือน
- Dim intStep As Double
- Select Case Val(txtUnit.Text)
- Case 1 To 15: intStep = 2.3488
- Case 16 To 25: intStep = 2.9882
- Case 26 To 35: intStep = 3.2405
- Case 36 To 100: intStep = 3.6237
- Case 101 To 150: intStep = 3.7171
- Case 151 To 400: intStep = 4.2218
- Case Else: intStep = 4.4217
- End Select
-
- ' กรณีแรกใช้ไฟฟ้าระหว่าง 0 - 150 หน่วย
- If Val(txtUnit.Text) <= 150 Then
- FirstUnit = Val(txtUnit.Text) * intStep
- ' บวกค่าบริการด้วย (สงสัยว่ามันบริการอะไร ...)
- SumElectricCost = FirstUnit + 8.19 '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 * Unit150
- SecondUnit = 250 * Unit250
- SumElectricCost = Format(FirstUnit + SecondUnit, "#,##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 = Format(150 * Unit150, "#,##0.0000")
- SecondUnit = Format(250 * Unit250, "#,##0.0000")
- ThirdUnit = Format((Val(txtUnit.Text) - 400) * Unit400, "#,##0.0000")
- 'SumElectricCost = FirstUnit + SecondUnit + ThirdUnit + 38.22 'FeePaid
- SumElectricCost = Format(FirstUnit + SecondUnit + ThirdUnit, "#,##0.0000") 'FeePaid
- SumFT = Format(Val(txtUnit.Text) * Val(txtFT.Text), "#,##0.0000")
- Vat = Format(((SumElectricCost + SumFT + 38.22) * 7) / 100, "#,##0.0000")
- TotalAmount = Format(SumElectricCost + SumFT + Vat + 38.22, "#,##0.0000")
- '//
- txtSummary.Text = _
- "150 หน่วยแรก = " & Format(FirstUnit, "#,##0.00") & vbCrLf & _
- "250 หน่วยต่อไป = " & Format(SecondUnit, "#,##0.00") & vbCrLf & _
- (Val(txtUnit.Text) - 400) & " หน่วยที่เหลือ = " & Format(ThirdUnit, "#,##0.00") & vbCrLf & _
- "==================" & vbCrLf & _
- "รวมจำนวนเงิน = " & Format(SumElectricCost, "#,##0.00") & vbCrLf & _
- "ค่าบริการ = " & Format(38.22, "#,##0.00") & vbCrLf & _
- "ค่า FT = " & Format(SumFT, "#,##0.00") & vbCrLf & _
- "==================" & vbCrLf & _
- "รวมเงินค่าไฟฟ้า = " & Format(SumElectricCost + SumFT + 38.22, "#,##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 = "636"
- txtFT.Text = "-0.1160"
- txtSummary.Text = ""
-
- End Sub
- Private Sub txtFT_GotFocus()
- ' ฟังค์ชั่นนี้อยู่ใน modFunction เพื่อเลือกข้อมูลใน Text Box ทั้งหมด
- Call HLText(txtFT)
- End Sub
- Private Sub cmdExit_Click()
- Set frmCalElectrical = Nothing
- End
- End Sub
- Private Sub txtFT_KeyDown(KeyCode As Integer, Shift As Integer)
- If KeyCode = vbKeyDown Then Sendkeys "{TAB}"
- If KeyCode = vbKeyUp Then Sendkeys "+{TAB}"
- 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
- Private Sub txtUnit_GotFocus()
- Call HLText(txtUnit)
- End Sub
- Private Sub txtUnit_KeyDown(KeyCode As Integer, Shift As Integer)
- If KeyCode = vbKeyDown Then Sendkeys "{TAB}"
- If KeyCode = vbKeyUp Then Sendkeys "+{TAB}"
- End Sub
- Private Sub txtPowerCost_KeyDown(KeyCode As Integer, Shift As Integer)
- If KeyCode = vbKeyDown Then Sendkeys "{TAB}"
- If KeyCode = vbKeyUp Then Sendkeys "+{TAB}"
- End Sub
- Private Sub txtPowerCost_KeyPress(KeyAscii As Integer)
- If KeyAscii = vbKeyReturn Then
- KeyAscii = 0
- Sendkeys "{TAB}"
- End If
- End Sub
- Private Sub cmdCalElectric_KeyDown(KeyCode As Integer, Shift As Integer)
- If KeyCode = vbKeyDown Then Sendkeys "{TAB}"
- If KeyCode = vbKeyUp Then Sendkeys "+{TAB}"
- End Sub
คัดลอกไปที่คลิปบอร์ด
ส่วนโมดูลใน VB6 จะประกอบด้วยฟังค์ชั่นในการกดคีย์ ...
- 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
- '/ แก้ปัญหาฟังค์ชั่น SendKeys ใน Windows 8 64 บิต
- Public Sub Sendkeys(Text As String, Optional Wait As Boolean = False)
- Dim WshShell As Object
- Set WshShell = CreateObject("Wscript.shell")
- WshShell.Sendkeys Text, Wait
- Set WshShell = Nothing
- End Sub
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับ VB6 และ VB.NET (2010) ได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|