Lấy dữ liệu theo nhiều điều kiện

Liên hệ QC

Bích Tỷ

Thành viên chính thức
Tham gia
17/5/21
Bài viết
85
Được thích
19
Chào anh chị trên diễn đàn, nhờ anh chị hỗ trợ em một vấn đề như này ạ.
Lấy dữ liệu theo nhiều điều kiện:
1. Dựa vào ngày ở sheet SUMMARY (từ ngày- đến ngày) để lấy dữ liệu theo "CHUYỀN" ( Hình thể, kiểu giày, số lượng (1.1), đôi/h) từ sheets"0219" (loại bỏ dữ liệu trùng)
1.1. Cột số lượng thì tính tổng theo "Hình thể"
2. Cột "số người" thì dựa vào "tiêu chuẩn số đôi/ngày" và "hình thể" để lấy dữ liệu tương ứng từ sheet "STD"
3. Lấy dữ liệu tương tự cho những cột tương tự phía sau
=> Mình có kết quả mẫu như trong sheet Summary, mong anh chị giúp đỡ. Em cảm ơn
 

File đính kèm

  • GPE TRO GIUP.xlsb
    206.1 KB · Đọc: 24
Chào anh chị trên diễn đàn, nhờ anh chị hỗ trợ em một vấn đề như này ạ.
Lấy dữ liệu theo nhiều điều kiện:
1. Dựa vào ngày ở sheet SUMMARY (từ ngày- đến ngày) để lấy dữ liệu theo "CHUYỀN" ( Hình thể, kiểu giày, số lượng (1.1), đôi/h) từ sheets"0219" (loại bỏ dữ liệu trùng)
1.1. Cột số lượng thì tính tổng theo "Hình thể"
2. Cột "số người" thì dựa vào "tiêu chuẩn số đôi/ngày" và "hình thể" để lấy dữ liệu tương ứng từ sheet "STD"
3. Lấy dữ liệu tương tự cho những cột tương tự phía sau
=> Mình có kết quả mẫu như trong sheet Summary, mong anh chị giúp đỡ. Em cảm ơn
Anh chị ơi, giúp đỡ em vấn đề này với ạ.
 
Upvote 0
Thử xem sao. Hy vọng đúng ý
Nhắn bạn : không nên nối thông MergeCell
Hi anh/chị,
sau khi xem thì em thấy còn một số vấn đề như sau:
  • Cột số người chưa đúng (Cột số người dựa vào: Hình thể và số đôi tiêu chuẩn/ngày để lấy kết quả tương ứng)1645790202346.png
  • Dữ liệu hình thể theo chuyền chưa hiển thị hết (Chuyền CA còn hình thể 11211).1645789976542.png
  • Ngày 02/28 ở sheet "0219" vẫn có dữ liệu ở chuyền CA nhưng sheet "summary" lại không có
  • 1645790085498.png
  • Có thể giữ lại cái mẫu như ban đầu không (có thể bỏ MergeCell) và bỏ chữ TỔNG CỘNG (giữ lại Total)
  • Em cảm ơn ạ.
 
Upvote 0
Hi anh/chị,
sau khi xem thì em thấy còn một số vấn đề như sau:
  • Cột số người chưa đúng (Cột số người dựa vào: Hình thể và số đôi tiêu chuẩn/ngày để lấy kết quả tương ứng)View attachment 272481
  • Dữ liệu hình thể theo chuyền chưa hiển thị hết (Chuyền CA còn hình thể 11211).View attachment 272479
  • Ngày 02/28 ở sheet "0219" vẫn có dữ liệu ở chuyền CA nhưng sheet "summary" lại không có
  • View attachment 272480
  • Có thể giữ lại cái mẫu như ban đầu không (có thể bỏ MergeCell) và bỏ chữ TỔNG CỘNG (giữ lại Total)
  • Em cảm ơn ạ.
Có những nguyên tắc mà bạn phải theo vba chứ không không phải VBA theo ý của bạn. Chứ làm như bạn. Trước sau gì cũng xảy ra sự cố
 
Upvote 0
Hi anh/chị,
sau khi xem thì em thấy còn một số vấn đề như sau:
  • Cột số người chưa đúng (Cột số người dựa vào: Hình thể và số đôi tiêu chuẩn/ngày để lấy kết quả tương ứng)View attachment 272481
  • Dữ liệu hình thể theo chuyền chưa hiển thị hết (Chuyền CA còn hình thể 11211).View attachment 272479
  • Ngày 02/28 ở sheet "0219" vẫn có dữ liệu ở chuyền CA nhưng sheet "summary" lại không có
  • View attachment 272480
  • Có thể giữ lại cái mẫu như ban đầu không (có thể bỏ MergeCell) và bỏ chữ TỔNG CỘNG (giữ lại Total)
  • Em cảm ơn ạ.
Tải lại file. Chạy code, Kiểm tra và cho biết kết quả
 

File đính kèm

  • GPE TRO GIUP(V1).xlsb
    211.9 KB · Đọc: 19
Upvote 0
Tải lại file. Chạy code, Kiểm tra và cho biết kết quả
Chào anh chị,
Sau khi chạy dữ liệu em thấy rằng
+ nếu tắt dòng code TOTAL này đi thì dữ liệu lấy ra đúng.
1645836131491.png
+ nhưng khi dòng này chạy luôn thì kết quả vừa xuất ra lại bị thay thế bằng dòng tính tổng nên kết quả bị sai.
1645836195633.png
Phiền anh chị xem giúp em chỗ này và trong dòng total ở cột "Đôi/h" tính trung bình và cột số người lấy MAX giúp em, em cảm ơn
 
Upvote 0
Chào anh chị,
Sau khi chạy dữ liệu em thấy rằng
+ nếu tắt dòng code TOTAL này đi thì dữ liệu lấy ra đúng.
View attachment 272483
+ nhưng khi dòng này chạy luôn thì kết quả vừa xuất ra lại bị thay thế bằng dòng tính tổng nên kết quả bị sai.
View attachment 272484
Phiền anh chị xem giúp em chỗ này và trong dòng total ở cột "Đôi/h" tính trung bình và cột số người lấy MAX giúp em, em cảm ơn
Tôi không kiểm tra kỹ nên để xảy ra thiếu sót, bạn thông cảm nhé. Thế cho nên mới nói bạn phải kiểm tra thật kỹ.
1/Bạn thay dòng erow = Rng.Rows.Count (ở gần cuối Sub) thành erow = Rng.Rows.Count + 1 và chạy thử.
2/Còn chỗ Trung bình của "Đôi/h" thì có phải là Tổng "Số lượng"/ Tổng "Đôi/h" không?
Số người lấy Max thì tính thế nào?
Bạn thử mô tả chi tiết cách lấy 2 chỉ tiêu này thì code mới làm đúng được tránh làm đi làm lại nhiều lần.
 
  • Thích
Reactions: th7
Upvote 0
Tôi không kiểm tra kỹ nên để xảy ra thiếu sót, bạn thông cảm nhé. Thế cho nên mới nói bạn phải kiểm tra thật kỹ.
1/Bạn thay dòng erow = Rng.Rows.Count (ở gần cuối Sub) thành erow = Rng.Rows.Count + 1 và chạy thử.
2/Còn chỗ Trung bình của "Đôi/h" thì có phải là Tổng "Số lượng"/ Tổng "Đôi/h" không?
Số người lấy Max thì tính thế nào?
Bạn thử mô tả chi tiết cách lấy 2 chỉ tiêu này thì code mới làm đúng được tránh làm đi làm lại nhiều lần.
Cảm ơn anh/Chị,
+ tính trung bình cho cột "Đôi/h" thì lấy trung bình của cột đó.
+ Tính max thì tính max ở cột số người thôi ạ.
1645840017245.png
 
Upvote 0
Cảm ơn anh/Chị,
+ tính trung bình cho cột "Đôi/h" thì lấy trung bình của cột đó.
+ Tính max thì tính max ở cột số người thôi ạ.
View attachment 272489
Bạn thay code cũ bằng code này nhé.
Mã:
Sub XYZ()
Dim i&, j&, k&, Lr&, R&, C&, DongTong&
Dim Arr(), KQ(), HT(), CONG()
Dim Tu As Date, Den As Date
Dim Key, Tmp, Keys
Dim Dic As Object, DicH  As Object, DicChuyen As Object
Dim Sh As Worksheet, Ws As Worksheet

Set Sh = Sheets("0219")
Lr = Sh.Cells(Rows.Count, 2).End(3).Row
Arr = Sh.Range("B6:G" & Lr).Value
R = UBound(Arr)
Set DicChuyen = CreateObject("Scripting.Dictionary")
For i = 1 To R
    If Not DicChuyen.Exists(Arr(i, 1)) Then n = n + 1: DicChuyen.Add (Arr(i, 1)), n
Next i

Set Ws = Sheets("STD")
Ld = Ws.Cells(Rows.Count, 2).End(3).Row
ArrN = Ws.Range("B4:I" & Ld).Value
Set DicH = CreateObject("Scripting.Dictionary")
ReDim HT(1 To UBound(ArrN), 1 To 2)
For i = 1 To UBound(ArrN)
Tmp = ArrN(i, 1) & "\" & ArrN(i, 7)
    If Not DicH.Exists(Tmp) Then
        k = k + 1: DicH.Add (Tmp), k
        HT(k, 1) = ArrN(i, 1)
        HT(k, 2) = ArrN(i, 8)
    End If
Next i
 Set WsS = Sheets("summary")
C = WsS.Cells(2, Columns.Count).End(xlToLeft).Column
WsS.Cells(4, 1).Resize(1000, C).ClearContents
WsS.Cells(4, 1).Resize(1000, C).Font.Bold = False
For Each Keys In DicChuyen.Keys
    Set Rng = WsS.Range("B2").CurrentRegion
    irow = Rng.Rows.Count + 1
    WsS.Cells(irow, 1) = Keys
        ReDim CONG(1 To 1, 1 To C)
            For j = 2 To C Step 5
                ReDim KQ(1 To R, 1 To 5)
                Tu = CDate(WsS.Cells(2, j + 1)) - 1
                Den = CDate(WsS.Cells(2, j + 4)) + 1
                t = 0
                Set Dic = CreateObject("Scripting.Dictionary")
                For i = 1 To R
                    If CDate(Arr(i, 4)) > Tu And CDate(Arr(i, 4)) < Den Then
                        If Arr(i, 1) = Keys Then
                            Key = Arr(i, 1) & Arr(i, 2)
                            Temp = Arr(i, 2) & "\" & WsS.[G1]
                            If Not Dic.Exists(Key) Then
                                t = t + 1: Dic.Add (Key), t
                                KQ(t, 1) = Arr(i, 2)
                                KQ(t, 2) = Arr(i, 6)
                                KQ(t, 3) = Arr(i, 3)
                                KQ(t, 4) = Arr(i, 5)
                                If DicH.Exists(Temp) Then KQ(t, 5) = HT(DicH.Item(Temp), 2)
                            Else
                                k = Dic.Item(Key)
                                KQ(k, 3) = KQ(k, 3) + Arr(i, 3)
                            End If
                        End If
                    End If
                Next i
                If t Then
                    WsS.Cells(irow, j).Resize(t, 5) = KQ
                    CONG(1, j) = "Total"
                    CONG(1, j + 1) = Application.Sum(WsS.Cells(irow, j + 2).Resize(t))
                    CONG(1, j + 2) = Application.Sum(WsS.Cells(irow, j + 3).Resize(t)) / t
                    CONG(1, j + 3) = Application.Max(WsS.Cells(irow, j + 4).Resize(t))
                End If
                Set Dic = Nothing
            Next j
            
            Set Rng = WsS.Range("B2").CurrentRegion
                      erow = Rng.Rows.Count + 1
            WsS.Cells(erow, 2).Resize(1, C) = CONG
            WsS.Cells(erow, 1).Resize(1, C).Font.Bold = True
