Tổng hợp dữ liệu theo điều kiện? (1 người xem)

  • Thread starter Thread starter KUMI
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

KUMI

Bụi phấn
Tham gia
17/1/12
Bài viết
564
Được thích
571
Xin chào Thầy Cô cùng AnhChị và các bạn trong GPE!
Dịp đầu năm xin kính chúc mọi người sức khỏe dồi dào, thành công và hạnh phúc trong cuộc sống!

Hì,Em đang gặp khó khăn trong việc tổng hợp dữ liệu theo điều kiện (cụ thể câu hỏi và dữ liệu em đặt trong file kèm).
Thầy Cô cùng các Anh Chị xem có cách nào giải quyết không giúp em với ạ!
Trân thành cảm ơn!
 

File đính kèm

Xin chào Thầy Cô cùng AnhChị và các bạn trong GPE!
Dịp đầu năm xin kính chúc mọi người sức khỏe dồi dào, thành công và hạnh phúc trong cuộc sống!

Hì,Em đang gặp khó khăn trong việc tổng hợp dữ liệu theo điều kiện (cụ thể câu hỏi và dữ liệu em đặt trong file kèm).
Thầy Cô cùng các Anh Chị xem có cách nào giải quyết không giúp em với ạ!
Trân thành cảm ơn!

Trong khi đợi các Thầy Cô, bạn mở file của mình và test xem có đúng ko nhé! :-=

Link: https://www.mediafire.com/?tps9bl8l5mmv68s
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào Thầy Cô cùng AnhChị và các bạn trong GPE!
Dịp đầu năm xin kính chúc mọi người sức khỏe dồi dào, thành công và hạnh phúc trong cuộc sống!

Hì,Em đang gặp khó khăn trong việc tổng hợp dữ liệu theo điều kiện (cụ thể câu hỏi và dữ liệu em đặt trong file kèm).
Thầy Cô cùng các Anh Chị xem có cách nào giải quyết không giúp em với ạ!
Trân thành cảm ơn!

Thêm 1 cách để bạn tham khảo. Bạn xem file đính kèm nhé.
 

File đính kèm

Upvote 0
Cảm ơn 2anh em đã test cả 2 bài đều chạy rất đúng với ý của em.

Trong quá trình chạy code em thấy còn 1 vấn đề phát sinh nữa cần giải quyết, hi vọng là sẽ có giải pháp.
Đó là làm sao khi dữ liệu đã được đưa về file tổng hợp lần 1 rồi thì đến lần 2,...lần n
Nếu dữ liệu ở bảng tổng hợp chứa thông tin trùng nhau toàn bộ ở các cột với các bảng con thì sẽ không cập nhật nữa(trùng ngày,trùng ca,trùng mã,trùng tên,...) mà chỉ cập nhật những gì chưa có.
Trong trường hợp dữ liệu giống nhau hết nhưng còn 1 thông tin khác nhau ( ngày hoặc ca hoặc mã...) thì vẫn cập nhật bình thường.
 
Upvote 0
Cảm ơn 2anh em đã test cả 2 bài đều chạy rất đúng với ý của em.

Trong quá trình chạy code em thấy còn 1 vấn đề phát sinh nữa cần giải quyết, hi vọng là sẽ có giải pháp.
Đó là làm sao khi dữ liệu đã được đưa về file tổng hợp lần 1 rồi thì đến lần 2,...lần n
Nếu dữ liệu ở bảng tổng hợp chứa thông tin trùng nhau toàn bộ ở các cột với các bảng con thì sẽ không cập nhật nữa(trùng ngày,trùng ca,trùng mã,trùng tên,...) mà chỉ cập nhật những gì chưa có.
Trong trường hợp dữ liệu giống nhau hết nhưng còn 1 thông tin khác nhau ( ngày hoặc ca hoặc mã...) thì vẫn cập nhật bình thường.

Bạn xem file đính kèm nhé.
 

File đính kèm

