Giúp viết code VBA lọc mã duy nhất và lấy dữ liệu theo điều kiện

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

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ị viết giúp em code để lấy dữ liệu, resize theo điều kiện. Em có mô tả trong file đính kèm ạ. Em cảm ơn Anh/ Chị nhiều ạ!
Bài đã được tự động gộp:


Bài đã được tự động gộp:

Em đính lại file ạ
 

File đính kèm

Em nhờ Anh/Chị viết giúp em code để lấy dữ liệu, resize theo điều kiện. Em có mô tả trong file đính kèm ạ. Em cảm ơn Anh/ Chị nhiều ạ!
Bài đã được tự động gộp:


Bài đã được tự động gộp:

Em đính lại file ạ
Chép lại cho dẻo tay
1677917562789.png
 

File đính kèm

Sub abc()
Dim dic As Object, sarr(), res(), i&, s, key, k&, m&
Dim rng As Range
Set rng = Sheets("Data pb").Range("A3:B46")
Set dic = CreateObject("scripting.dictionary")
With Sheets("NKC")
sarr = .Range("P4:T" & .Range("T" & Rows.Count).End(xlUp).Row).Value
ReDim res(1 To UBound(sarr), 1 To 3)
For i = 1 To UBound(sarr)
If InStr(1, dic(sarr(i, 5)), sarr(i, 1)) = 0 Then
dic(sarr(i, 5)) = dic(sarr(i, 5)) & "|" & sarr(i, 1)
End If
Next i
For Each key In dic.key
s = Split(dic(key), "|")
For i = 0 To UBound(s)
k = k + 1
If i = 0 Then
m = m + 1
res(k, 1) = WorksheetFunction.Roman(m)
res(k, 2) = key
res(k, 3) = WorksheetFunction.VLookup(kye, rng, 2, 0)
Else
res(k, 2) = s(i)
End If
Next i
Next
End With
Sheets("Bao cao").Range("D3").Resize(k, 3).Value = res
End Sub
Anh ơi, em viết lại code như anh mà sao ko chạy được anh nhỉ
 
Anh ơi, em viết lại code như anh mà sao ko chạy được anh nhỉ
Đơn giản là chép lại sai thôi
1677919271923.png
Mã:
Option Explicit
Sub ABC()
    Dim dic As Object, sarr(), es(), i&, s, key, k&, m&
    Dim rng As Range
    Set rng = Sheets("Data pb").Range("A3:B46")
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("NKC")
        sarr = .Range("P4:T" & .Range("T" & Rows.Count).End(3).Row).Value
        ReDim res(1 To UBound(sarr), 1 To 3)
        For i = 1 To UBound(sarr)
            If InStr(1, dic(sarr(i, 5)), sarr(i, 1)) = 0 Then
                dic(sarr(i, 5)) = dic(sarr(i, 5)) & "|" & sarr(i, 1)
            End If
        Next
        For Each key In dic.keys
            s = Split(dic(key), "|")
            For i = 0 To UBound(s)
                k = k + 1
                If i = 0 Then
                    m = m + 1
                    res(k, 1) = WorksheetFunction.Roman(m)
                    res(k, 2) = key
                    res(k, 3) = WorksheetFunction.VLookup(key, rng, 2, 0)
                Else
                    res(k, 2) = s(i)
                End If
            Next
        Next
    End With
    Sheets("Bao cao").Range("D3").Resize(k, 3).Value = res
End Sub
 
Đơn giản là chép lại sai thôi
View attachment 287147
Mã:
Option Explicit
Sub ABC()
    Dim dic As Object, sarr(), es(), i&, s, key, k&, m&
    Dim rng As Range
    Set rng = Sheets("Data pb").Range("A3:B46")
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("NKC")
        sarr = .Range("P4:T" & .Range("T" & Rows.Count).End(3).Row).Value
        ReDim res(1 To UBound(sarr), 1 To 3)
        For i = 1 To UBound(sarr)
            If InStr(1, dic(sarr(i, 5)), sarr(i, 1)) = 0 Then
                dic(sarr(i, 5)) = dic(sarr(i, 5)) & "|" & sarr(i, 1)
            End If
        Next
        For Each key In dic.keys
            s = Split(dic(key), "|")
            For i = 0 To UBound(s)
                k = k + 1
                If i = 0 Then
                    m = m + 1
                    res(k, 1) = WorksheetFunction.Roman(m)
                    res(k, 2) = key
                    res(k, 3) = WorksheetFunction.VLookup(key, rng, 2, 0)
                Else
                    res(k, 2) = s(i)
                End If
            Next
        Next
    End With
    Sheets("Bao cao").Range("D3").Resize(k, 3).Value = res
End Sub
Dạ anh, nhưng vẫn báo lỗi anh à, em sửa lại thành key rồi mà vẫn báo lỗi ạ
Bài đã được tự động gộp:

Đơn giản là chép lại sai thôi
View attachment 287147
Mã:
Option Explicit
Sub ABC()
    Dim dic As Object, sarr(), es(), i&, s, key, k&, m&
    Dim rng As Range
    Set rng = Sheets("Data pb").Range("A3:B46")
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("NKC")
        sarr = .Range("P4:T" & .Range("T" & Rows.Count).End(3).Row).Value
        ReDim res(1 To UBound(sarr), 1 To 3)
        For i = 1 To UBound(sarr)
            If InStr(1, dic(sarr(i, 5)), sarr(i, 1)) = 0 Then
                dic(sarr(i, 5)) = dic(sarr(i, 5)) & "|" & sarr(i, 1)
            End If
        Next
        For Each key In dic.keys
            s = Split(dic(key), "|")
            For i = 0 To UBound(s)
                k = k + 1
                If i = 0 Then
                    m = m + 1
                    res(k, 1) = WorksheetFunction.Roman(m)
                    res(k, 2) = key
                    res(k, 3) = WorksheetFunction.VLookup(key, rng, 2, 0)
                Else
                    res(k, 2) = s(i)
                End If
            Next
        Next
    End With
    Sheets("Bao cao").Range("D3").Resize(k, 3).Value = res
End Sub
Em cảm ơn anh ạ! Chúc anh cuối tuần vui vẻ ạ
Bài đã được tự động gộp:

Chủ bài đăng muốn chỉ mất ~1 gy thôi bạn à!

→ → → → → → → → → → → → → → → → → → → → → → → → → → →​
Em cảm ơn anh nhiều ạ. Chúc anh cuối tuần vui vẻ và hạnh phúc anh ạ
Bài đã được tự động gộp:

Cái này nếu biết 1 xíu thì có thể record macro để đạt được mục đích mà. Nhưng có vẻ thớt cũng lười. Và tận dụng được những thành phần ngứa tay như em.
ko phải em lười anh à, khi sheet NKC tháng sau phát sinh thêm mã phí mới thì ko recode được ạ
 
Tiêu đề bài này nên đổi thành: "Giúp viết code VBA lọc mã duy nhất và lấy dữ liệu theo điều kiện" để ai muốn tìm theo chủ đề này sẽ dễ dàng tìm thấy.
 
Tại sao không chạy duyệt sheets Data pb trước rồi chạy sheets NKC sau có phải đơn giản hơn không mà không cần sử dụng hàm Vlookup nữa.
Ừ nhỉ. Cách của anh cũng là 1 cách. Hihi. Lúc ấy nghĩ sao thì viết thế ấy mà anh
 
Đơn giản là chép lại sai thôi
View attachment 287147
Mã:
Option Explicit
Sub ABC()
    Dim dic As Object, sarr(), es(), i&, s, key, k&, m&
    Dim rng As Range
    Set rng = Sheets("Data pb").Range("A3:B46")
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("NKC")
        sarr = .Range("P4:T" & .Range("T" & Rows.Count).End(3).Row).Value
        ReDim res(1 To UBound(sarr), 1 To 3)
        For i = 1 To UBound(sarr)
            If InStr(1, dic(sarr(i, 5)), sarr(i, 1)) = 0 Then
                dic(sarr(i, 5)) = dic(sarr(i, 5)) & "|" & sarr(i, 1)
            End If
        Next
        For Each key In dic.keys
            s = Split(dic(key), "|")
            For i = 0 To UBound(s)
                k = k + 1
                If i = 0 Then
                    m = m + 1
                    res(k, 1) = WorksheetFunction.Roman(m)
                    res(k, 2) = key
                    res(k, 3) = WorksheetFunction.VLookup(key, rng, 2, 0)
                Else
                    res(k, 2) = s(i)
                End If
            Next
        Next
    End With
    Sheets("Bao cao").Range("D3").Resize(k, 3).Value = res
End Sub
Anh ơi, cột B khi lấy sang thì phần số bị sai anh à. Bên NKC đang để dạng Text, nhưng khi lấy sang thì lại trở về dạng số, nên sẽ bị mất số 0 ở đầu anh à.
 
Anh ơi, cột B khi lấy sang thì phần số bị sai anh à. Bên NKC đang để dạng Text, nhưng khi lấy sang thì lại trở về dạng số, nên sẽ bị mất số 0 ở đầu anh à.
Trước khi chạy đoạn code trên thì hãy định dạng cột B đấy thành dạng text là được chứ có gì đâu
 
Anh ơi, cột B khi lấy sang thì phần số bị sai anh à. Bên NKC đang để dạng Text, nhưng khi lấy sang thì lại trở về dạng số, nên sẽ bị mất số 0 ở đầu anh à.
Anh ơi, cũng là cái bảng đó, nhưng em thêm 1 cột kết quả ở cột E. Như file đính kèm, anh giúp nốt em với anh ơi. Em cảm ơn anh ạ!
 

File đính kèm

em thêm 1 cột kết quả ở cột E.
Có vẻ cột E cũng chỉ là cột trung gian, nối chuỗi 2 mã với nhau, mục đích để SUMIF hay VLOOKUP gì đó để ra báo cáo khác.
Bạn cho luôn kết quả muốn có đi nhé, biết đâu lại không cần cột E nữa thì sao.
 
Web KT

Bài viết mới nhất

Back
Top Bottom