Next Keys
Set DicH = Nothing
Set DicChuyen = Nothing
MsgBox "Xong", vbInformation, "THONG BÁO"
End Sub
Thay đổi dữ liệu (thêm bớt, sửa) ==>chạy thử===> kiểm tra kết quả.
 
Upvote 0
Bạn thay code cũ bằng code này nhé.
Mã:
Sub XYZ()
Dim i&, j&, k&, Lr&, R&, C&, DongTong&
Dim Arr(), KQ(), HT(), CONG()
Dim Tu As Date, Den As Date
Dim Key, Tmp, Keys
Dim Dic As Object, DicH  As Object, DicChuyen As Object
Dim Sh As Worksheet, Ws As Worksheet

Set Sh = Sheets("0219")
Lr = Sh.Cells(Rows.Count, 2).End(3).Row
Arr = Sh.Range("B6:G" & Lr).Value
R = UBound(Arr)
Set DicChuyen = CreateObject("Scripting.Dictionary")
For i = 1 To R
    If Not DicChuyen.Exists(Arr(i, 1)) Then n = n + 1: DicChuyen.Add (Arr(i, 1)), n
Next i

Set Ws = Sheets("STD")
Ld = Ws.Cells(Rows.Count, 2).End(3).Row
ArrN = Ws.Range("B4:I" & Ld).Value
Set DicH = CreateObject("Scripting.Dictionary")
ReDim HT(1 To UBound(ArrN), 1 To 2)
For i = 1 To UBound(ArrN)
Tmp = ArrN(i, 1) & "\" & ArrN(i, 7)
    If Not DicH.Exists(Tmp) Then
        k = k + 1: DicH.Add (Tmp), k
        HT(k, 1) = ArrN(i, 1)
        HT(k, 2) = ArrN(i, 8)
    End If
Next i
 Set WsS = Sheets("summary")
C = WsS.Cells(2, Columns.Count).End(xlToLeft).Column
WsS.Cells(4, 1).Resize(1000, C).ClearContents
WsS.Cells(4, 1).Resize(1000, C).Font.Bold = False
For Each Keys In DicChuyen.Keys
    Set Rng = WsS.Range("B2").CurrentRegion
    irow = Rng.Rows.Count + 1
    WsS.Cells(irow, 1) = Keys
        ReDim CONG(1 To 1, 1 To C)
            For j = 2 To C Step 5
                ReDim KQ(1 To R, 1 To 5)
                Tu = CDate(WsS.Cells(2, j + 1)) - 1
                Den = CDate(WsS.Cells(2, j + 4)) + 1
                t = 0
                Set Dic = CreateObject("Scripting.Dictionary")
                For i = 1 To R
                    If CDate(Arr(i, 4)) > Tu And CDate(Arr(i, 4)) < Den Then
                        If Arr(i, 1) = Keys Then
                            Key = Arr(i, 1) & Arr(i, 2)
                            Temp = Arr(i, 2) & "\" & WsS.[G1]
                            If Not Dic.Exists(Key) Then
                                t = t + 1: Dic.Add (Key), t
                                KQ(t, 1) = Arr(i, 2)
                                KQ(t, 2) = Arr(i, 6)
                                KQ(t, 3) = Arr(i, 3)
                                KQ(t, 4) = Arr(i, 5)
                                If DicH.Exists(Temp) Then KQ(t, 5) = HT(DicH.Item(Temp), 2)
                            Else
                                k = Dic.Item(Key)
                                KQ(k, 3) = KQ(k, 3) + Arr(i, 3)
                            End If
                        End If
                    End If
                Next i
                If t Then
                    WsS.Cells(irow, j).Resize(t, 5) = KQ
                    CONG(1, j) = "Total"
                    CONG(1, j + 1) = Application.Sum(WsS.Cells(irow, j + 2).Resize(t))
                    CONG(1, j + 2) = Application.Sum(WsS.Cells(irow, j + 3).Resize(t)) / t
                    CONG(1, j + 3) = Application.Max(WsS.Cells(irow, j + 4).Resize(t))
                End If
                Set Dic = Nothing
            Next j
           
            Set Rng = WsS.Range("B2").CurrentRegion
                      erow = Rng.Rows.Count + 1
            WsS.Cells(erow, 2).Resize(1, C) = CONG
            WsS.Cells(erow, 1).Resize(1, C).Font.Bold = True
Next Keys
Set DicH = Nothing
Set DicChuyen = Nothing
MsgBox "Xong", vbInformation, "THONG BÁO"
End Sub
Thay đổi dữ liệu (thêm bớt, sửa) ==>chạy thử===> kiểm tra kết quả.
cảm ơn anh/chị rất nhiều.
 
