Tìm kiểm tra theo điều kiện

Liên hệ QC

hoalv1985

Thành viên hoạt động
Tham gia
27/11/17
Bài viết
130
Được thích
20
Giới tính
Nam
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 ạ!
 

File đính kèm

  • hoi dap.xlsx
    51.8 KB · Đọc: 24
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 ạ!
Mã:
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)
Copy xuống
 
Cô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.
 
Kết quả đúng là bao nhiêu? nói rỏ cách tính
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 ạ !
 
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
 
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. 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 ạ!
Bài đã được tự động gộp:

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 ạ.
 
Lần chỉnh sửa cuối:
Em nhờ anh/ chị trong diễn đàn giúp e với ạ. Em cảm ơn ạ!
 
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 ạ !
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
 
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
Ô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 ạ
 
Ô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 ạ
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
 
Dạ anh, như vậy là đúng ý của em rồi ạ. Em cảm ơn anh nhiều ạ. Chúc anh và đại gia đình mình sức khỏe và hạnh phúc ạ. Em cảm ơ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
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 đó ạ
 
Web KT
Back
Top Bottom