Upvote 0
Bạn xem file đính kèm nhé.
Dồn 2 Sub thành 1 đi.
Ô E9 của các sheet Ca1,Ca2,Ca3 tác giả đều ghi số 1 là "cẩu thả", chỉnh lại cho đúng số ca là 1, 2, 3.
PHP:
Public Sub GPE()
Dim Dic As Object, sArr(), dArr(1 To 50000, 1 To 6), Ws As Object, Ngay As Long, CA As Long
Dim DK As String, Tem As String, I As Long, J As Long, K As Long, STT As Long
Set Dic = CreateObject("Scripting.Dictionary")
DK = "O"
With Sheets("TongHop")
    sArr = .Range(.[E13], .[E65536].End(xlUp)).Resize(, 3).Value2
    STT = .[D65536].End(xlUp).Value2
End With
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 1) & sArr(I, 2) & sArr(I, 3)
    If Not Dic.Exists(Tem) Then Dic.Add Tem, ""
Next I
For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name <> "TongHop" Then
        Ngay = Ws.[E8].Value2: CA = Ws.[E9].Value2
        sArr = Ws.Range(Ws.[E12], Ws.[E65536].End(xlUp)).Resize(, 4).Value2
        For I = 1 To UBound(sArr, 1)
            If UCase(sArr(I, 4)) = DK Then
                Tem = Ngay & CA & sArr(I, 1)
                If Not Dic.Exists(Tem) Then
                    K = K + 1: STT = STT + 1
                    dArr(K, 1) = STT
                    dArr(K, 2) = Ngay
                    dArr(K, 3) = CA
                    dArr(K, 4) = sArr(I, 1)
                    dArr(K, 5) = sArr(I, 2)
                    dArr(K, 6) = sArr(I, 4)
                End If
            End If
        Next I
    End If
Next Ws
If K Then Sheets("TongHop").[D65536].End(xlUp).Offset(1).Resize(K, 6) = dArr
Set Dic = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Ha!
Hình như là đúng rồi vì con mới xóa đi một phần dữ liệu sau đó cập nhật lại thấy rất ajngon.
Nếu trong quá trình áp dụng nếu vấn đề phát sinh con se thông tin lại ở đây!
Cảm ơn Thầy đã giúp đỡ ạ!
À, hôm qua Thầy có say hôk đó !:-=
 
Upvote 0
Thầy ơi code chỉ hoạt động được khi cột stt đã có số.
Còn không có gì thì phát sinh lỗi.
Nhờ Thầy kiểm tra giúp ạ!
Untitled.jpg
 
Upvote 0
Thầy ơi code chỉ hoạt động được khi cột stt đã có số.
Còn không có gì thì phát sinh lỗi.
Nhờ Thầy kiểm tra giúp ạ!
Thay Sub cũ bằng Sub này:
PHP:
Public Sub GPE()
Dim Dic As Object, sArr(), dArr(1 To 60000, 1 To 6), Ws As Object, Ngay As Long, CA As Long
Dim DK As String, Tem As String, I As Long, J As Long, K As Long, STT As Long, eRow As Long
Set Dic = CreateObject("Scripting.Dictionary")
DK = "O"
With Sheets("TongHop")
    eRow = .[E65536].End(xlUp).Row
    If eRow > 12 Then
        sArr = .Range(.[E12], .[E65536].End(xlUp)).Resize(, 3).Value
        STT = .[D65536].End(xlUp).Value
        For I = 1 To UBound(sArr, 1)
            Tem = sArr(I, 1) & sArr(I, 2) & sArr(I, 3)
            If Not Dic.Exists(Tem) Then Dic.Add Tem, ""
        Next I
    Else
        STT = 0
    End If