Upvote 0
Bạn thay code cũ bằng code này nhé.
Mã:
Sub XYZ()
Dim i&, j&, k&, Lr&, R&, C&, DongTong&
Dim Arr(), KQ(), HT(), CONG()
Dim Tu As Date, Den As Date
Dim Key, Tmp, Keys
Dim Dic As Object, DicH  As Object, DicChuyen As Object
Dim Sh As Worksheet, Ws As Worksheet

Set Sh = Sheets("0219")
Lr = Sh.Cells(Rows.Count, 2).End(3).Row
Arr = Sh.Range("B6:G" & Lr).Value
R = UBound(Arr)
Set DicChuyen = CreateObject("Scripting.Dictionary")
For i = 1 To R
    If Not DicChuyen.Exists(Arr(i, 1)) Then n = n + 1: DicChuyen.Add (Arr(i, 1)), n
Next i

Set Ws = Sheets("STD")
Ld = Ws.Cells(Rows.Count, 2).End(3).Row
ArrN = Ws.Range("B4:I" & Ld).Value
Set DicH = CreateObject("Scripting.Dictionary")
ReDim HT(1 To UBound(ArrN), 1 To 2)
For i = 1 To UBound(ArrN)
Tmp = ArrN(i, 1) & "\" & ArrN(i, 7)
    If Not DicH.Exists(Tmp) Then
        k = k + 1: DicH.Add (Tmp), k
        HT(k, 1) = ArrN(i, 1)
        HT(k, 2) = ArrN(i, 8)
    End If
Next i
 Set WsS = Sheets("summary")
C = WsS.Cells(2, Columns.Count).End(xlToLeft).Column
WsS.Cells(4, 1).Resize(1000, C).ClearContents
WsS.Cells(4, 1).Resize(1000, C).Font.Bold = False
For Each Keys In DicChuyen.Keys
    Set Rng = WsS.Range("B2").CurrentRegion
    irow = Rng.Rows.Count + 1
    WsS.Cells(irow, 1) = Keys
        ReDim CONG(1 To 1, 1 To C)
            For j = 2 To C Step 5
                ReDim KQ(1 To R, 1 To 5)
                Tu = CDate(WsS.Cells(2, j + 1)) - 1
                Den = CDate(WsS.Cells(2, j + 4)) + 1
                t = 0
                Set Dic = CreateObject("Scripting.Dictionary")
                For i = 1 To R
                    If CDate(Arr(i, 4)) > Tu And CDate(Arr(i, 4)) < Den Then
                        If Arr(i, 1) = Keys Then
                            Key = Arr(i, 1) & Arr(i, 2)
                            Temp = Arr(i, 2) & "\" & WsS.[G1]
                            If Not Dic.Exists(Key) Then
                                t = t + 1: Dic.Add (Key), t
                                KQ(t, 1) = Arr(i, 2)
                                KQ(t, 2) = Arr(i, 6)
                                KQ(t, 3) = Arr(i, 3)
                                KQ(t, 4) = Arr(i, 5)
                                If DicH.Exists(Temp) Then KQ(t, 5) = HT(DicH.Item(Temp), 2)
                            Else
                                k = Dic.Item(Key)
                                KQ(k, 3) = KQ(k, 3) + Arr(i, 3)
                            End If
                        End If
                    End If
                Next i
                If t Then
                    WsS.Cells(irow, j).Resize(t, 5) = KQ
                    CONG(1, j) = "Total"
                    CONG(1, j + 1) = Application.Sum(WsS.Cells(irow, j + 2).Resize(t))
                    CONG(1, j + 2) = Application.Sum(WsS.Cells(irow, j + 3).Resize(t)) / t
                    CONG(1, j + 3) = Application.Max(WsS.Cells(irow, j + 4).Resize(t))
                End If
                Set Dic = Nothing
            Next j
          
            Set Rng = WsS.Range("B2").CurrentRegion
                      erow = Rng.Rows.Count + 1
            WsS.Cells(erow, 2).Resize(1, C) = CONG
            WsS.Cells(erow, 1).Resize(1, C).Font.Bold = True
Next Keys
Set DicH = Nothing
Set DicChuyen = Nothing
MsgBox "Xong", vbInformation, "THONG BÁO"
End Sub
Thay đổi dữ liệu (thêm bớt, sửa) ==>chạy thử===> kiểm tra kết quả.
Chào anh/chị, em có một vấn đề muốn nhờ anh/chị xem giúp em là:
- Nếu số đôi tiêu chuẩn/Ngày không có trong sheet tiêu chuẩn thì sẽ lấy số người theo tiêu chuẩn lớn hơn gần nhất với điều kiện ở ô G1.
1646191992984.png
- em không biết sửa như thế nào cho đúng. em cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Chào anh/chị, em có một vấn đề muốn nhờ anh/chị xem giúp em là:
- Nếu số đôi tiêu chuẩn/Ngày không có trong sheet tiêu chuẩn thì sẽ lấy số người theo tiêu chuẩn lớn hơn gần nhất với điều kiện ở ô G1.
View attachment 272618
- em không biết sửa như thế nào cho đúng. em cảm ơn
Bạn thay code cũ bằng code này:
Mã:
Sub XYZ()
Dim i&, j&, k&, Lr&, R&, C&, DongTong&, M&
Dim Arr(), KQ(), HT(), CONG()
Dim Tu As Date, Den As Date
Dim Key, Tmp, Keys
Dim Dic As Object, DicH  As Object, DicChuyen As Object
Dim Sh As Worksheet, Ws As Worksheet

Set Sh = Sheets("0219")
Lr = Sh.Cells(Rows.Count, 2).End(3).Row
Arr = Sh.Range("B6:G" & Lr).Value
R = UBound(Arr)
Set DicChuyen = CreateObject("Scripting.Dictionary")
For i = 1 To R
    If Not DicChuyen.Exists(Arr(i, 1)) Then n = n + 1: DicChuyen.Add (Arr(i, 1)), n
Next i

Set Ws = Sheets("STD")
Ld = Ws.Cells(Rows.Count, 2).End(3).Row
ArrN = Ws.Range("B4:I" & Ld).Value
Set DicH = CreateObject("Scripting.Dictionary")
ReDim HT(1 To UBound(ArrN), 1 To 2)
For i = 1 To UBound(ArrN)
Tmp = ArrN(i, 1) & "|" & ArrN(i, 7)
    If Not DicH.Exists(Tmp) Then
        k = k + 1: DicH.Add (Tmp), k
        HT(k, 1) = ArrN(i, 1)
        HT(k, 2) = ArrN(i, 8)
    End If
Next i
 Set WsS = Sheets("summary")
C = WsS.Cells(2, Columns.Count).End(xlToLeft).Column
WsS.Cells(4, 1).Resize(1000, C).ClearContents
WsS.Cells(4, 1).Resize(1000, C).Font.Bold = False
For Each Keys In DicChuyen.Keys
    Set Rng = WsS.Range("B2").CurrentRegion
    irow = Rng.Rows.Count + 1
    WsS.Cells(irow, 1) = Keys
        ReDim CONG(1 To 1, 1 To C)
            For j = 2 To C Step 5
                ReDim KQ(1 To R, 1 To 5)
                Tu = CDate(WsS.Cells(2, j + 1)) - 1
                Den = CDate(WsS.Cells(2, j + 4)) + 1
                t = 0
                Set Dic = CreateObject("Scripting.Dictionary")
                For i = 1 To R
                    If CDate(Arr(i, 4)) > Tu And CDate(Arr(i, 4)) < Den Then
                        If Arr(i, 1) = Keys Then
                            Key = Arr(i, 1) & Arr(i, 2)
                            M = WsS.[G1]
                            Temp = Arr(i, 2) & "|" & WsS.[G1]
                            If Not Dic.Exists(Key) Then
                                t = t + 1: Dic.Add (Key), t
                                KQ(t, 1) = Arr(i, 2)
                                KQ(t, 2) = Arr(i, 6)
                                KQ(t, 3) = Arr(i, 3)
                                KQ(t, 4) = Arr(i, 5)
                                 If DicH.Exists(Temp) Then
                                     KQ(t, 5) = HT(DicH.Item(Temp), 2)
                                 Else
                                    For ii = 1 To UBound(ArrN, 1)
                                        If ArrN(ii, 1) = Arr(i, 2) Then
                                            If Abs(ArrN(ii, 7) - WsS.[G1]) < M Then
                                                M = Abs(ArrN(ii, 7) - WsS.[G1])
                                                KQ(t, 5) = ArrN(ii, 8)
                                            End If
                                        End If
                                    Next ii
                                 End If
                            Else
                                k = Dic.Item(Key)
                                KQ(k, 3) = KQ(k, 3) + Arr(i, 3)
                            End If
                        End If
                    End If
                Next i
                If t Then
                    WsS.Cells(irow, j).Resize(t, 5) = KQ
                    CONG(1, j) = "Total"
                    CONG(1, j + 1) = Application.Sum(WsS.Cells(irow, j + 2).Resize(t))
                    CONG(1, j + 2) = Application.Sum(WsS.Cells(irow, j + 3).Resize(t)) / t
                    CONG(1, j + 3) = Application.Max(WsS.Cells(irow, j + 4).Resize(t))
                End If
                Set Dic = Nothing
            Next j
            
            Set Rng = WsS.Range("B2").CurrentRegion
                      erow = Rng.Rows.Count + 1
            WsS.Cells(erow, 2).Resize(1, C) = CONG
            WsS.Cells(erow, 1).Resize(1, C).Font.Bold = True
Next Keys
Set DicH = Nothing
Set DicChuyen = Nothing
MsgBox "Xong", vbInformation, "THONG BÁO"
End Sub
 
Upvote 0
Bạn thay code cũ bằng code này:
Mã:
Sub XYZ()
Dim i&, j&, k&, Lr&, R&, C&, DongTong&, M&
Dim Arr(), KQ(), HT(), CONG()
Dim Tu As Date, Den As Date
Dim Key, Tmp, Keys
Dim Dic As Object, DicH  As Object, DicChuyen As Object
Dim Sh As Worksheet, Ws As Worksheet

Set Sh = Sheets("0219")
Lr = Sh.Cells(Rows.Count, 2).End(3).Row
Arr = Sh.Range("B6:G" & Lr).Value
R = UBound(Arr)
Set DicChuyen = CreateObject("Scripting.Dictionary")
For i = 1 To R
    If Not DicChuyen.Exists(Arr(i, 1)) Then n = n + 1: DicChuyen.Add (Arr(i, 1)), n
Next i

