hàm tự tạo tính tiền nước

  • Thread starter Thread starter hung1
  • Ngày gửi Ngày gửi
Liên hệ QC

hung1

Thành viên mới
Tham gia
12/12/08
Bài viết
12
Được thích
2
CÁc anh chị vui lòng giúp đỡ xem hàm này bị sai ở chỗ nào mà hiễn lỗi #value!. cám ơn nhiều

Function tiennuoc2011(dm As Integer, sd As Integer, loai As String)

If loai <> "" Then
tt = sd * 15525
tiennuoc2011 = tt

ElseIf loai = "" Then
If sd <= dm Then
tt = sd * 5060
tiennuoc2011 = tt

ElseIf (sd > dm) And (sd - dm - ((dm / 4) * 2)) < 0 Then
tt = (dm * 5060) + ((sd - dm) * 9545)
tiennuoc2011 = tt
ElseIf sd > dm Then
tt = (dm * 5060) + (((dm / 4) * 2) * 9545) + ((sd - dm - ((dm / 4) * 2)) * 12075)
tiennuoc2011 = tt
End If
End If
End Function
 

File đính kèm

Bạn thử với cái ni xem sao

PHP:
Function TienNuoc2011(DM As Long, SD As Long, Loai As String)
 Dim Temp As Double
  
 If Loai <> "" Then
    TienNuoc2011 = SD * 15525
 Else
    Temp = (DM / 4) * 2   '???'
    If SD <= DM Then
        TienNuoc2011 = SD * 5060
    ElseIf (SD > DM) And (SD - DM - Temp) < 0 Then
        TienNuoc2011 = (DM * 5060) + ((SD - DM) * 9545)
    ElseIf SD > DM Then
        TienNuoc2011 = (DM * 5060) + (Temp * 9545) + ((SD - DM - Temp) * 12075)
    End If
 End If
End Function
 
Upvote 0
CÁc anh chị vui lòng giúp đỡ xem hàm này bị sai ở chỗ nào mà hiễn lỗi #value!. cám ơn nhiều
Sửa cái này
PHP:
Function tiennuoc2011(dm As Integer, sd As Integer, loai As String)
thành:
PHP:
Function tiennuoc2011(dm As Double, sd As Double, loai As String)
thử xem
 
Upvote 0
Công thức trên sheet của tác giả:
=IF(G4<>"";J4*(13500+675+1350);IF(J4<=$F4;J4*5060;IF(AND(J4>F4;((J4-F4-((F4/4)*2)))<0);(F4*5060)+((J4-F4)*(9545));IF(J4>F4;F4*(5060)+(((F4/4)*2)*(9545))+((J4-F4-((F4/4)*2))*12075)))))

- Tại sao để 13500+675+1350 mà không cộng luôn thành 15525?
- Tại sao để ((F4/4)*2) mà không phải F4/2?
- Tại sao để ((J4-F4-((F4/4)*2))) mà không phải J4-F4*1.5?

Thay 3 cái tại sao vào thì công thức ngắn hơn 1 miếng:

=IF(G4<>"";J4*15525;IF(J4<=$F4;J4*5060;IF(AND(J4>F4;J4<F4*1,5);F4*5060+(J4-F4)*(9545);IF(J4>F4;F4*5060+F4/2*9545+(J4-F4*1,5)*12075))))

Bỏ bớt 1 If, ngắn thêm 1 miếng nữa:

=IF(G4<>"";J4*15525;IF(J4<=$F4;J4*5060;IF(AND(J4>F4;J4<F4*1,5);F4*5060+(J4-F4)*9545;F4*5060+F4/2*9545+(J4-F4*1,5)*12075)))

Nếu thay If bằng min, max, thì ngắn hơn nữa:

=IF(G4<>"";J4*15525;MIN(J4;F4*1)*5060+MAX(MIN(J4-F4;F4*0,5);0)*9545+MAX(J4-F4*1,5;0)*12075)


Từ 2 công thức rút gọn kia viết thành hàm VBA cũng dễ dàng hơn:

PHP:
Function tiennuoc2011(dm As Long, sd As Long, loai As String)
   If loai <> "" Then
         tt = sd * 15525
   Else
     If sd <= dm Then
      tt = sd * 5060
    
      ElseIf sd > dm And sd < dm * 1.5 Then
      tt = (dm * 5060) + ((sd - dm) * 9545)
      ElseIf sd > dm * 1.5 Then
       tt = dm * 5060 + dm / 2 * 9545 + (sd - dm * 1.5) * 12075
      End If
    End If
    tiennuoc2011 = tt
End Function
ndu đã viết:
Sửa cái này: As Integer thành As Double xem sao

Lỗi hàm của tác giả là lỗi suy luận sai, dùng If mà loại trừ không đúng cách. Long cũng được rồi, khỏi Double.
 
Lần chỉnh sửa cuối:
Upvote 0
Lỗi hàm của tác giả là lỗi suy luận sai, dùng If mà loại trừ không đúng cách. Long cũng được rồi, khỏi Double.
Thật ra em không quan tâm đến việc tác giả suy luận cái gì... chỉ biết hàm này bị lỗi "Overflow" thì chắc chắn đã khai báo biến sai kiểu rồi ---> Sửa thành Double cho chắc ăn (phòng trường hợp muốn tính số lẻ)
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom