cần tách tên + số tiền thành nhiều khoản nhỏ

Liên hệ QC

titanic

Thành viên hoạt động
Tham gia
25/5/10
Bài viết
161
Được thích
11
chào anh/chi
em có 1 list DATA tiền nhân viên. em cần tách tên và số tiền ra thành nhiều khoan tiền nhỏ
các khoản tiền như sau : 500 200 100 50 10
vd: tên - số tiền
nguyên thanh - 610
em cần tách ra như sau :
nguyễn thanh - 500
nguyễn thanh - 100
nguyễn thanh - 10
----------------------------
nếu số tiền lẻ nhỏ hơn 10k thì cộng vào 10k
vd: lâm thanh sang - 325
tách thành
lâm thanh sang - 200
lâm thanh sang - 100
lâm thanh sang - 10
lâm thanh sang - 15
em có gửi file đính kèm. a/e xem giup em .
cám ơn
 

File đính kèm

  • tach so tien thanh nhieu menh gia nho.xlsx
    12.4 KB · Đọc: 18
chào anh/chi
em có 1 list DATA tiền nhân viên. em cần tách tên và số tiền ra thành nhiều khoan tiền nhỏ
các khoản tiền như sau : 500 200 100 50 10
vd: tên - số tiền
nguyên thanh - 610
em cần tách ra như sau :
nguyễn thanh - 500
nguyễn thanh - 100
nguyễn thanh - 10
----------------------------
nếu số tiền lẻ nhỏ hơn 10k thì cộng vào 10k
vd: lâm thanh sang - 325
tách thành
lâm thanh sang - 200
lâm thanh sang - 100
lâm thanh sang - 10
lâm thanh sang - 15
em có gửi file đính kèm. a/e xem giup em .
cám ơn
Yêu cầu không có mệnh giá 20 mà sao trong file mẫu lại có số 20 là sao?
 
Upvote 0
Mình thử công thức cho vui
H3=A3
I3=LOOKUP(B3,{10000,50000,100000,200000,500000})
H4=IF(SUMIF($H$3:H3,H3,$I$3:I3)=VLOOKUP(H3,$A$3:$B$23,2,0),INDEX($A$3:$A$23,MATCH(H3,$A$3:$A$23,0)+1),H3)
I4=LOOKUP(VLOOKUP(H4,$A$3:$B$23,2,0)-SUMIF($H$3:H3,H4,$I$3:I3),{10000,50000,100000,200000,500000})
Kéo từ dòng 4 xuống đến khi gặp lỗi #REF
 
Upvote 0
chào anh/chi
em có 1 list DATA tiền nhân viên. em cần tách tên và số tiền ra thành nhiều khoan tiền nhỏ
các khoản tiền như sau : 500 200 100 50 10
vd: tên - số tiền
nguyên thanh - 610
em cần tách ra như sau :
nguyễn thanh - 500
nguyễn thanh - 100
nguyễn thanh - 10
----------------------------
nếu số tiền lẻ nhỏ hơn 10k thì cộng vào 10k
vd: lâm thanh sang - 325
tách thành
lâm thanh sang - 200
lâm thanh sang - 100
lâm thanh sang - 10
lâm thanh sang - 15
em có gửi file đính kèm. a/e xem giup em .
cám ơn
Bạn xem file, dùng công thức.
 

File đính kèm

  • Tach tien.xlsx
    19.6 KB · Đọc: 26
Upvote 0
macro không hoạt động . chưa biết lỗi phát sinh chỗ nào . bạn xem lại file giúp . cám ơn
Bài đã được tự động gộp:

Bạn xem file, dùng công thức.
cám ơn bạn rất nhiều . kết quả rất chuẩn. nhưng mình có khoản 300 dòng họ tên và số tiền. bạn giúp mình tao công thức dài chúc. file đó mình ví dụ nên kg làm dai lăm.
Bài đã được tự động gộp:

macro không hoạt động . chưa biết lỗi phát sinh chỗ nào . bạn xem lại file giúp . cám ơn
Bài đã được tự động gộp:


cám ơn bạn rất nhiều . kết quả rất chuẩn. minh copy được ra thành nhiều dòng rồi.
 
Lần chỉnh sửa cuối:
Upvote 0
----------------------------
nếu số tiền lẻ nhỏ hơn 10k thì cộng vào 10k

không có 10 thì cộng vào 50?

Tôi viết cho cái hàm tách số thành mảng. Chỗ còn lại tự làm thử xem. Nếu bí thì hỏi tiếp.
Mã:
Function TachMenhGia(ByVal soTien As Long) As Variant
Dim kq() As Integer, menhGia As Variant
Dim kqStr As String
Dim i As Integer, j As Integer
menhGia = [ { 500, 200, 100, 50, 10 } ]
For i = LBound(menhGia) To UBound(menhGia)
    For j = 1 To soTien \ menhGia(i) ' ghi lại số lần của mỗi mệnh giá
        kqStr = kqStr & " " & menhGia(i)
    Next j
    soTien = soTien Mod menhGia(i) ' số dư
Next i
ReDim kq(1 To Len(kqStr) / 2 + 1) ' tạo mảng tạm thời. lớn đủ để chứa kết quả
i = 0
For Each menhGia In Split(Trim(kqStr), " ") ' chuyển chuỗi thành array và cho vào mảng
    i = i + 1
    kq(i) = CInt(menhGia)
Next menhGia
If i < 1 Then i = 1 ' nếu số tiền ban đầu nhỏ hơn đơn vị nhỏ nhất thì mảng sẽ trống, tạm lập 1 phần tử
ReDim Preserve kq(1 To i) ' túm gọn cho đúng số phân tử
kq(i) = kq(i) + soTien ' cộng số dư vào mệnh giá nhỏ nhất
TachMenhGia = kq
End Function

Sub t()
For Each x In TachMenhGia(610)
Debug.Print x
Next x
End Sub

kết quả:
500
100
10
 
Lần chỉnh sửa cuối:
Upvote 0
Cải tiến 1 tí (lúc nãy còn say ăn cá Bỉ cho nên chưa tỉnh táo):
Mã:
Function TachMenhGia(ByVal soTien As Long) As Variant
Dim kq() As Integer, menhGia As Variant
Dim num As Integer
ReDim kq(1 To soTien \ 500 + 10)
For Each menhGia In [ { 500, 200, 100, 50, 10 } ]
    Do While soTien >= menhGia ' ghi lai moi menh gia
        num = num + 1
        kq(num) = menhGia
        soTien = soTien - menhGia
    Loop
Next menhGia
If num < 1 Then num = 1
ReDim Preserve kq(1 To num)
kq(num) = kq(num) + soTien ' cong so du vao menh gia cuoi
TachMenhGia = kq
End Function
 
Upvote 0
nếu số tiền lẻ nhỏ hơn 10k thì cộng vào 10k
vd: lâm thanh sang - 325
tách thành
lâm thanh sang - 200
lâm thanh sang - 100
lâm thanh sang - 10
lâm thanh sang - 15
Tôi là người "khó tính" nên kiểu mô tả như thế không cho tôi sự chắc chắn 100%.
Đã có < 10 thì nên phát biểu qui tắc cho tất cả các mệnh giá chứ không chỉ cho mệnh giá 10. Bởi nếu không có mệnh giá 10 thì sao? Có gộp không? Không có 10 thì gộp vào không khí? Mô tả không nói rõ. Chỉ nói là vd. 515 thì tách thành 500 và 15. Nhưng nếu là 1005, 705, 305, 155 thì tách thành 500, 500, 5 - 500, 200, 5 - 200, 100, 5 - 100, 50, 5 hay thành 500, 505 - 500, 205 - 200, 105 - 100, 55?

Tức là nếu có < 10 thì:
1. Nếu mệnh giá trước cuối là 10 thì gộp với mệnh giá cuối, ngược lại không gộp.
2. Luôn gộp với mệnh giá trước cuối.

