Kiểm tra hàm tính thuế

Liên hệ QC

kan

Thành viên mới
Tham gia
26/1/08
Bài viết
47
Được thích
6
Mình muốn làm mộ cái hàm tính thuế nhưng biến VBA không cho khai báo biến nhiều thì phải (5 biến), các biến này thay đổi nên kan không biết phải xử lý như thế nào ! nhờ các thành viên trên 4rum kiểm tra và sửa giúp !
Cám ơn nhiều.
 

File đính kèm

  • AB.xls
    28 KB · Đọc: 87
Lỗi là do bạn viết hàm sai thôi, mình thử cho bạn hàm 10 tham số vẫn chạy ngon lành
Mã:
Public Function cong(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
cong = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10
End Function
Cái mà bạn gọi là biến đó phải gọi là tham số chứ không phải là biến.
Bạn phải nói rõ bạn đang làm gì và như thế nào chứ.
 
Lần chỉnh sửa cuối:
Mình muốn làm một cái hàm tính thuế! Nhờ các thành viên trên 4rum kiểm tra và sửa giúp ! Cám ơn nhiều.
(*) Thứ nhất: Bạn phải đi từ dễ đến khó, phải biết bò rồi mới đi chập chững!
Mình luôn khuyên bản thân mình, các khai báo trong chương trình phải tường minh, rõ ràng.
Tuy những biến có kiểu dạng Variant chăng nữa cũng phải ghi vô. Đây mãi là thoái quen tốt hết sức, một khi muốn tiếp cận & làm bạn lâu dài với VBA; Mình không khi nào viết câu lệnh tương tự như:
Dim i, jd As Integer
sau đó dùng i chỉ như là kiểu Integer, hay kiểu Byte vì vòng lặp bên dưới chỉ biến thiên chưa quá 255. Như các nhá lập trình lão luyện khuyên chúng ta trong trường hợp này là

Dim i As Long , jd As Long

(*) Cú pháp hàm của bạn là

Public Function TTN(Kiemtra, DSDA, TDN, namM, namG, namUD, TUD, TNCT) As Double
. . .
End Function


Theo vậy, hàm sẽ nhận 08 (tám) tham số tất thảy.
Nhưng trong trang tính bạn nhập hàm như vậy:
=+TTN($B$4:$B$5,$B$2,$C$2,$D$2,$E$2) Là bạn cung cấp mới hơn nữa tham số; Nếu nó không báo lỗi mới là chuyện lạ!

Hoặc là bạn phải truyền cho cái hàm thân thương của bạn đủ 08 tham số, hay thêm 3 từ Optional lên trước 3 tham số cuối, nếu bạn có lúc nào đó lúc truyền, lúc không truyền các tham số tùy tiện.

Cũng muốn viết lại hàm cho bạn, nhưng thực tình không hiểu nhu cầu tính toán của bạn là gì nữa. Đành chờ hồi âm của bạn vậy!

ĐĐĐ!!!
 
Bạn vui lòng đưa yêu cầu lên đi. Mọi người sẽ giúp.
 
Giúp kiểm tra hàm tính thuế

Cám ơn và xin tiếp thu ý kiến của mọi người đã góp ý !

1. Thực ra kan đang mò mẫm VBA thôi. Nếu mọi người thử nhập hàm kan đã viết (đã gửi kèm theo file) thì sẽ thấy: thì nó chỉ hiện ra cho mình nhập có 5 tham số, nên kan chỉ nhập được 5 tham số, do đó kết quả trong file báo lỗi.

2. Nội dung của hàm này chỉ đơn thuần là tính thuế mà thôi, tuy nhiên ở mỗi khu vực các tham số đều thay đổi nên kan muốn lập 1 cái hàm cho tiện.
(trong file đã gửi là một ví dụ)

(*) Thứ nhất: Bạn phải đi từ dễ đến khó, phải biết bò rồi mới đi chập chững!
Mình luôn khuyên bản thân mình, các khai báo trong chương trình phải tường minh, rõ ràng.
Tuy những biến có kiểu dạng Variant chăng nữa cũng phải ghi vô. Đây mãi là thoái quen tốt hết sức, một khi muốn tiếp cận & làm bạn lâu dài với VBA; Mình không khi nào viết câu lệnh tương tự như:
Dim i, jd As Integer
sau đó dùng i chỉ như là kiểu Integer, hay kiểu Byte vì vòng lặp bên dưới chỉ biến thiên chưa quá 255. Như các nhá lập trình lão luyện khuyên chúng ta trong trường hợp này là

Dim i As Long , jd As Long

(*) Cú pháp hàm của bạn là

Public Function TTN(Kiemtra, DSDA, TDN, namM, namG, namUD, TUD, TNCT) As Double
. . .
End Function

Theo vậy, hàm sẽ nhận 08 (tám) tham số tất thảy.
Nhưng trong trang tính bạn nhập hàm như vậy:
=+TTN($B$4:$B$5,$B$2,$C$2,$D$2,$E$2) Là bạn cung cấp mới hơn nữa tham số; Nếu nó không báo lỗi mới là chuyện lạ!

Hoặc là bạn phải truyền cho cái hàm thân thương của bạn đủ 08 tham số, hay thêm 3 từ Optional lên trước 3 tham số cuối, nếu bạn có lúc nào đó lúc truyền, lúc không truyền các tham số tùy tiện.

Cũng muốn viết lại hàm cho bạn, nhưng thực tình không hiểu nhu cầu tính toán của bạn là gì nữa. Đành chờ hồi âm của bạn vậy!

ĐĐĐ!!!
 

File đính kèm

  • AB.xls
    28 KB · Đọc: 46
Lần chỉnh sửa cuối:
Thật ra hàm của bạn có thể viết như vầy:

PHP:
Public Function TTN(KiemTra, DSDA, TDN, namM, namG, namUD, TUD, TNCT) As Double
1 Dim i, jd As Integer:                       jd = 0
For i = 1 To 40
3    If KiemTra(i) > 0 Then jd = jd + 1
Next i
5 If jd > namM Then TTN = 0
If jd > namM And jd <= namG Then _
    TTN = TNCT * TUD / 2
7 If jd > namUD Then TTN = TDN * TNCT
End Function

Những cái chưa đúng của bạn là :

(1) Tham số DSDA không có xài trong hàm, bạn cố tình đưa vô để làm chi?

(2) Tại sao bạn viết For i=1 to 40 ; Con số 40 này theo mình thấy là số records của trang tính.
Nhưng cú pháp hàm trang trang tính thì lại phải hiểu vùng kiểm tra của record thứ j nào đó là từ ô đầu tiên '$B$4' cho đến ô 'B' thuộc dòng thứ j này
Kết quả jd của bạn bao giờ cũng bằng 36. Dẫn tới việc, hàm sẽ chuyển đến thực thi lệnh đã đánh số 7 nêu trên;

(3) Nhưng trớ trêu là bạn không cung cấp hai thông số TDN & TNCT thì lấy gì cho đứa con của bạn làm tiếp? Mình kiếm đỏ con mắt vẫn không thấy tẹo dấu vết nào của hai tham số trên trong trang tính cả bạn à?!?

Bạn thấy không, do không tường minh mà bạn tự làm khổ chúng mình hơn ngày trời nay đó!
Điều kiện cần là hàm phải đúng cái đã, chứ không phải viết cho oai bằng cách viết tắc ngang cái này, tắc ngang cái kia. Mình khuyên bạn đừng nên bắt chước hoàn toàn mấy cha lập trình chuyên nghiệp ở những chổ như vậy. Chúng ta là những người tự học, & quan trọng là phải hiểu thân phận mình. Không nên đua đòi, rồi chính sự đua đòi đó phản lại chúng ta!

Đây là những lời khó nghe, nhưng mong bạn ráng nghe nha!
 
Kiểm tra lại code

Cám ơn bạn ChanhTQ đã trả lời !
- Thực ra cái này tính bằng công thức thì không có gì đáng noí, vì mình làm nhiều dự án, mà mỗi dự án các tham số đó đều thay đổi nên muốn làm 1 cái hàm cho tiện, nhưng lại mới tập làm quen với VBA
- DSDA ở đây (trong file) là 40 năm, do sau khi viết và kiểm tra hàm thì thấy nó không hiện ra nên mình nhập luôn trong vòng lặp.

- Bạn đã kiểm tra lại hàm bạn viết chưa ? các tham số: KiemTra, DSDA, TDN, namM, namG, namUD, TUD, TNCT có hiện lên đầy đủ trong hàm không ?
Riêng mình đã đưa code bạn viết ở dưới vào thì thấy các tham số trong hàm hiện lên không đẩy đủ => hàm vẫn chưa dùng được.

Thật ra hàm của bạn có thể viết như vầy:

PHP:
Public Function TTN(KiemTra, DSDA, TDN, namM, namG, namUD, TUD, TNCT) As Double
1 Dim i, jd As Integer:                       jd = 0
For i = 1 To 40
3    If KiemTra(i) > 0 Then jd = jd + 1
Next i
5 If jd > namM Then TTN = 0
If jd > namM And jd <= namG Then _
    TTN = TNCT * TUD / 2
7 If jd > namUD Then TTN = TDN * TNCT
End Function

Những cái chưa đúng của bạn là :

(1) Tham số DSDA không có xài trong hàm, bạn cố tình đưa vô để làm chi?

(2) Tại sao bạn viết For i=1 to 40 ; Con số 40 này theo mình thấy là số records của trang tính.
Nhưng cú pháp hàm trang trang tính thì lại phải hiểu vùng kiểm tra của record thứ j nào đó là từ ô đầu tiên '$B$4' cho đến ô 'B' thuộc dòng thứ j này
Kết quả jd của bạn bao giờ cũng bằng 36. Dẫn tới việc, hàm sẽ chuyển đến thực thi lệnh đã đánh số 7 nêu trên;

(3) Nhưng trớ trêu là bạn không cung cấp hai thông số TDN & TNCT thì lấy gì cho đứa con của bạn làm tiếp? Mình kiếm đỏ con mắt vẫn không thấy tẹo dấu vết nào của hai tham số trên trong trang tính cả bạn à?!?

Bạn thấy không, do không tường minh mà bạn tự làm khổ chúng mình hơn ngày trời nay đó!
Điều kiện cần là hàm phải đúng cái đã, chứ không phải viết cho oai bằng cách viết tắc ngang cái này, tắc ngang cái kia. Mình khuyên bạn đừng nên bắt chước hoàn toàn mấy cha lập trình chuyên nghiệp ở những chổ như vậy. Chúng ta là những người tự học, & quan trọng là phải hiểu thân phận mình. Không nên đua đòi, rồi chính sự đua đòi đó phản lại chúng ta!

Đây là những lời khó nghe, nhưng mong bạn ráng nghe nha!
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom