Công thức tính số tờ tiền
Chào cả nhà. Mình đang phải chia lương cho moi người trong công ty. Có cách nào để tính được loại tiền nào cần bao nhiều tờ để thuận lợi cho việc chia lương không nhỉ. Mong mọi người chỉ giáo.
VD: Tổng lương là: 1.024.000 chia cho hai người là 752.000 và 272.000 thì tính ra được số tờ tối ưu là 9 tờ 100,000; 2 tờ 50,000; 1 tờ 20,000 và 2 tờ 2,000.
Nhờ cả nhà giúp mình nhe! Cảm ơn.
Một cách còn hơi thô & xài hàm mảng, như sau
Option Explicit: Option Base 1
[B]Function ToTien(SoTien As Double) As Variant[/B]
'500; 200; 100; 50; 20; 10; 5; 2; 1
If SoTien / 1000 > SoTien 1000 Then
Else
SoTien = SoTien 1000: Dim SoChia, jJ As Byte
ReDim SoTo(1, 9) As Byte
End If
For jJ = 1 To 9
SoTo(1, jJ) = 0
SoChia = Choose(jJ, 500, 200, 100, 50, 20, 10, 5, 2, 1)
SoTo(1, jJ) = SoTien SoChia
SoTien = SoTien Mod SoChia
Next
ToTien = SoTo
[B]End Function[/B]
Và dưới đây là kết quả:
|A|B|C|D|E|F|G|H|I|J
|SoTien|500.000|200.000|100.000|50.000|20.000|10.000|5.000|2.000|1.000
|1.250.000|2|1|0|1|0|0|0|0|0
|1.605.000|3|0|1|0|0|0|1|0|0
|1.960.000|3|2|0|1|0|1|0|0|0
|2.315.000|4|1|1|0|0|1|1|0|0
|73.000|0|0|0|1|1|0|0|1|1
|3.025.000|6|0|0|0|1|0|1|0|0
|3.381.000|6|1|1|1|1|1|0|0|1
|8.135.000|16|0|1|0|1|1|1|0|0
|9.099.000|18|0|0|1|2|0|1|2|0
|6.789.000|13|1|0|1|1|1|1|2|0
Chú í: Muốn có kết quả của hàm chỉ ra số tờ tiền của =1.250.000 ta phải chọn tất thảy 9 ô trong hàng từ , Sau khi nhập tên hàm & địa chỉ iêu cầu, ta phải kết thúc bằng tổ hợp 3 fím
Hàm chỉ viết cho số tiền chẵn từ ngàn đồng trở lên; Muốn có tờ mệnh giá nhỏ hơn hãy tự thử sức hay iêu cầu thêm!
Chúc xuân vui vẽ!
www.giaiphapexcel.com/diendan/threads/c%C3%B4ng-th%E1%BB%A9c-t%C3%ADnh-s%E1%BB%91-t%E1%BB%9D-ti%E1%BB%81n.19072/post-133929
Nếu chia cho 1 người thôi thì chẳng vấn đề gì! Nhưng chia cho 2 – 3 – 4 người thì sao?
Em đã chỉnh lại 1 chút trong code nhưng xem ra không vừa ý lắm.
Mọi người xem file nha!
Option Explicit: Option Base 1
Function ToTien(SoTien As Double, Optional Luot As Integer = 2) As Variant
''500; 200; 100; 50; 20; 10; 5; 2; 1
Dim SoChia As Integer, jJ As Byte
ReDim SoTo(1, 10) As Byte
SoTo(1, 10) = (SoTien / 1000) Mod Luot
SoTien = SoTien (1000 * Luot)For jJ = 1 To 9
SoTo(1, jJ) = 0
SoChia = Choose(jJ, 500, 200, 100, 50, 20, 10, 5, 2, 1)
SoTo(1, jJ) = (SoTien SoChia) * Luot
SoTien = SoTien Mod SoChia
NextToTien = SoTo
End Function
Thân.
Cách 1:
Dùng bảng liệt kê số tiền lãnh, mệnh giá tiền (xếp thứ tự từ mệnh giá từ lớn đến nhỏ). Hàm TienPhat sẽ tính số tờ phải trả cho từng mệnh giá.
|A
|
B
|
C
|
D
|
E
|
F
|
G
|
H
|
I
|
J
|
K
|
L
|
M
|
1
|
Bảng kê
|||
2
|
SoTien
|
500000
|
200000
|
100000
|
50000
|
20000
|
10000
|
5000
|
2000
|
1000
|
500
|
200
|
100
|
3
|
2.345.100
|
4
|
1
|
1
|
0
|
2
|
0
|
1
|
0
|
0
|
0
|
0
|
1
|
4
|
600.000
|
1
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
5
|
1.960.000
|
3
|
2
|
0
|
1
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
6
|
2.315.000
|
4
|
1
|
1
|
0
|
0
|
1
|
1
|
0
|
0
|
0
|
0
|
0
|
7
|
73.000
|
0
|
0
|
0
|
1
|
1
|
0
|
0
|
1
|
1
|
0
|
0
|
0
|
8
|
3.025.000
|
6
|
0
|
0
|
0
|
1
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
9
|
3.381.000
|
6
|
1
|
1
|
1
|
1
|
1
|
0
|
0
|
1
|
0
|
0
|
0
|
10
|
8.135.000
|
16
|
0
|
1
|
0
|
1
|
1
|
1
|
0
|
0
|
0
|
0
|
0
|
11
|
9.099.000
|
18
|
0
|
0
|
1
|
2
|
0
|
1
|
2
|
0
|
0
|
0
|
0
|
12
|
6.789.000
|
13
|
1
|
0
|
1
|
1
|
1
|
1
|
2
|
0
|
0
|
0
|
0
|
Công thức tại B2:=tienphat($A3;B$2;$B$2:$I$2)Function TienPhat(SoTien As Long, LoaiTien As Long, RgTien As Range) As Long Dim iTien As Long, i As Long For i = 1 To RgTien.Cells.Count iTien = Application.WorksheetFunction.Index(RgTien, i) TienPhat = SoTien iTien If iTien = LoaiTien Then Exit For SoTien = SoTien - iTien * TienPhat Next End FunctionHàm có 3 đối số:
SoTien: số tiền phải phát
LoaiTien: mệnh giá tiền phát
RgTien: vùng chứa các loại tiền phát
Chú ý: có thể số tiền phát thấp hơn số tiền thực lãnh do khai báo mệnh giá thiếuCách 2:
Dùng cho bảng in số tờ theo từng mệnh giá phải trả, dùng hàm PhatTien.
[|A
|
B
|
C
|
1
||
Số tiền
|
Liệt kê từng mệnh giá
|
2
|Trường hợp 1|
2.345.050
|2.345.050 ≈ 2.345.000 = 500.000×4 + 500.000×1 + 500.000×1 + 500.000×2 + 500.000×1|
3
|Trường hợp 2|
600.000
|600.000 = 500.000×1 + 500.000×1|
Trường hợp 1: số tiền phát > số tiền lãnh
Trường hợp 2: số tiền phát = số tiền lãnhFunction PhatTien(SoTien As Long) As String Dim Tien As Long, soDu As Long, n As Long, nTo As Long Tien = SoTien varTien = Array(500000, 200000, 100000, 50000, 20000, 10000, 5000, 2000, 1000, 500, 200) soDu = SoTien Mod (varTien(UBound(varTien))) If soDu > 0 Then PhatTien = Format(SoTien, "#,##0") & " " & ChrW(8776) & " " & Format(SoTien - soDu, "#,##0") & " = " Else PhatTien = Format(SoTien, "#,##0") & " = " End If For n = 0 To UBound(varTien) nTo = Tien varTien(n) If nTo > 0 Then PhatTien = PhatTien & Format(varTien(i), "#,##0") & "x" & nTo & " + " Tien = Tien - (varTien(n) * nTo) End If Next PhatTien = Left(PhatTien, Len(PhatTien) - 3) End FunctionBạn khai báo mệnh giá trong varTien
Ví dụ 1: mệnh giá nhỏ nhất 1.000= Array(500000, 200000, 100000, 50000, 20000, 10000, 5000, 2000, 1000)Ví dụ 2: mệnh giá nhỏ nhất 200
= Array(500000, 200000, 100000, 50000, 20000, 10000, 5000, 2000, 1000, 500, 200)
Chia lương
Lâu rồi không ghé thăm diễn đàn. Hôm nay vào thấy bài toán này cũng hay hay. Tôi xin mạo muội đưa ra một giải pháp. Mọi người xem thử rồi cho ý kiến nha.
Vui lòng xem file đính kèm
www.giaiphapexcel.com/diendan/threads/c%C3%B4ng-th%E1%BB%A9c-t%C3%ADnh-s%E1%BB%91-t%E1%BB%9D-ti%E1%BB%81n.19072/post-147108
Ít ra phải như thế này mới gọi là CHIA TIỀN được…
giải pháp rất hay… tôi đã thí nghiệm bằng cách thêm người vào để cho tổng số tiền lãnh gần bằng tổng quỷ lương (Quỹ lương = 82.666.500 và tiến lãnh = 82.172.000) —> Kết quả nó chia sạch không bị thiếu tí tiền lẽ nào —> HAY
Các bạn rảnh rổi test thêm trong nhiều trường hợp khác xem (thay đổi tiền lãnh, thay đổi số tờ của từng mệnh giá)…
Cảm ơn bạn nhiềuĐúng là chia hết tiền nhưng không công bằng, chia tiền to trước rồi mới đến tiền nhỏ, lương 10 triệu mà toàn lĩnh tiền 10.000 vì chậm chân thì cũng chán. Làm sao phân bổ được tiền nữa mới ứng dụng vào thực tế được!
Thêm nữa nếu chia kiểu này thì có lẽ cũng không cần đến hỗ trợ của Excel, cứ cầm cục mệnh giá 500.000 "văng" trước, hết lại đến cục nhỏ hơn, bao giờ hết thì thôi.
P/s: Bài toán này còn phải bàn nhiều
Vậy thì xin giử mọi người file này. Không hoàn toàn là công bằng nhưng vẫn có thể chấp nhận được. Có thể áp dụng trong thực tế.
Vui lòng xem file đính kèm.
Dosnet góp một cách chia lương theo % (tiền được chia)/(tổng số tiền). Cách này công bằng hơn !
Cách này công bằng nhưng không phải là tối ưu. Trong trường hợp quỹ tiền mặt lớn, tổng quỹ lương cần chi nhỏ phương pháp này vẫn chia số tiền có mệnh giá thấp trong khi để thừa số tiền có mệnh giá cao. Chưa kể mốt số trường hợp số tiền đem chia lớn hơn số tiền hiện có như trong file đính kèm bên dưới.
Dạ, là em đã có tổng số tiền và tổng số ca phẩu thuật, thủ thuật cho trước, em muốn chia số tổng số tiền đó cho từng nhân viên theo tỉ lệ 100%, 80%, 70%, 50% ( bảng giaichi). Sau đó em qui số tiền của từng nhân viên ra số ca thủ thuật và phẩu thuật ( cho khớp số ca thủ thuật, phẩu thuật cho trước) ra bảng baocao để nộp phòng TCKT ạ. Em cảm ơn Thầy.
Thầy ơi em làm kiểu này cũng tạm ổn, Thầy xem có chỉnh sửa dùm em được không ạ. Dạ ô B16:B18 là nhập số ca vào, cột O, P có thể chỉnh sửa được nếu chia chưa hết số ca thủ thuật, phẩu thuật, tiền thì có thể cho chênh lệch chút ít. Dạ em cảm ơn Thầy huuthang bd ạ.
Bạn có thể dùng chung công thức này cho các cột
H23=MIN(INDEX($D$2:$D$10,COLUMNS($H$21:H$21))-SUM(H$22:H22),INT(($F23-SUMPRODUCT($G$21:G$21,$G23:G23))/H$21))
www.giaiphapexcel.com/diendan/threads/c%C3%B4ng-th%E1%BB%A9c-t%C3%ADnh-s%E1%BB%91-t%E1%BB%9D-ti%E1%BB%81n.19072/post-1002564
Khoá học Trưởng phòng nhân sự
Nguồn nhân lực là một trong Tứ trụ kinh doanh của doanh nghiệp, có tác động tới sự tồn tại và phát triển bền...
Xem khóa học
Bình luận