Em chào Bác huuthang_bd. Em vận dụng công thức của Bác vào bài toán của em thấy nó gần đúng. Nhưng còn ô em tô đỏ làm không ra, Bác vui lòng giúp em với không biết em sai chỗ nào ạ. Em cảm ơn Bác rất nhiều.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
Bạn phải nêu cụ thể bạn muốn tính toán như thế nào chứ tôi đã biết bạn muốn tính như thế nào đâu mà biết "ra" hay "không ra".Em chào Bác huuthang_bd. Em vận dụng công thức của Bác vào bài toán của em thấy nó gần đúng. Nhưng còn ô em tô đỏ làm không ra, Bác vui lòng giúp em với không biết em sai chỗ nào ạ. Em cảm ơn Bác rất nhiều.
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.Bạn phải nêu cụ thể bạn muốn tính toán như thế nào chứ tôi đã biết bạn muốn tính như thế nào đâu mà biết "ra" hay "không ra".
Bạn có thể dùng chung công thức này cho các cộtDạ, 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 ạ.
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))
Dạ, em cảm ơn Thầy, để tối về em làm thử.Bạn có thể dùng chung công thức này cho các cột
Mã: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))
cái này bác cho cái VBA được không ạ, đang cầnLink này chậm thật, lúc ẩn lúc hiện (http://www.uploadgeek.com/uploads456/0/Vd_sotien.png)
đã up file bạn mở xem sao
Gửi file hình lên GPE bị thu nhỏ, Gửi file nén vậy (kèm theo),
chào bạn, với Function TienPhat bạn có thể điều chỉnh thêm VBA trên nếu mình không có một trong các mệnh giá 500000, 200000, 100000, 50000, 20000, 10000, 5000, 2000, 1000 thì công thức vẫn tính được mà không phát sinh lỗi ạ.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)
Hàm có 3 đối số:Mã: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
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.000x4 + 500.000x1 + 500.000x1 + 500.000x2 + 500.000x1|
3|Trường hợp 2|
600.000|600.000 = 500.000x1 + 500.000x1|
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
Bạn khai báo mệnh giá trong varTienMã: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
Ví dụ 1: mệnh giá nhỏ nhất 1.000
Ví dụ 2: mệnh giá nhỏ nhất 200Mã:= Array(500000, 200000, 100000, 50000, 20000, 10000, 5000, 2000, 1000)
Mã:= Array(500000, 200000, 100000, 50000, 20000, 10000, 5000, 2000, 1000, 500, 200)
11.250.000 | |
500.000 | 22 |
200.000 | 1 |
100.000 | 0 |
- | #VALUE! |
20.000 | #VALUE! |
10.000 | #VALUE! |
5.000 | #VALUE! |
2.000 | #VALUE! |
1.000 | #VALUE! |
500 | #VALUE! |
Nên gởi file với dữ liệu và yêu cầuchào bạn, với Function TienPhat bạn có thể điều chỉnh thêm VBA trên nếu mình không có một trong các mệnh giá 500000, 200000, 100000, 50000, 20000, 10000, 5000, 2000, 1000 thì công thức vẫn tính được mà không phát sinh lỗi ạ.
ví dụ:
11.250.000 500.000 22200.000 1100.000 0- #VALUE!20.000 #VALUE!10.000 #VALUE!5.000 #VALUE!2.000 #VALUE!1.000 #VALUE!500 #VALUE!
Mình có file sau kính nhờ anh em nghiên cứu giúp ạ, code mình xin copy của bác @phamduylong, nhờ anh em chỉnh giúp code.Nên gởi file với dữ liệu và yêu cầu
Bạn thử xem được không?Mình có file sau kính nhờ anh em nghiên cứu giúp ạ, code mình xin copy của bác @phamduylong, nhờ anh em chỉnh giúp code.
Cụ thể mình có ghi yêu cầu tại ví dụ 2 trong file Excel mình đã dính kèm bên dưới.
code:
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
- Với Function "TienPhat" nhờ anh em điều chỉnh giúp nếu mình không có một trong các mệnh giá 500.000, 200.000, 100.000, 50.000, 20.000, 10.000, 5.000, 2.000, 1.000 thì công thức vẫn tính được mà không phát sinh lỗi ạ.
Function DoiTien(SoTien As Currency, LoaiTien As Long, RngLoaiTien As Range) As Integer
Dim Cell As Range
For Each Cell In RngLoaiTien
If Cell.Value > 0 Then
DoiTien = Int(SoTien / Cell.Value)
Else
DoiTien = 0
End If
'Tinh so tien con lai
SoTien = SoTien - DoiTien * Cell.Value
'Neu dung loai tien dang quy doi thi thoat vong lap
If Cell.Value = LoaiTien Then
Exit For
End If
Next Cell
End Function
Thêm chức năng tính số tiền còn dư sau khi chia cho các mệnh giáMình có file sau kính nhờ anh em nghiên cứu giúp ạ, code mình xin copy của bác @phamduylong, nhờ anh em chỉnh giúp code.
Cụ thể mình có ghi yêu cầu tại ví dụ 2 trong file Excel mình đã dính kèm bên dưới.
code:
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
- Với Function "TienPhat" nhờ anh em điều chỉnh giúp nếu mình không có một trong các mệnh giá 500.000, 200.000, 100.000, 50.000, 20.000, 10.000, 5.000, 2.000, 1.000 thì công thức vẫn tính được mà không phát sinh lỗi ạ.
Function SoToTien(rng As Range, SoTien As Long, Optional LoaiTien As Long = 1020213112) As Long
'SoToTien: Tính so to tien theo loai Menh Gia
'rng: Vùng du lieu cac loai Menh Gia có thu tu tu cao den thap, theo dinh dang "Range"
'SoTien: So tien can qui doi ve cac loai Menh Gia
'LoaiTien: loai Menh Gia can tinh so to tien =SoToTien($B$4:$B$13,$C$2,B4)
'Neu bo trong tham so "LoaiTien", SoToTien la so tien du =SoToTien($B$4:$B$13,$C$2)
If LoaiTien = Empty Then Exit Function
Dim sRow As Long, iTien As Long, i As Long, tmp As Long
sRow = rng.Cells.Count
For i = 1 To sRow
iTien = rng(i, 1)
If iTien <> Empty Then
SoToTien = SoTien \ iTien
If iTien = LoaiTien Then Exit For
SoTien = SoTien - iTien * SoToTien
End If
Next
If LoaiTien = 1020213112 Then SoToTien = SoTien
End Function
MÌNH ĐÃ DOWN FILE EXCEL VỀ NHƯNG KHI BẤM VÀO CHO PHÉP SỬA THÌ BỊ LỖI TOÀN BỘ, CÓ THỂ CHỈ MÌNH CÁCH DÙNG ĐƯỢC KHÔNG?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!
Thân.PHP: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
Bạn ơi có thể cho mình xin file đk k ạ ? Khicon241292@gmail.comVậ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.