End With
For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name <> "TongHop" Then
        Ngay = Ws.[E8].Value: CA = Ws.[E9].Value
        sArr = Ws.Range(Ws.[E12], Ws.[E65536].End(xlUp)).Resize(, 4).Value
        For I = 1 To UBound(sArr, 1)
            If UCase(sArr(I, 4)) = DK Then
                Tem = Ngay & CA & sArr(I, 1)
                If Not Dic.Exists(Tem) Then
                    K = K + 1: STT = STT + 1
                    dArr(K, 1) = STT
                    dArr(K, 2) = Ngay
                    dArr(K, 3) = CA
                    dArr(K, 4) = sArr(I, 1)
                    dArr(K, 5) = sArr(I, 2)
                    dArr(K, 6) = sArr(I, 4)
                End If
            End If
        Next I
    End If
Next Ws
If K Then Sheets("TongHop").[D65536].End(xlUp).Offset(1).Resize(K, 6).Value = dArr
Set Dic = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn xem file đính kèm nhé.

Cảm ơn anh anh nhiều code đúng ý rồi ạ, nhưng đúng như Thầy BaTê nói ở bài #6 thì lỗi ở đây trong quá trình copy pase em không sửa tên ca lên cả 3 ca đều là 1 và ý của em muốn lấy tên ca ở chỗ này để điền vào cột ca trong bảng tổng hợp ạ.
Phiền anh sửa lại giúp ạ.
------------------------

Thay Sub cũ bằng Sub này:
PHP:
Public Sub GPE()
Dim Dic As Object, sArr(), dArr(1 To 60000, 1 To 6), Ws As Object, Ngay As Long, CA As Long
Dim DK As String, Tem As String, I As Long, J As Long, K As Long, STT As Long, eRow As Long
Set Dic = CreateObject("Scripting.Dictionary")
DK = "O"
With Sheets("TongHop")
    eRow = .[E65536].End(xlUp).Row
    If eRow > 12 Then
        sArr = .Range(.[E12], .[E65536].End(xlUp)).Resize(, 3).Value
        STT = .[D65536].End(xlUp).Value
        For I = 1 To UBound(sArr, 1)
            Tem = sArr(I, 1) & sArr(I, 2) & sArr(I, 3)
            If Not Dic.Exists(Tem) Then Dic.Add Tem, ""
        Next I
    Else
        STT = 0
    End If
End With
For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name <> "TongHop" Then
        Ngay = Ws.[E8].Value: CA = Ws.[E9].Value
        sArr = Ws.Range(Ws.[E12], Ws.[E65536].End(xlUp)).Resize(, 4).Value
        For I = 1 To UBound(sArr, 1)
            If UCase(sArr(I, 4)) = DK Then
                Tem = Ngay & CA & sArr(I, 1)
                If Not Dic.Exists(Tem) Then
                    K = K + 1: STT = STT + 1
                    dArr(K, 1) = STT
                    dArr(K, 2) = Ngay
                    dArr(K, 3) = CA
                    dArr(K, 4) = sArr(I, 1)
                    dArr(K, 5) = sArr(I, 2)
                    dArr(K, 6) = sArr(I, 4)
                End If
            End If
        Next I
    End If
Next Ws
If K Then Sheets("TongHop").[D65536].End(xlUp).Offset(1).Resize(K, 6).Value = dArr
Set Dic = Nothing
End Sub

Code trên của Thầy thì con đã chạy thử kết quả không xảy ra lỗi như đã nêu ở bài #8. Nhưng dữ liệu vẫn bị trùng nhau sau mỗi lần cập nhật.
Hix, phiền Thầy 1 lần nữa ạ!
 
Upvote 0
Cảm ơn anh anh nhiều code đúng ý rồi ạ, nhưng đúng như Thầy BaTê nói ở bài #6 thì lỗi ở đây trong quá trình copy pase em không sửa tên ca lên cả 3 ca đều là 1 và ý của em muốn lấy tên ca ở chỗ này để điền vào cột ca trong bảng tổng hợp ạ.
Phiền anh sửa lại giúp ạ.
------------------------



Code trên của Thầy thì con đã chạy thử kết quả không xảy ra lỗi như đã nêu ở bài #8. Nhưng dữ liệu vẫn bị trùng nhau sau mỗi lần cập nhật.
Hix, phiền Thầy 1 lần nữa ạ!

