Em nhờ Anh/ Chị trong diễn đàn giúp em với ạ. Em có 1 sheet1 là sheet gốc ( được kết xuất từ phần mềm ), Giờ em muốn kiểm tra số tiền đã thu theo điều kiện ( Tại sheet2 chẳng hạn). Em nhờ anh chị giúp em với ạ, nếu VBA thì càng tốt ạ. Em cảm ơn ạ!
B2 =SUMIF(Sheet1!$C$13:$C$500,A2,Sheet1!$G$13:$G$500)
C2 =SUMIF(Sheet1!$E$13:$E$500,"*"&A2&"*",Sheet1!$H$13:$H$500)
Kết quả đúng là bao nhiêu? nói rỏ cách tínhCông thức ô C2 nó tỉnh tổng 2 dòng anh ah. ( vì các bạn khi nộp tiền đang gộp 2 lệnh, và dòng diễn giải cũng đang để 2 lệnh mà a). Vì vậy, vẫn chưa đúng a ah.
Dạ Anh. Em ví dụ tại sheet1 ở cột A, lệnh 21.B000057: số tiền phải thu là 8.520.000. Thì số đã thu ô H43 ( cũng chính là số tiền đó ạ). Tức là em muốn kiểm tra số tiền phải thu theo lệnh, và số tiền đã thu theo lệnh có khớp nhau ko anh à. Vì hiện tại dòng đã thu các bạn đang gộp ( ví dụ:21.A000057+21.B000057) . Em cảm ơn ạ !Kết quả đúng là bao nhiêu? nói rỏ cách tính
Dạ anh. Trường hợp chưa thu đủ, hoặc thu thiếu, thì em sẽ thêm 1 cột để tính phần chênh lệch số phải thu- số đã thu đó anh. Mục đích của em là để kiểm soát được lệnh nào đã thu đủ, lệnh nào chưa thu, lệnh nào thu thiếu ( và thiếu bao nhiêu). Em cảm ơn ạ!Trường hợp B57 thì dễ, do phải thu là 8.520.000, và đã thu đủ 8.520.000 tại dòng 43.
Những trường hợp thu chưa đủ thì tính sao: VD: B59 phải thu: 5.880.000, đã thu tại dòng 44+45 (gộp A59 và B59) là: 5.340.000 và 4.800.000; cả 2 dòng đều ít hơn 5.880.000, biết cái nào là của B59?
Trừ phi bạn quy định dòng 44: 5.440.000 là của B59, còn lại 5.880.000-5.440.000 = 440.000 là của A59
Dạ Anh: ở đây tính theo mã khách là cột I nữa anh ạ. Ví dụ B59 phải thu theo mã cột I là 4.800.000 và đã thu dòng thứ 45 là đã thu 4.800.000 như vậy là đúng ạ. Tức là sẽ thõa mãn 2 điều kiện là lệnh và mã ( cột I ) anh ạ.Trường hợp B57 thì dễ, do phải thu là 8.520.000, và đã thu đủ 8.520.000 tại dòng 43.
Những trường hợp thu chưa đủ thì tính sao: VD: B59 phải thu: 5.880.000, đã thu tại dòng 44+45 (gộp A59 và B59) là: 5.340.000 và 4.800.000; cả 2 dòng đều ít hơn 5.880.000, biết cái nào là của B59?
Trừ phi bạn quy định dòng 44: 5.440.000 là của B59, còn lại 5.880.000-5.440.000 = 440.000 là của A59
Thêm cột ghi chú kết quảDạ Anh. Em ví dụ tại sheet1 ở cột A, lệnh 21.B000057: số tiền phải thu là 8.520.000. Thì số đã thu ô H43 ( cũng chính là số tiền đó ạ). Tức là em muốn kiểm tra số tiền phải thu theo lệnh, và số tiền đã thu theo lệnh có khớp nhau ko anh à. Vì hiện tại dòng đã thu các bạn đang gộp ( ví dụ:21.A000057+21.B000057) . Em cảm ơn ạ !
Option Explicit
Sub XYZ()
Dim sArr(), dArr(), res(), dic As Object
Dim sRow&, sR&, n&, i&, ct$, iKey$, tmp#, tong#
Set dic = CreateObject("scripting.dictionary")
With Sheets("Kiem tra")
i = .Range("A" & Rows.Count).End(xlUp).Row
If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
dArr = .Range("A2:A" & i).Value
End With
With Sheets("Sheet1")
i = .Range("C" & Rows.Count).End(xlUp).Row
If i < 13 Then MsgBox ("Khong co du lieu"): Exit Sub
sArr = .Range("C13:I" & i).Value
End With
sRow = UBound(sArr)
sR = UBound(dArr)
ReDim res(1 To sR, 1 To 3)
For n = 1 To sR
ct = dArr(n, 1)
For i = 1 To sRow
If sArr(i, 5) <> Empty Then
If sArr(i, 1) = ct Then
res(n, 1) = res(n, 1) + sArr(i, 5)
dic(sArr(i, 7)) = dic(sArr(i, 7)) + sArr(i, 5)
End If
End If
Next i
For i = 1 To sRow
If sArr(i, 6) <> Empty Then
If InStr(1, sArr(i, 3), ct) > 0 Then
If dic.exists(sArr(i, 7)) Then
tmp = dic(sArr(i, 7))
If sArr(i, 6) = tmp Then
res(n, 2) = tmp
res(n, 3) = "Ok!"
Exit For
End If
tong = tong + sArr(i, 6)
End If
End If
End If
Next i
If i = sRow + 1 Then
If tong > 0 Then
If res(n, 1) > tong Then
res(n, 2) = tong
Else
res(n, 2) = res(n, 1)
End If
res(n, 3) = "Xem Lai!"
End If
End If
dic.RemoveAll
tong = 0
Next n
Sheets("Kiem tra").Range("B2").Resize(sR, 3) = res
End Sub
Ôi a ơi, tuyệt quá a ah, nhưng a ơi, cái lệnh 21.b59 đó a, đang lấy cả số tiền hava: là 5.880.000,, trong khi số tiền đã thu lại chỉ lấy theo xe a ạ. A xử lý hộ e với ạ. E cảm ơn a ạThêm cột ghi chú kết quả
Mã:Option Explicit Sub XYZ() Dim sArr(), dArr(), res(), dic As Object Dim sRow&, sR&, n&, i&, ct$, iKey$, tmp#, tong# Set dic = CreateObject("scripting.dictionary") With Sheets("Kiem tra") i = .Range("A" & Rows.Count).End(xlUp).Row If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub dArr = .Range("A2:A" & i).Value End With With Sheets("Sheet1") i = .Range("C" & Rows.Count).End(xlUp).Row If i < 13 Then MsgBox ("Khong co du lieu"): Exit Sub sArr = .Range("C13:I" & i).Value End With sRow = UBound(sArr) sR = UBound(dArr) ReDim res(1 To sR, 1 To 3) For n = 1 To sR ct = dArr(n, 1) For i = 1 To sRow If sArr(i, 5) <> Empty Then If sArr(i, 1) = ct Then res(n, 1) = res(n, 1) + sArr(i, 5) dic(sArr(i, 7)) = dic(sArr(i, 7)) + sArr(i, 5) End If End If Next i For i = 1 To sRow If sArr(i, 6) <> Empty Then If InStr(1, sArr(i, 3), ct) > 0 Then If dic.exists(sArr(i, 7)) Then tmp = dic(sArr(i, 7)) If sArr(i, 6) = tmp Then res(n, 2) = tmp res(n, 3) = "Ok!" Exit For End If tong = tong + sArr(i, 6) End If End If End If Next i If i = sRow + 1 Then If tong > 0 Then If res(n, 1) > tong Then res(n, 2) = tong Else res(n, 2) = res(n, 1) End If res(n, 3) = "Xem Lai!" End If End If dic.RemoveAll tong = 0 Next n Sheets("Kiem tra").Range("B2").Resize(sR, 3) = res End Sub
Bạn muốn kết quả như thế nào? Nhập tay kết quả và gởi lại fileÔi a ơi, tuyệt quá a ah, nhưng a ơi, cái lệnh 21.b59 đó a, đang lấy cả số tiền hava: là 5.880.000,, trong khi số tiền đã thu lại chỉ lấy theo xe a ạ. A xử lý hộ e với ạ. E cảm ơn a ạ
Thầy ơi. Cho em hỏi. Dic (Arr(i,7)). Cái arr(i,7) nó là key phải không ạ. Ngồi đọc mà chưa hiểu lắm đoạn đó ạBạn muốn kết quả như thế nào? Nhập tay kết quả và gởi lại file
Lưu ý: Nội quy diễn đàn qui định không viết tắt
Đúng rùi, viết đầy đủ là Dic.item(Arr(i,7))Thầy ơi. Cho em hỏi. Dic (Arr(i,7)). Cái arr(i,7) nó là key phải không ạ. Ngồi đọc mà chưa hiểu lắm đoạn đó ạ