Set Ws = Sheets("STD")
Ld = Ws.Cells(Rows.Count, 2).End(3).Row
ArrN = Ws.Range("B4:I" & Ld).Value
Set DicH = CreateObject("Scripting.Dictionary")
ReDim HT(1 To UBound(ArrN), 1 To 2)
For i = 1 To UBound(ArrN)
Tmp = ArrN(i, 1) & "|" & ArrN(i, 7)
    If Not DicH.Exists(Tmp) Then
        k = k + 1: DicH.Add (Tmp), k
        HT(k, 1) = ArrN(i, 1)
        HT(k, 2) = ArrN(i, 8)
    End If
Next i
 Set WsS = Sheets("summary")
C = WsS.Cells(2, Columns.Count).End(xlToLeft).Column
WsS.Cells(4, 1).Resize(1000, C).ClearContents
WsS.Cells(4, 1).Resize(1000, C).Font.Bold = False
For Each Keys In DicChuyen.Keys
    Set Rng = WsS.Range("B2").CurrentRegion
    irow = Rng.Rows.Count + 1
    WsS.Cells(irow, 1) = Keys
        ReDim CONG(1 To 1, 1 To C)
            For j = 2 To C Step 5
                ReDim KQ(1 To R, 1 To 5)
                Tu = CDate(WsS.Cells(2, j + 1)) - 1
                Den = CDate(WsS.Cells(2, j + 4)) + 1
                t = 0
                Set Dic = CreateObject("Scripting.Dictionary")
                For i = 1 To R
                    If CDate(Arr(i, 4)) > Tu And CDate(Arr(i, 4)) < Den Then
                        If Arr(i, 1) = Keys Then
                            Key = Arr(i, 1) & Arr(i, 2)
                            M = WsS.[G1]
                            Temp = Arr(i, 2) & "|" & WsS.[G1]
                            If Not Dic.Exists(Key) Then
                                t = t + 1: Dic.Add (Key), t
                                KQ(t, 1) = Arr(i, 2)
                                KQ(t, 2) = Arr(i, 6)
                                KQ(t, 3) = Arr(i, 3)
                                KQ(t, 4) = Arr(i, 5)
                                 If DicH.Exists(Temp) Then
                                     KQ(t, 5) = HT(DicH.Item(Temp), 2)
                                 Else
                                    For ii = 1 To UBound(ArrN, 1)
                                        If ArrN(ii, 1) = Arr(i, 2) Then
                                            If Abs(ArrN(ii, 7) - WsS.[G1]) < M Then
                                                M = Abs(ArrN(ii, 7) - WsS.[G1])
                                                KQ(t, 5) = ArrN(ii, 8)
                                            End If
                                        End If
                                    Next ii
                                 End If
                            Else
                                k = Dic.Item(Key)
                                KQ(k, 3) = KQ(k, 3) + Arr(i, 3)
                            End If
                        End If
                    End If
                Next i
                If t Then
                    WsS.Cells(irow, j).Resize(t, 5) = KQ
                    CONG(1, j) = "Total"
                    CONG(1, j + 1) = Application.Sum(WsS.Cells(irow, j + 2).Resize(t))
                    CONG(1, j + 2) = Application.Sum(WsS.Cells(irow, j + 3).Resize(t)) / t
                    CONG(1, j + 3) = Application.Max(WsS.Cells(irow, j + 4).Resize(t))
                End If
                Set Dic = Nothing
            Next j
           
            Set Rng = WsS.Range("B2").CurrentRegion
                      erow = Rng.Rows.Count + 1
            WsS.Cells(erow, 2).Resize(1, C) = CONG
            WsS.Cells(erow, 1).Resize(1, C).Font.Bold = True
Next Keys
Set DicH = Nothing
Set DicChuyen = Nothing
MsgBox "Xong", vbInformation, "THONG BÁO"
End Sub
cảm ơn anh rất nhiều
 
Upvote 0
Bạn thay code cũ bằng code này:
Mã:
Sub XYZ()
Dim i&, j&, k&, Lr&, R&, C&, DongTong&, M&
Dim Arr(), KQ(), HT(), CONG()
Dim Tu As Date, Den As Date
Dim Key, Tmp, Keys
Dim Dic As Object, DicH  As Object, DicChuyen As Object
Dim Sh As Worksheet, Ws As Worksheet

Set Sh = Sheets("0219")
Lr = Sh.Cells(Rows.Count, 2).End(3).Row
Arr = Sh.Range("B6:G" & Lr).Value
R = UBound(Arr)
Set DicChuyen = CreateObject("Scripting.Dictionary")
For i = 1 To R
    If Not DicChuyen.Exists(Arr(i, 1)) Then n = n + 1: DicChuyen.Add (Arr(i, 1)), n
Next i

Set Ws = Sheets("STD")
Ld = Ws.Cells(Rows.Count, 2).End(3).Row
ArrN = Ws.Range("B4:I" & Ld).Value
Set DicH = CreateObject("Scripting.Dictionary")
ReDim HT(1 To UBound(ArrN), 1 To 2)
For i = 1 To UBound(ArrN)
Tmp = ArrN(i, 1) & "|" & ArrN(i, 7)
    If Not DicH.Exists(Tmp) Then
        k = k + 1: DicH.Add (Tmp), k
        HT(k, 1) = ArrN(i, 1)
        HT(k, 2) = ArrN(i, 8)
    End If
Next i
 Set WsS = Sheets("summary")
