Công thức tính số tờ tiền

Chia sẻ bởi:hands
★★★★★
Quảng cáo

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
Next

ToTien = 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 Function

Hà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ếu

Cá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ãnh

Function 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 Function

Bạ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ự
Khóa học SprinGO phù hợp

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
★★★★★ 5 ★ 1 👤 1 ▥ 0
Quảng cáo

Bạn nên đọc

Bình luận

Quảng cáo

Cũ vẫn chất

Xem thêm