Dò tìm bằng code VBA

Liên hệ QC

thao nguyen01

Thành viên thường trực
Tham gia
8/12/19
Bài viết
214
Được thích
25
Kính gửi anh/chị,

E đang bị vướng về dò tìm Mã bên sheet Danh muc và điền vào sheet Do tim. Em muốn dùng Hàm Left, lấy 3 ký tự đầu của tk Nợ và tk có của sheet Do tim giống với tài khoản nợ và tài khoản có của sheet Danh muc thì sẽ lấy mã bên sheet Danh muc ạ. Anh/chị xem giúp em ạ. E cảm ơn nhiều ạ.
 

File đính kèm

  • do tim.xlsx
    19.1 KB · Đọc: 19
Kính gửi anh/chị,

E đang bị vướng về dò tìm Mã bên sheet Danh muc và điền vào sheet Do tim. Em muốn dùng Hàm Left, lấy 3 ký tự đầu của tk Nợ và tk có của sheet Do tim giống với tài khoản nợ và tài khoản có của sheet Danh muc thì sẽ lấy mã bên sheet Danh muc ạ. Anh/chị xem giúp em ạ. E cảm ơn nhiều ạ.
E4 =IFERROR(LOOKUP(2,1/(LEFT(C4,3)='danh muc'!$B$2:$B$4&"")/(LEFT(D4,3)='danh muc'!$C$2:$C$4&""),'danh muc'!$D$2:$D$4),"")
 
E4 =IFERROR(LOOKUP(2,1/(LEFT(C4,3)='danh muc'!$B$2:$B$4&"")/(LEFT(D4,3)='danh muc'!$C$2:$C$4&""),'danh muc'!$D$2:$D$4),"")

Dạ. Thầy @HieuCD có thể giúp e bài này bằng code VBA ạ. Vì data của e 1 tháng khoảng 8000 dòng. 1 năm có thể 100.000 dòng. Nên e dùng công thức sẽ chạy chậm ạ. Thầy xem giúp em với ạ. E cảm ơn Thầy @HieuCD nhiều lắm ạ.
 
Dạ. Thầy @HieuCD có thể giúp e bài này bằng code VBA ạ. Vì data của e 1 tháng khoảng 8000 dòng. 1 năm có thể 100.000 dòng. Nên e dùng công thức sẽ chạy chậm ạ. Thầy xem giúp em với ạ. E cảm ơn Thầy @HieuCD nhiều lắm ạ.
Mã:
Sub DoMa()
  Dim sArr(), DanhMuc(), Res()
  Dim i&, ik&, sRow&
  With Sheets("danh muc")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co Danh muc"): Exit Sub
    DanhMuc = .Range("B2:D" & i).Value
  End With
  With Sheets("Do tim")
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 4 Then MsgBox ("Khong co Tai khoan"): Exit Sub
    sArr = Range("C4:D" & i).Value
  End With
  With CreateObject("scripting.dictionary")
    sRow = UBound(DanhMuc)
    For i = 1 To sRow
      .Item(DanhMuc(i, 1) & "#" & DanhMuc(i, 2)) = DanhMuc(i, 3)
    Next i
    sRow = UBound(sArr)
    ReDim Res(1 To sRow, 1 To 1)
    For i = 1 To sRow
      Res(i, 1) = .Item(Left(sArr(i, 1), 3) & "#" & Left(sArr(i, 2), 3))
    Next i
  End With
  Sheets("Do tim").Range("E4").Resize(sRow) = Res
End Sub
 
Mã:
Sub DoMa()
  Dim sArr(), DanhMuc(), Res()
  Dim i&, ik&, sRow&
  With Sheets("danh muc")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co Danh muc"): Exit Sub
    DanhMuc = .Range("B2:D" & i).Value
  End With
  With Sheets("Do tim")
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 4 Then MsgBox ("Khong co Tai khoan"): Exit Sub
    sArr = Range("C4:D" & i).Value
  End With
  With CreateObject("scripting.dictionary")
    sRow = UBound(DanhMuc)
    For i = 1 To sRow
      .Item(DanhMuc(i, 1) & "#" & DanhMuc(i, 2)) = DanhMuc(i, 3)
    Next i
    sRow = UBound(sArr)
    ReDim Res(1 To sRow, 1 To 1)
    For i = 1 To sRow
      Res(i, 1) = .Item(Left(sArr(i, 1), 3) & "#" & Left(sArr(i, 2), 3))
    Next i
  End With
  Sheets("Do tim").Range("E4").Resize(sRow) = Res
End Sub

Dạ, e cảm ơn Thầy @HieuCD nhiều ạ.
 
Mã:
Sub DoMa()
  Dim sArr(), DanhMuc(), Res()
  Dim i&, ik&, sRow&
  With Sheets("danh muc")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co Danh muc"): Exit Sub
    DanhMuc = .Range("B2:D" & i).Value
  End With
  With Sheets("Do tim")
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 4 Then MsgBox ("Khong co Tai khoan"): Exit Sub
    sArr = Range("C4:D" & i).Value
  End With
  With CreateObject("scripting.dictionary")
    sRow = UBound(DanhMuc)
    For i = 1 To sRow
      .Item(DanhMuc(i, 1) & "#" & DanhMuc(i, 2)) = DanhMuc(i, 3)
    Next i
    sRow = UBound(sArr)
    ReDim Res(1 To sRow, 1 To 1)
    For i = 1 To sRow
      Res(i, 1) = .Item(Left(sArr(i, 1), 3) & "#" & Left(sArr(i, 2), 3))
    Next i
  End With
  Sheets("Do tim").Range("E4").Resize(sRow) = Res
End Sub

Dạ, e đang bị vướng về dò danh mục có len(tài khoản) không giống nhau ạ. E ví dụ: Đối với tài khoản 5112, độ dài là 4 khác so với các tài khoản còn lại là 3 thì k lấy được ạ. Thầy @HieuCD xem giúp e với ạ. E cảm ơn ạ.
 

File đính kèm

  • KQKD.xlsx
    16.1 KB · Đọc: 6
Dạ, e đang bị vướng về dò danh mục có len(tài khoản) không giống nhau ạ. E ví dụ: Đối với tài khoản 5112, độ dài là 4 khác so với các tài khoản còn lại là 3 thì k lấy được ạ. Thầy @HieuCD xem giúp e với ạ. E cảm ơn ạ.
Ngoài tài khoản cấp 1 và 2, còn có tài khoản cấp 3, 4 ... không
 
Ngoài tài khoản cấp 1 và 2, còn có tài khoản cấp 3, 4 ... không
Dạ còn ạ. Nhưng vấn đề bài này là e cần lọc và thống kê ra những tài khoản theo danh mục: có cấp 1 và có cấp 2... ạ. Nó không đồng nhất trong cách lấy ạ. Còn trường hợp toàn bộ cấp 2 hay toàn bộ cấp 3,... e lấy được ạ. Nhưng do lấy không đồng nhất thì e đang vướng ạ. Vì có 1 số tài khoản cần theo dõi chi tiết ạ. Thầy @HieuCD xem giúp e ạ. E cảm ơn Thầy ạ.
 
Dạ còn ạ. Nhưng vấn đề bài này là e cần lọc và thống kê ra những tài khoản theo danh mục: có cấp 1 và có cấp 2... ạ. Nó không đồng nhất trong cách lấy ạ. Còn trường hợp toàn bộ cấp 2 hay toàn bộ cấp 3,... e lấy được ạ. Nhưng do lấy không đồng nhất thì e đang vướng ạ. Vì có 1 số tài khoản cần theo dõi chi tiết ạ. Thầy @HieuCD xem giúp e ạ. E cảm ơn Thầy ạ.
Gởi lại file với sheet danh mục đầy đủ các trường hợp mới có hướng xử lý thích hợp
 
Gởi lại file với sheet danh mục đầy đủ các trường hợp mới có hướng xử lý thích hợp
dạ, danh mục của e ứng với data này là danh mục đầy đủ luôn ạ. Vì Data này e lấy để lập kết quả kinh doanh nên chỉ 1 số chỉ tiêu ạ. Thầy @HieuCD xem giúp e ạ.
 
Sheet danh mục làm gì có tài khoản cấp 2
Dạ. Ý e là: đối với loại lấy tất cả theo tk cấp 1 hay cấp 2, cấp 3 thì e sẽ tính theo hàm left ạ. Nhưng e chỉ làm được nếu tất cả theo tk cấp 1 hay cấp 2 hay cấp 3. Còn đối với danh mục này thì e lại k biết làm như thế nào ạ. Thầy @HieuCD xem giúp e ạ. E cảm ơn Thầy.
 
Dạ. Ý e là: đối với loại lấy tất cả theo tk cấp 1 hay cấp 2, cấp 3 thì e sẽ tính theo hàm left ạ. Nhưng e chỉ làm được nếu tất cả theo tk cấp 1 hay cấp 2 hay cấp 3. Còn đối với danh mục này thì e lại k biết làm như thế nào ạ. Thầy @HieuCD xem giúp e ạ. E cảm ơn Thầy.
Gởi lại file với sheet danh mục là dữ liệu thực tế
 
Gởi lại file với sheet danh mục là dữ liệu thực tế

Dạ, e gửi lại file ạ. Thầy @HieuCD xem giúp e ạ. E cảm ơn Thầy ạ.
Bài đã được tự động gộp:

Gởi lại file với sheet danh mục là dữ liệu thực tế
Thầy @HieuCD lấy giúp e file e mới gửi ạ. E mới chỉnh lại ạ. danh mục gồm 23 cặp ạ. Hồi nãy e gửi sẽ bị trùng ạ. Thầy lấy giúp e ạ. E cảm ơn Thầy ạ.
 

File đính kèm

  • KQKD_01.xlsx
    22.7 KB · Đọc: 15
Lần chỉnh sửa cuối:
Dạ, e gửi lại file ạ. Thầy @HieuCD xem giúp e ạ. E cảm ơn Thầy ạ.
Bài đã được tự động gộp:


Thầy @HieuCD lấy giúp e file e mới gửi ạ. E mới chỉnh lại ạ. danh mục gồm 23 cặp ạ. Hồi nãy e gửi sẽ bị trùng ạ. Thầy lấy giúp e ạ. E cảm ơn Thầy ạ.
Chạy code
Mã:
Sub DoMa()
  Dim sArr(), DanhMuc(), Res(), S, S2, iKey$, tmp$
  Dim i&, j&, Dno&, Dco&, sRow&, TKno$, TKco$
  With Sheets("danh muc")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co Danh muc"): Exit Sub
    DanhMuc = .Range("B2:D" & i).Value
  End With
  With Sheets("data")
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 4 Then MsgBox ("Khong co Tai khoan"): Exit Sub
    sArr = Range("C4:D" & i).Value
  End With
  With CreateObject("scripting.dictionary")
    sRow = UBound(DanhMuc)
    For i = 1 To sRow
      If DanhMuc(i, 1) <> Empty Then
        TKno = DanhMuc(i, 1)
        TKco = DanhMuc(i, 2)
        .Item(TKno & "#" & TKco) = DanhMuc(i, 3)
        iKey = Left(TKno, 3) & "##" & Left(TKco, 3)
        .Item(iKey) = .Item(iKey) & "-" & Len(TKno) & "," & Len(TKco)
      End If
    Next i
    sRow = UBound(sArr)
    ReDim Res(1 To sRow, 1 To 1)
    For i = 1 To sRow
      TKno = sArr(i, 1)
      TKco = sArr(i, 2)
      tmp = .Item(Left(TKno, 3) & "##" & Left(TKco, 3))
      If InStr(1, tmp, "-") > 0 Then
        S = Split(tmp, "-")
        For j = 1 To UBound(S)
          S2 = Split(S(j), ",")
          Dno = S2(0)
          Dco = S2(1)
          iKey = Left(TKno, Dno) & "#" & Left(TKco, Dco)
          If .exists(iKey) Then
            Res(i, 1) = .Item(iKey)
            Exit For
          End If
        Next j
      End If
    Next i
  End With
  Sheets("data").Range("E4").Resize(sRow) = Res
End Sub
 
Chạy code
Mã:
Sub DoMa()
  Dim sArr(), DanhMuc(), Res(), S, S2, iKey$, tmp$
  Dim i&, j&, Dno&, Dco&, sRow&, TKno$, TKco$
  With Sheets("danh muc")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co Danh muc"): Exit Sub
    DanhMuc = .Range("B2:D" & i).Value
  End With
  With Sheets("data")
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 4 Then MsgBox ("Khong co Tai khoan"): Exit Sub
    sArr = Range("C4:D" & i).Value
  End With
  With CreateObject("scripting.dictionary")
    sRow = UBound(DanhMuc)
    For i = 1 To sRow
      If DanhMuc(i, 1) <> Empty Then
        TKno = DanhMuc(i, 1)
        TKco = DanhMuc(i, 2)
        .Item(TKno & "#" & TKco) = DanhMuc(i, 3)
        iKey = Left(TKno, 3) & "##" & Left(TKco, 3)
        .Item(iKey) = .Item(iKey) & "-" & Len(TKno) & "," & Len(TKco)
      End If
    Next i
    sRow = UBound(sArr)
    ReDim Res(1 To sRow, 1 To 1)
    For i = 1 To sRow
      TKno = sArr(i, 1)
      TKco = sArr(i, 2)
      tmp = .Item(Left(TKno, 3) & "##" & Left(TKco, 3))
      If InStr(1, tmp, "-") > 0 Then
        S = Split(tmp, "-")
        For j = 1 To UBound(S)
          S2 = Split(S(j), ",")
          Dno = S2(0)
          Dco = S2(1)
          iKey = Left(TKno, Dno) & "#" & Left(TKco, Dco)
          If .exists(iKey) Then
            Res(i, 1) = .Item(iKey)
            Exit For
          End If
        Next j
      End If
    Next i
  End With
  Sheets("data").Range("E4").Resize(sRow) = Res
End Sub
Dạ, em cảm ơn Thầy @HieuCD nhiều ạ.
 
Web KT
Back
Top Bottom