Phải sửa .Value thành các .Value2 thì mới chuẩn


Nhưng sử dụng sub sau cho nó đẹp, (sửa từ code của bac bate)

PHP:
Public Sub GPE()
Dim Dic As Object, sArr(), dArr(1 To 60000, 1 To 6), Ws As Object
Dim Ngay As Long, CA As Long, sNgayCA As String
Dim Tem As String, I As Long, J As Long, K As Long, STT As Long, eRow As Long
Const DK = "O"

Set Dic = CreateObject("Scripting.Dictionary")

With Sheets("TongHop")
    eRow = .[G65536].End(xlUp).Row
    If eRow > 12 Then
        sArr = .Range("E13:E" & eRow).Resize(, 3).Value2
        STT = Range("D" & eRow).Value2
        For I = 1 To UBound(sArr, 1)
            Dic(sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 3)) = Empty
        Next I
    Else
        STT = 0
    End If
End With
For Each Ws In ThisWorkbook.Worksheets
    With Ws
        If .Name <> "TongHop" Then
            Ngay = .[E8].Value2: CA = .[E9].Value2
            sArr = .Range(.[E12], .[E65536].End(xlUp)).Resize(, 4).Value2
            sNgayCA = Ngay & "#" & CA & "#"
            For I = 1 To UBound(sArr, 1)
                If UCase(sArr(I, 4)) = DK Then
                    Tem = sNgayCA & sArr(I, 1)
                    If Not Dic.exists(Tem) Then
                        K = K + 1: STT = STT + 1
                        dArr(K, 1) = STT
                        dArr(K, 2) = Ngay
                        dArr(K, 3) = CA
                        dArr(K, 4) = sArr(I, 1)
                        dArr(K, 5) = sArr(I, 2)
                        dArr(K, 6) = sArr(I, 4)
                        Dic.Add Tem, Empty
                    End If
                End If
            Next I
        End If
    End With
Next Ws
If K Then
    Sheets("TongHop").Range("D" & eRow).Offset(1).Resize(K, 6).Value = dArr
Else
    MsgBox "Khong co du lieu nao can cap nhap ca"
End If
Set Dic = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hiện chưa thấy lỗi gì cả,hihi Em cảm ơn Anh vodoi2x nhiều nhé!
 
Upvote 0
Hiện chưa thấy lỗi gì cả,hihi Em cảm ơn Anh vodoi2x nhiều nhé!

Code bài 9 của bác bate phải sửa các chỗ .Value thành .Value2 sẽ đúng

Code bài trên của tôi, cho phép cả việc: Chỉ cập nhập duy nhất (theo 3 thông số ngày+ca+mã và Đã hát) 1 lần dù trong ca nào đó ng ta có đánh nhầm trùng 2 lần

Sửa lại theo chuẩn hơn

eRow = .[F65536].End(xlUp).Row

thành

eRow = .[G65536].End(xlUp).Row
 
Lần chỉnh sửa cuối:
Upvote 0
Cho e hỏi a vodoi2x là cách viết này



nó có tương đương với không vậy a ?

E cám ơn !

Gần đúng thế,

Dic(sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 3)) = Empty
tương đương với
Dic.Item(sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 3)) = Empty

Cái này sẽ gán giá trị Empty cho item với key: sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 3) ---> nếu key này chưa tồn tại sẽ được cộng thêm vào --> ta không cần kiểm tra việc tồn tại nữa, trường hợp đã có key thì nó cứ gán Empty cho cái đó mà thui

Còn dùng .Add -- nếu có key rồi sẽ báo lỗi
 
Lần chỉnh sửa cuối:
Upvote 0
Code bài 9 của bác bate phải sửa các chỗ .Value thành .Value2 sẽ đúng

