Giúp code tổng hợp (1 người xem)

Liên hệ QC

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

tueyennhi

Thành viên tích cực
Tham gia
18/10/10
Bài viết
1,192
Được thích
105
Chào anh chị.

Em có file dữ liệu với nhiều sheet khác nhau, có cách nào chạy file lọc lấy giá trị cột ID của tất cả các sheet kia vào sheet tổng hợp không ạ? Với điều kiện ID trong sheet tổng hợp là duy nhất (chỉ lấy ID khác biệt vào file tổng hợp, không lặp lại các ID đã có.

Em cảm ơn.
 

File đính kèm

Bạn thử Code sau để xem dòng lệnh số 17 của bạn nó xác định vùng ở đâu (Chưa nói là câu lệnh này còn sai cú pháp Exc linh động cố chạy đấy):

Mã:
Sub Test()
        Sheet2.Range("C9", Sheet2.Range("C9").End(xlDown)).Resize(, 38).Select
End Sub

Mình thấy câu lệnh

Mã:
If Ws.Name <> "BCC" And Ws.Name = "N" Then


nó chỉ cần

Mã:
 If Ws.Name = "N" Then

Bạn kiểm tra lại, vì mình không theo dõi từ đầu nên không biết bạn làm gì nên không kiểm tra hoạt động được

Bạn xem cho mình file tổng hợp công ban đầu của anh Bate nhé, code bao gồm 2 sheet minh họa, thực tế thì bao gồm sheet tổng hợp là BCC và các sheet công từ ngày 26 tháng này đến 25 tháng sau (1 chu kỳ lương) và anh ấy viết cho mình file lấy dữ liệu đáp ứng được yêu cầu như sau:

1. Quét toàn bộ ID của các sheet công (26, 27, 28, 29... 01, 02, 03...24, 25) và lấy ra 1 danh sách ID đại diện duy nhất cho vào BCC. (ví dụ sheet 26 có các ID 10, 20, 30 và sheet 27 có các ID 20, 30, 40 thì sheet BCC cột ID sẽ là 10, 20, 30, 40).
2. Sau đó căn cứ vào ID và ngày công mà update dữ liệu công tương ứng vào BCC (ví dụ công ngày 26 sẽ lấy dữ liệu từ sheet 26 và đổ vào cột công của ngày 26 trong sheet BCC.


Còn hiện tại mình muốn sau khi đã tổng hợp công trong BCC xong, mình update tiếp thông tin ngày nghỉ dựa vào sheet N. Cột lý do nghỉ sẽ tự động điền vào cột WD của ngày công tương ứng. Trong code GPE mình sửa code của anh Bate từ If Ws.Name <> "BCC" thành If Ws.Name <> "BCC" And Ws.Name <> "N" vì nếu không sửa vậy thì code nó không chạy do mình thêm sheet N.

Mình biết chắc code sẽ không chạy bởi vì form nhập dữ liệu update nó khác hoàn toàn so với sheet công (26).
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn xem cho mình file tổng hợp công ban đầu của anh Bate nhé, code bao gồm 2 sheet minh họa, thực tế thì bao gồm sheet tổng hợp là BCC và các sheet công từ ngày 26 tháng này đến 25 tháng sau (1 chu kỳ lương) và anh ấy viết cho mình file lấy dữ liệu đáp ứng được yêu cầu như sau:

1. Quét toàn bộ ID của các sheet công (26, 27, 28, 29... 01, 02, 03...24, 25) và lấy ra 1 danh sách ID đại diện duy nhất cho vào BCC. (ví dụ sheet 26 có các ID 10, 20, 30 và sheet 27 có các ID 20, 30, 40 thì sheet BCC cột ID sẽ là 10, 20, 30, 40).
2. Sau đó căn cứ vào ID và ngày công mà update dữ liệu công tương ứng vào BCC (ví dụ công ngày 26 sẽ lấy dữ liệu từ sheet 26 và đổ vào cột công của ngày 26 trong sheet BCC.


Còn hiện tại mình muốn sau khi đã tổng hợp công trong BCC xong, mình update tiếp thông tin ngày nghỉ dựa vào sheet N. Cột lý do nghỉ sẽ tự động điền vào cột WD của ngày công tương ứng. Trong code GPE mình sửa code của anh Bate từ If Ws.Name <> "BCC" thành If Ws.Name <> "BCC" And Ws.Name <> "N" vì nếu không sửa vậy thì code nó không chạy do mình thêm sheet N.

Mình biết chắc code sẽ không chạy bởi vì form nhập dữ liệu update nó khác hoàn toàn so với sheet công (26).

Bạn chạy Sub này thay Sub cũ xem kết quả thế nào.
PHP:
Public Sub GPE()
Dim Dic As Object, Col As Object, Ws As Worksheet, Tem As String, Rws As Long
Dim sArr(), dArr(1 To 5000, 1 To 162), I As Long, J As Long, K As Long, C As Long, R As Long
Set Dic = CreateObject("Scripting.Dictionary")
Set Col = CreateObject("Scripting.Dictionary")
With Sheets("BCC")
    sArr = .Range("B6").Resize(, 162).Value
    For J = 1 To 162
        If sArr(1, J) <> Empty Then
            If IsDate(sArr(1, J)) Then Col.Item(Day(sArr(1, J))) = J
        End If
    Next J
End With
For Each Ws In Worksheets
    If Ws.Name <> "BCC" And Ws.Name <> "N" Then
        C = Col.Item(Val(Ws.Name))
        sArr = Ws.Range("C9", Ws.Range("C9").End(xlDown)).Resize(, 38).Value
        For I = 1 To UBound(sArr)
            Tem = sArr(I, 1)
            If Not Dic.Exists(Tem) Then
                K = K + 1
                Dic.Add Tem, K
                dArr(K, 1) = sArr(I, 1)
            End If
            Rws = Dic.Item(Tem)
            dArr(Rws, C) = sArr(I, 33)
            dArr(Rws, C + 1) = sArr(I, 34):         dArr(Rws, C + 2) = sArr(I, 35)
            dArr(Rws, C + 3) = sArr(I, 36):         dArr(Rws, C + 4) = sArr(I, 38)
        Next I
    End If
Next Ws
    With Sheets("N")
        R = .Range("A65536").End(xlUp).Row
            If R > 3 Then
                sArr = .Range("A3:D" & R).Value
                For I = 2 To UBound(sArr)
                    Tem = sArr(I, 1)
                    Rws = Dic.Item(Tem)
                    C = Col.Item(Day(sArr(I, 4)))
                    dArr(Rws, C) = sArr(I, 3)
                Next I
            End If
    End With
Sheets("BCC").Range("B8").Resize(K, 162) = dArr
Set Dic = Nothing
Set Col = Nothing
End Sub
Bấm nút 1 lần là xong, không cần nút thứ hai.
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Public Sub GPE()
Dim Dic As Object, Col As Object, Ws As Worksheet, Tem As String, Rws As Long
Dim sArr(), dArr(1 To 5000, 1 To 162), I As Long, J As Long, K As Long, C As Long, R As Long
Set Dic = CreateObject("Scripting.Dictionary")
Set Col = CreateObject("Scripting.Dictionary")
With Sheets("BCC")
    sArr = .Range("B6").Resize(, 162).Value
    For J = 1 To 162
        If sArr(1, J) <> Empty Then
            If IsDate(sArr(1, J)) Then Col.Item(Day(sArr(1, J))) = J
        End If
    Next J
End With
For Each Ws In Worksheets
    If Ws.Name <> "BCC" And Ws.Name <> "N" Then
        C = Col.Item(Val(Ws.Name))
        sArr = Ws.Range("C9", Ws.Range("C9").End(xlDown)).Resize(, 38).Value
        For I = 1 To UBound(sArr)
            Tem = sArr(I, 1)
            If Not Dic.Exists(Tem) Then
                K = K + 1
                Dic.Add Tem, K
                dArr(K, 1) = sArr(I, 1)
            End If
            Rws = Dic.Item(Tem)
            dArr(Rws, C) = sArr(I, 33)
            dArr(Rws, C + 1) = sArr(I, 34):         dArr(Rws, C + 2) = sArr(I, 35)
            dArr(Rws, C + 3) = sArr(I, 36):         dArr(Rws, C + 4) = sArr(I, 38)
        Next I
    End If
Next Ws
    With Sheets("N")
        R = .Range("A65536").End(xlUp).Row
            If R > 3 Then
                sArr = .Range("A3:D" & R).Value
                For I = 2 To UBound(sArr)
                    Tem = sArr(I, 1)
                    Rws = Dic.Item(Tem)
                    C = Col.Item(Day(sArr(I, 4)))
                    dArr(Rws, C) = sArr(I, 3)
                Next I
            End If
    End With
Sheets("BCC").Range("B8").Resize(K, 162) = dArr
Set Dic = Nothing
Set Col = Nothing
End Sub

Code chạy đã đúng như em mong muốn anh ạ, tuy nhiên vì một số lý do trong công việc nên phiền anh có thể chia nhiệm vụ đó ra làm hai lệnh cho em được không? Một lần nữa em chân thành cảm ơn anh, mong rằng có dịp được trò chuyện trực tiếp với anh!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
..............................
Code chạy đã đúng như em mong muốn anh ạ, tuy nhiên vì một số lý do trong công việc nên phiền anh có thể chia nhiệm vụ đó ra làm hai lệnh cho em được không? Một lần nữa em chân thành cảm ơn anh, mong rằng có dịp được trò chuyện trực tiếp với anh!
Bạn xem lại File và kiểm tra kết quả nhé.
 

File đính kèm

Upvote 0
Anh Bate ơi cho em hỏi trường hợp em muốn lấy cả giá trị tên nhân viên thì làm thế nào ạ? Vì em thấy key item gì ấy nó chỉ dựa vào ngày.
 
Upvote 0
Web KT

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

Back
Top Bottom