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

Liên hệ QC
to: huuthang_bd

em thấy hình như chưa ổn anh ơi, anh coi file đính kèm dùm em, tiền quỹ nhìu hơn tiền lương, số lượng tiền theo loại không đủ chia thì nó sẽ cho biết thiếu bao nhiu chứ đằng này.... nguy hiểm quá
Bạn xem lại xem bạn đã fill công thức đúng chưa mà đi thắc mắc. Bó tay.
 
sao mình vẫn không hiểu được công thức này
 
mình thấy cách tính tiền lẻ này hay mình có dow về nhưng công thức không thấy gì hết
 
anh chị em co file cụ thể cho em xin ạ ...mới học chưa biết nhập công thức ạ
 
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
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.
 

File đính kèm

  • Giaichi1.xlsx
    65.1 KB · Đọc: 4
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.
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 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".
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 ạ.
 

File đính kèm

  • GiaichiHOANCHINH.xlsx
    72.7 KB · Đọc: 14
Lần chỉnh sửa cuố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
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á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)
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
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.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

Mã:
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
Mã:
 = Array(500000, 200000, 100000, 50000, 20000, 10000, 5000, 2000, 1000)
Ví dụ 2: mệnh giá nhỏ nhất 200
Mã:
 = Array(500000, 200000, 100000, 50000, 20000, 10000, 5000, 2000, 1000, 500, 200)
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 ạ.
ví dụ:
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!​
 
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 ạ.
ví dụ:
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ầu
 
Nên gởi file với dữ liệu và yêu cầu
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 ạ.
 

File đính kèm

  • doitien.xlsm
    15.9 KB · Đọc: 7
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 ạ.
Bạn thử xem được không?
PHP:
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
 
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 ạ.
Thêm chức năng tính số tiền còn dư sau khi chia cho các mệnh giá
Mã:
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
 

File đính kèm

  • doitien.xlsm
    16.1 KB · Đọc: 24
Quá chất, chân thành cảm ơn bác @HieuCD, bác @vanthinh3101 rất nhiều nha! 2 bác viết lệnh trên cả tuyệt vời ấy, rất chất lượng, một lần nữa cảm ơn 2 bác rất rất là nhiều.
 
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!
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
Thân.
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?
 
Web KT
Back
Top Bottom