Code bài trên của tôi, cho phép cả việc: Chỉ cập nhập duy nhất (theo 3 thông số ngày+ca+mã và Đã hát) 1 lần dù trong ca nào đó ng ta có đánh nhầm trùng 2 lần

Sửa lại theo chuẩn hơn

eRow = .[F65536].End(xlUp).Row

thành

eRow = .[G65536].End(xlUp).Row

Đúng là như vậy,Em đã test thử so với bài #6 của Thầy Ba Tê thì code lọc dữ liệu duy nhất triệt của Anh triệt để hơn.Trong trường hợp 3 ca trùng nhau và các ngày mã và tên bài hát cũng trùng nhau :với code của Thầy Ba Tê thì chỉ lọc trung nhau trong 1 sheet nhưng code của Anh thì lọc duy nhất cả 3 Sheet. Và em muốn nói là đây là vấn đề được giải quyết hơn cả mong đợi.
Em cảm ơn Thầy và Anh đã giúp đỡ ạ.
 
Upvote 0
Phải sửa .Value thành các .Value2 thì mới chuẩn


Nhưng sử dụng sub sau cho nó đẹp, (sửa từ code của bac bate)

PHP:
Public Sub GPE()
Dim Dic As Object, sArr(), dArr(1 To 60000, 1 To 6), Ws As Object
Dim Ngay As Long, CA As Long, sNgayCA As String
Dim Tem As String, I As Long, J As Long, K As Long, STT As Long, eRow As Long
Const DK = "O"

Set Dic = CreateObject("Scripting.Dictionary")

With Sheets("TongHop")
    eRow = .[G65536].End(xlUp).Row
    If eRow > 12 Then
        sArr = .Range("E13:E" & eRow).Resize(, 3).Value2
        STT = Range("D" & eRow).Value2
        For I = 1 To UBound(sArr, 1)
            Dic(sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 3)) = Empty
        Next I
    Else
        STT = 0
    End If
End With
For Each Ws In ThisWorkbook.Worksheets
    With Ws
        If .Name <> "TongHop" Then
            Ngay = .[E8].Value2: CA = .[E9].Value2
            sArr = .Range(.[E12], .[E65536].End(xlUp)).Resize(, 4).Value2
            sNgayCA = Ngay & "#" & CA & "#"
            For I = 1 To UBound(sArr, 1)
                If UCase(sArr(I, 4)) = DK Then
                    Tem = sNgayCA & sArr(I, 1)
                    If Not Dic.exists(Tem) Then
                        K = K + 1: STT = STT + 1
                        dArr(K, 1) = STT
                        dArr(K, 2) = Ngay
                        dArr(K, 3) = CA
                        dArr(K, 4) = sArr(I, 1)
                        dArr(K, 5) = sArr(I, 2)
                        dArr(K, 6) = sArr(I, 4)
                        Dic.Add Tem, Empty
                    End If
                End If
            Next I
        End If
    End With
Next Ws
If K Then
    Sheets("TongHop").Range("D" & eRow).Offset(1).Resize(K, 6).Value = dArr
Else
    MsgBox "Khong co du lieu nao can cap nhap ca"
End If
Set Dic = Nothing
End Sub

Xin hỏi Thầy Cô và Anh vodoi2x
Ở đoạn code này
Mã:
Const DK = "O"

Ngoài điều kiện "O" ra thì em muốn thêm 3 hoặc 4 điều kiện nữa ("X","Y","Z") thì đoạn code trên của anh vodoi2x phải sửa lại thế nào nào cho phù hợp ạ.
 
Upvote 0
Theo mình thì bạn cứ cosnt thêm vào . ví dụ như :
Const DK1 ="0"
Const DK2 ="X"
Const DK3 ="Y"
Và bạn sữa đoạn code chỗ này If UCase(sArr(I, 4)) = DK Then thành If UCase(sArr(I, 4)) = DK1 or UCase(sArr(I, 4)) = DK2 or UCase(sArr(I, 4)) = DK3 then
 
Upvote 0

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

Back
Top Bottom