Trường hợp nào?
 
Lần chỉnh sửa cuối:
Upvote 0
chào anh/chi
em có 1 list DATA tiền nhân viên. em cần tách tên và số tiền ra thành nhiều khoan tiền nhỏ
các khoản tiền như sau : 500 200 100 50 10
vd: tên - số tiền
nguyên thanh - 610
em cần tách ra như sau :
nguyễn thanh - 500
nguyễn thanh - 100
nguyễn thanh - 10
----------------------------
nếu số tiền lẻ nhỏ hơn 10k thì cộng vào 10k
vd: lâm thanh sang - 325
tách thành
lâm thanh sang - 200
lâm thanh sang - 100
lâm thanh sang - 10
lâm thanh sang - 15
em có gửi file đính kèm. a/e xem giup em .
cám ơn
Theo như cách hiểu của @batman1 và mình thì sẽ có trường hợp tách sẽ nhỏ hơn 10 và mệnh giá cuối không có 10 thì sẽ để như thế nào, vd 305 sẽ tách thành 200-100-5 hay 200-105 hay làm cho nó thành 10 và cộng vào cuối thành 200-50-10-10-10-10-15, rất mẫu thuận vì chủ thớt không vú dụ với mấy trường hợp đó (lẻ <10). Bài của mình là luôn cộng mệnh giá < 10 vào mệnh giá cuối theo trường hợp 2 của @batman1 .Bạn nhấn vào mũi tên trên sheet đã gán macro nhé.
Mã:
Sub tacsh()
Dim a As Long, d, i, j As Integer, ar()
ReDim ar(1 To 5000, 1 To 2)
d = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
For i = 3 To d
a = Sheet1.Cells(i, "B")
For Each m In [{500000,200000,100000,50000,10000}]
    Do Until a < m
            j = j + 1
             ar(j, 2) = m
            ar(j, 1) = Sheet1.Cells(i, "A")
            a = a - m
    Loop
Next m
        ar(j, 2) = ar(j, 2) + a
Next i
Sheet1.[I3].Resize(j, 2) = ar
End Sub
 

File đính kèm

  • tach so tien thanh nhieu menh gia nho.xlsm
    19.7 KB · Đọc: 4
Upvote 0
Theo như cách hiểu của @batman1 và mình thì sẽ có trường hợp tách sẽ nhỏ hơn 10 và mệnh giá cuối không có 10 thì sẽ để như thế nào, vd 305 sẽ tách thành 200-100-5 hay 200-105 hay làm cho nó thành 10 và cộng vào cuối thành 200-50-10-10-10-10-15, rất mẫu thuận vì chủ thớt không vú dụ với mấy trường hợp đó (lẻ <10). Bài của mình là luôn cộng mệnh giá < 10 vào mệnh giá cuối theo trường hợp 2 của @batman1 .Bạn nhấn vào mũi tên trên sheet đã gán macro nhé.
Mã:
Sub tacsh()
Dim a As Long, d, i, j As Integer, ar()
ReDim ar(1 To 5000, 1 To 2)
d = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
For i = 3 To d
a = Sheet1.Cells(i, "B")
For Each m In [{500000,200000,100000,50000,10000}]
    Do Until a < m
            j = j + 1
             ar(j, 2) = m
            ar(j, 1) = Sheet1.Cells(i, "A")
            a = a - m
    Loop
Next m
        ar(j, 2) = ar(j, 2) + a
Next i
Sheet1.[I3].Resize(j, 2) = ar
End Sub

Code này không vững. Gặp số tiền nhỏ hơn 10000 thì nó sẽ "Run-time error '9'"
Để ý bài #12, có môt dòng tôi chú như thế này:
nếu số tiền ban đầu nhỏ hơn đơn vị nhỏ nhất thì mảng sẽ trống, tạm lập 1 phần tử