C = WsS.Cells(2, Columns.Count).End(xlToLeft).Column
WsS.Cells(4, 1).Resize(1000, C).ClearContents
WsS.Cells(4, 1).Resize(1000, C).Font.Bold = False
For Each Keys In DicChuyen.Keys
    Set Rng = WsS.Range("B2").CurrentRegion
    irow = Rng.Rows.Count + 1
    WsS.Cells(irow, 1) = Keys
        ReDim CONG(1 To 1, 1 To C)
            For j = 2 To C Step 5
                ReDim KQ(1 To R, 1 To 5)
                Tu = CDate(WsS.Cells(2, j + 1)) - 1
                Den = CDate(WsS.Cells(2, j + 4)) + 1
                t = 0
                Set Dic = CreateObject("Scripting.Dictionary")
                For i = 1 To R
                    If CDate(Arr(i, 4)) > Tu And CDate(Arr(i, 4)) < Den Then
                        If Arr(i, 1) = Keys Then
                            Key = Arr(i, 1) & Arr(i, 2)
                            M = WsS.[G1]
                            Temp = Arr(i, 2) & "|" & WsS.[G1]
                            If Not Dic.Exists(Key) Then
                                t = t + 1: Dic.Add (Key), t
                                KQ(t, 1) = Arr(i, 2)
                                KQ(t, 2) = Arr(i, 6)
                                KQ(t, 3) = Arr(i, 3)
                                KQ(t, 4) = Arr(i, 5)
                                 If DicH.Exists(Temp) Then
                                     KQ(t, 5) = HT(DicH.Item(Temp), 2)
                                 Else
                                    For ii = 1 To UBound(ArrN, 1)
                                        If ArrN(ii, 1) = Arr(i, 2) Then
                                            If Abs(ArrN(ii, 7) - WsS.[G1]) < M Then
                                                M = Abs(ArrN(ii, 7) - WsS.[G1])
                                                KQ(t, 5) = ArrN(ii, 8)
                                            End If
                                        End If
                                    Next ii
                                 End If
                            Else
                                k = Dic.Item(Key)
                                KQ(k, 3) = KQ(k, 3) + Arr(i, 3)
                            End If
                        End If
                    End If
                Next i
                If t Then
                    WsS.Cells(irow, j).Resize(t, 5) = KQ
                    CONG(1, j) = "Total"
                    CONG(1, j + 1) = Application.Sum(WsS.Cells(irow, j + 2).Resize(t))
                    CONG(1, j + 2) = Application.Sum(WsS.Cells(irow, j + 3).Resize(t)) / t
                    CONG(1, j + 3) = Application.Max(WsS.Cells(irow, j + 4).Resize(t))
                End If
                Set Dic = Nothing
            Next j
          
            Set Rng = WsS.Range("B2").CurrentRegion
                      erow = Rng.Rows.Count + 1
            WsS.Cells(erow, 2).Resize(1, C) = CONG
            WsS.Cells(erow, 1).Resize(1, C).Font.Bold = True
Next Keys
Set DicH = Nothing
Set DicChuyen = Nothing
MsgBox "Xong", vbInformation, "THONG BÁO"
End Sub
Dạ chào anh, sau thì áp dụng đoạn code mà anh hỗ trợ rất tốt. và e có cải tiến thêm báo cáo nhưng không biết sửa để lấy tiêu chuẩn về số người:
+ lấy chuyền/ hình thể/kiểu giày/số lượng, đôi/h thì vẫn giữ như cũ.
+ em lược bỏ đi tiêu chuẩn đôi ở ô G1.
+ Thay đổi cách lấy tiêu chuẩn: dựa vào số đôi/h vừa lấy ra để dò trong sheet Standard_2 lớn hơn gần nhất, sheet "May" thì lấy tiêu chuẩn cột May, sheet "Thanh Pham" thi lấy tiêu chuẩn cột thành phẩm tương ứng với hình thể.

Chân thành cảm ơn anh ạ.
 

File đính kèm

  • GPE TRO GIUP.xlsb
    239.4 KB · Đọc: 9
Lần chỉnh sửa cuối:
Upvote 0
Bạn thay code cũ bằng code này:
Mã:
Sub XYZ()
Dim i&, j&, k&, Lr&, R&, C&, DongTong&, M&
Dim Arr(), KQ(), HT(), CONG()
Dim Tu As Date, Den As Date
Dim Key, Tmp, Keys
Dim Dic As Object, DicH  As Object, DicChuyen As Object
Dim Sh As Worksheet, Ws As Worksheet

Set Sh = Sheets("0219")
Lr = Sh.Cells(Rows.Count, 2).End(3).Row
Arr = Sh.Range("B6:G" & Lr).Value
R = UBound(Arr)
Set DicChuyen = CreateObject("Scripting.Dictionary")
For i = 1 To R
    If Not DicChuyen.Exists(Arr(i, 1)) Then n = n + 1: DicChuyen.Add (Arr(i, 1)), n
Next i

Set Ws = Sheets("STD")
Ld = Ws.Cells(Rows.Count, 2).End(3).Row
ArrN = Ws.Range("B4:I" & Ld).Value
Set DicH = CreateObject("Scripting.Dictionary")
ReDim HT(1 To UBound(ArrN), 1 To 2)
For i = 1 To UBound(ArrN)
Tmp = ArrN(i, 1) & "|" & ArrN(i, 7)
    If Not DicH.Exists(Tmp) Then
        k = k + 1: DicH.Add (Tmp), k
        HT(k, 1) = ArrN(i, 1)
        HT(k, 2) = ArrN(i, 8)
    End If
Next i
 Set WsS = Sheets("summary")
C = WsS.Cells(2, Columns.Count).End(xlToLeft).Column
WsS.Cells(4, 1).Resize(1000, C).ClearContents
WsS.Cells(4, 1).Resize(1000, C).Font.Bold = False
For Each Keys In DicChuyen.Keys
    Set Rng = WsS.Range("B2").CurrentRegion
    irow = Rng.Rows.Count + 1
    WsS.Cells(irow, 1) = Keys
        ReDim CONG(1 To 1, 1 To C)
            For j = 2 To C Step 5
                ReDim KQ(1 To R, 1 To 5)
                Tu = CDate(WsS.Cells(2, j + 1)) - 1
                Den = CDate(WsS.Cells(2, j + 4)) + 1
                t = 0
                Set Dic = CreateObject("Scripting.Dictionary")
                For i = 1 To R
                    If CDate(Arr(i, 4)) > Tu And CDate(Arr(i, 4)) < Den Then
                        If Arr(i, 1) = Keys Then
                            Key = Arr(i, 1) & Arr(i, 2)
                            M = WsS.[G1]
                            Temp = Arr(i, 2) & "|" & WsS.[G1]
                            If Not Dic.Exists(Key) Then
                                t = t + 1: Dic.Add (Key), t
                                KQ(t, 1) = Arr(i, 2)
                                KQ(t, 2) = Arr(i, 6)
                                KQ(t, 3) = Arr(i, 3)
                                KQ(t, 4) = Arr(i, 5)
                                 If DicH.Exists(Temp) Then
                                     KQ(t, 5) = HT(DicH.Item(Temp), 2)
                                 Else
                                    For ii = 1 To UBound(ArrN, 1)
                                        If ArrN(ii, 1) = Arr(i, 2) Then
                                            If Abs(ArrN(ii, 7) - WsS.[G1]) < M Then
                                                M = Abs(ArrN(ii, 7) - WsS.[G1])
                                                KQ(t, 5) = ArrN(ii, 8)
                                            End If
                                        End If
                                    Next ii
                                 End If
                            Else
                                k = Dic.Item(Key)
                                KQ(k, 3) = KQ(k, 3) + Arr(i, 3)
                            End If
                        End If
                    End If
                Next i
                If t Then
                    WsS.Cells(irow, j).Resize(t, 5) = KQ
                    CONG(1, j) = "Total"
                    CONG(1, j + 1) = Application.Sum(WsS.Cells(irow, j + 2).Resize(t))
                    CONG(1, j + 2) = Application.Sum(WsS.Cells(irow, j + 3).Resize(t)) / t
                    CONG(1, j + 3) = Application.Max(WsS.Cells(irow, j + 4).Resize(t))
                End If
                Set Dic = Nothing
            Next j
           
            Set Rng = WsS.Range("B2").CurrentRegion
                      erow = Rng.Rows.Count + 1
            WsS.Cells(erow, 2).Resize(1, C) = CONG
            WsS.Cells(erow, 1).Resize(1, C).Font.Bold = True
Next Keys
Set DicH = Nothing
Set DicChuyen = Nothing
MsgBox "Xong", vbInformation, "THONG BÁO"
End Sub
Chào bạn @HUONGHCKT . Vẫn tích cực với diễn đàn như ngày nào nhỉ.
 
Upvote 0
Dạ chào anh, sau thì áp dụng đoạn code mà anh hỗ trợ rất tốt. và e có cải tiến thêm báo cáo nhưng không biết sửa để lấy tiêu chuẩn về số người:
+ lấy chuyền/ hình thể/kiểu giày/số lượng, đôi/h thì vẫn giữ như cũ.
+ em lược bỏ đi tiêu chuẩn đôi ở ô G1.
+ Thay đổi cách lấy tiêu chuẩn: dựa vào số đôi/h vừa lấy ra để dò trong sheet Standard_2 lớn hơn gần nhất, sheet "May" thì lấy tiêu chuẩn cột May, sheet "Thanh Pham" thi lấy tiêu chuẩn cột thành phẩm tương ứng với hình thể.

Chân thành cảm ơn anh ạ.
Bạn chạy code cũ của tôi thấy thế nào?Có đúng kết quả mong muốn không mà không hấy báo lại?
Còn giờ thì tôi đã xem file và căng não ra mà không biết bạn định gì?
Bạn viết "...dựa vào số đôi/h vừa lấy ra để dò trong sheet Standard_2 lớn hơn gần nhất ...) thì là dò dòng hoặc cột nào? tôi hiểu là các ô E4:E.../shMAY để để dò trong dòng BB2:BS2/sheet Standard_2 . "..lớn hơn gần nhất..." là so với cái gì với cái gì? "...thi lấy tiêu chuẩn cột thành phẩm... ". Tiêu chuẩn gì? ở cột nào? Cột nào là cột Thành phẩm? "tương ứng với hình thể." là tương ứng với dòng nào (cột A) của Sh Standa? khi mà cột A có đến gần 200 dòng và có nhiều dòng trùng nhau (cả cột A và B).
Tốt nhất là bạn làm tay kết quả mong muốn (mô tả rõ cách lấy dữ liệu (tiêu chuẩn thế nào để lấy dữ liệu của dòng,cột nào....) có như vậy mới dễ hình dung để code.
Bài đã được tự động gộp:

Chào bạn @HUONGHCKT . Vẫn tích cực với diễn đàn như ngày nào nhỉ.
Cảm ơn Anh đã quan tâm! Ở nhà chống dịch nên có thời gian dỗi. Giờ thì được thăng cấp (f0) rồi ngồi buồn lại dạo trên diễn đàn để học hỏi thêm.
Còn Anh bấy lâu nay cũng thấy vắng mặt, hay là bận không có thời gian?
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Web KT

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

Back
Top Bottom