(bài #12, #13 đã có điều kiện là số lẻ sau cùng sẽ cộng vào phần cuối cùng của nhóm)
 
Upvote 0
Code này không vững. Gặp số tiền nhỏ hơn 10000 thì nó sẽ "Run-time error '9'"
Để ý bài #12, có môt dòng tôi chú như thế này:
nếu số tiền ban đầu nhỏ hơn đơn vị nhỏ nhất thì mảng sẽ trống, tạm lập 1 phần tử

(bài #12, #13 đã có điều kiện là số lẻ sau cùng sẽ cộng vào phần cuối cùng của nhóm)
Cho bạn thêm cách làm bằng công thức, mệnh giá nhỏ hơn 10.000 sẽ cộng dồn với mệnh giá nhỏ nhất trước đó!!!
 

File đính kèm

  • Tach tien.xlsx
    19.4 KB · Đọc: 11
Upvote 0
Cho bạn thêm cách làm bằng công thức, mệnh giá nhỏ hơn 10.000 sẽ cộng dồn với mệnh giá nhỏ nhất trước đó!!!
Nếu tôi không lầm thì họ không có mệnh giá 20000. Có thể ai đó cấm họ dùng
------
Theo tôi cứ làm bình thường với các hàm "cơ bản" thôi.
Công thức chỉ cho F2 và G2 -> chọn F2:G2 -> kéo xuống tới khi gặp lỗi.

Cũng là một con bò mộng :D

Nhưng thôi, làm một lần, không suy nghĩ nhiều.
 

File đính kèm

  • tach so tien thanh nhieu menh gia nho.xlsx
    16.9 KB · Đọc: 12
Lần chỉnh sửa cuối:
Upvote 0
Nếu tôi không lầm thì họ không có mệnh giá 20000. Có thể ai đó cấm họ dùng
------
Theo tôi cứ làm bình thường với các hàm "cơ bản" thôi.
Công thức chỉ cho F2 và G2 -> chọn F2:G2 -> kéo xuống tới khi gặp lỗi.

Cũng là một con bò mộng :D

Nhưng thôi, làm một lần, không suy nghĩ nhiều.
Tôi không để ý đúng là thiếu mất mệnh giá 20000. Bỏ ra cũng được, nhưng để vậy luôn cho đủ bộ.
 
Upvote 0
chào anh/chi
em có 1 list DATA tiền nhân viên. em cần tách tên và số tiền ra thành nhiều khoan tiền nhỏ
các khoản tiền như sau : 500 200 100 50 10
vd: tên - số tiền
nguyên thanh - 610
em cần tách ra như sau :
nguyễn thanh - 500
nguyễn thanh - 100
nguyễn thanh - 10
----------------------------
nếu số tiền lẻ nhỏ hơn 10k thì cộng vào 10k
vd: lâm thanh sang - 325
tách thành
lâm thanh sang - 200
lâm thanh sang - 100
lâm thanh sang - 10
lâm thanh sang - 15
em có gửi file đính kèm. a/e xem giup em .
cám ơn
Góp vui thêm công thức
Mã:
F3 =IF(SUMIF(F$2:F2,F2,G$2:G2)=N(VLOOKUP(F2,A$2:B$100,2,0)),LOOKUP(2,1/(A$2:A$100=F2),A$3:A$101),F2)
G3 =IF(VLOOKUP(VLOOKUP(F3,A$3:B$100,2,0)-SUMIF(F$2:F2,F3,G$2:G2),{0;1;5;10;20;50}*10^4,1)+10^4>VLOOKUP(F3,A$3:B$100,2,0)-SUMIF(F$2:F2,F3,G$2:G2),VLOOKUP(F3,A$3:B$100,2,0)-SUMIF(F$2:F2,F3,G$2:G2),VLOOKUP(VLOOKUP(F3,A$3:B$100,2,0)-SUMIF(F$2:F2,F3,G$2:G2),{1;5;10;20;50}*10^4,1))
 

File đính kèm

  • tach so tien theomenh gia.xlsx
    15.7 KB · Đọc: 6
Upvote 0
Web KT
Back
Top Bottom