Nhờ viết code tổng hợp dữ liệu từ sheet này sang sheet khác theo điều kiện

Liên hệ QC

tranquynh.81

Thành viên mới
Tham gia
21/1/21
Bài viết
11
Được thích
3
kính chào các anh các chị!
em có file trong file có 3 sheet , mình cần copy 3 sheet vào 1 sheet tổng hợp , điều kiện nếu giống cột số thứ tự (stt trong file ) thì copy các dòng từ sst đó . ví dụ stt 151 thì copy các dòng từ stt 151 đến truoéc dòng 152 . trong file em có sheet kết quả .
mong các anh chị giúp đỡ.
cảm ơn a/c nhiều
 

File đính kèm

  • DC+md+kd 15.8.21 (HOI VBA).xlsx
    318.4 KB · Đọc: 28
Tôi thấy với code của bạn thì vấn đề các STT chỉ có 1 dòng vẫn chưa được đưa vào kết quả, trong khi nó vẫn phải được đưa vào chứ. Còn với chủ thớt thì chẳng biết thế nào, hay là anh ta chỉ cần làm với mấy cài STT có nhiều dòng chi tiết đó?!
đúng rồi @Maika8008 , những dòng chưa có chi tiết do mình chưa diễn giải chi tiết, tại số lượng dòng lớn quá 15000 dòng 1 sheet, nên mình làm đến đâu hỏi đến đó, các code của các bạn giúp mình được rất nhiều, không phải ngồi copy từng dòng. khi nào mình khúc mắc chỗ nào mong các bạn giúp đỡ . thanks all!
 
Upvote 0
Các ơn các bạn HUONGHCKT, Maika8008, Vanthinh3101, HieuCD rất nhiều đã giúp đỡ mình. Chứ không mình copy 15000 dòng chắc xỉu. VBA thật tuyệt.

đúng rồi @Maika8008 , những dòng chưa có chi tiết do mình chưa diễn giải chi tiết, tại số lượng dòng lớn quá 15000 dòng 1 sheet, nên mình làm đến đâu hỏi đến đó, các code của các bạn giúp mình được rất nhiều, không phải ngồi copy từng dòng. khi nào mình khúc mắc chỗ nào mong các bạn giúp đỡ . thanks all!
Bạn thử hết các trường hợp với code này xem nhé (tôi đã thử, với các trường hợp đã phát hiện ở các bài trên thì đã ra được kết quả đúng. Biết đâu có những tình huống khác tôi chưa lường hết).

Tôi dùng mảng và sau khi chép dữ liệu thì kẻ viền và định dạng kiểu số bằng VBA cho giống với dữ liệu nguồn. Không định dạng đậm hoặc tô màu.
Rich (BB code):
Sub Copy_Theo_STT()
Dim wsh As Object
Dim Sh As Object
Dim lR&, d&, k&, j&, i&, x&
Dim tmr#, arr, arrkq, Bdr
tmr = Timer()
Application.ScreenUpdating = False
Set Sh = Sheets("KET QUA")
ReDim arrkq(1 To 5000, 1 To 12)
For i = 2 To Sh.Cells(Rows.Count, 16).End(xlUp).Row
    x = 1
    For Each wsh In ThisWorkbook.Worksheets
        If wsh.Name <> "KET QUA" Then
            arr = wsh.Range("A2:L" & wsh.Range("B" & Rows.Count).End(xlUp).Row)
            For j = 1 To UBound(arr)
                If arr(j, 1) = Sh.Cells(i, 16) Then
                    If Len(arr(j + 1, 1)) = 0 Then
                        On Error Resume Next
                        If x = 1 Then
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR - 1, k)
                                Next
                            Loop Until Len(arr(j + lR, 1)) > 0
                        Else
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR, k)
                                Next
                            Loop Until Len(arr(j + lR + 1, 1)) > 0
                        End If
                        On Error GoTo 0
                        lR = 0: Exit For
                    Else
                        d = d + 1
                        For k = 1 To UBound(arr, 2)
                            arrkq(d, k) = arr(j, k)
                        Next
                        Exit For
                    End If
                End If
            Next
        End If
    x = x + 1
    Next wsh
Next i
Sh.Range("A2:L5000").Clear
Sh.Range("A2").Resize(d, 12) = arrkq
With Sh.Range("A2:L" & d + 1)
    .Font.Name = "Times New Roman"
    .Font.Size = 12
    For Each Bdr In Array(xlLeft, xlRight, xlTop, xlBottom, xlInsideVertical)
        .Borders(Bdr).Weight = xlThin
    Next
    .Borders(xlInsideHorizontal).Weight = xlHairline
End With
Sh.Range("D2:H" & d + 1).NumberFormat = "#,##0.00"
Sh.Range("I2:L" & d + 1).NumberFormat = "#,##0.000"
Application.ScreenUpdating = True
MsgBox " Xong" & vbNewLine & Timer() - tmr
End Sub
 
Upvote 0
Bạn thử hết các trường hợp với code này xem nhé (tôi đã thử, với các trường hợp đã phát hiện ở các bài trên thì đã ra được kết quả đúng. Biết đâu có những tình huống khác tôi chưa lường hết).

Tôi dùng mảng và sau khi chép dữ liệu thì kẻ viền và định dạng kiểu số bằng VBA cho giống với dữ liệu nguồn. Không định dạng đậm hoặc tô màu.
Rich (BB code):
Sub Copy_Theo_STT()
Dim wsh As Object
Dim Sh As Object
Dim lR&, d&, k&, j&, i&, x&
Dim tmr#, arr, arrkq, Bdr
tmr = Timer()
Application.ScreenUpdating = False
Set Sh = Sheets("KET QUA")
ReDim arrkq(1 To 5000, 1 To 12)
For i = 2 To Sh.Cells(Rows.Count, 16).End(xlUp).Row
    x = 1
    For Each wsh In ThisWorkbook.Worksheets
        If wsh.Name <> "KET QUA" Then
            arr = wsh.Range("A2:L" & wsh.Range("B" & Rows.Count).End(xlUp).Row)
            For j = 1 To UBound(arr)
                If arr(j, 1) = Sh.Cells(i, 16) Then
                    If Len(arr(j + 1, 1)) = 0 Then
                        On Error Resume Next
                        If x = 1 Then
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR - 1, k)
                                Next
                            Loop Until Len(arr(j + lR, 1)) > 0
                        Else
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR, k)
                                Next
                            Loop Until Len(arr(j + lR + 1, 1)) > 0
                        End If
                        On Error GoTo 0
                        lR = 0: Exit For
                    Else
                        d = d + 1
                        For k = 1 To UBound(arr, 2)
                            arrkq(d, k) = arr(j, k)
                        Next
                        Exit For
                    End If
                End If
            Next
        End If
    x = x + 1
    Next wsh
Next i
Sh.Range("A2:L5000").Clear
Sh.Range("A2").Resize(d, 12) = arrkq
With Sh.Range("A2:L" & d + 1)
    .Font.Name = "Times New Roman"
    .Font.Size = 12
    For Each Bdr In Array(xlLeft, xlRight, xlTop, xlBottom, xlInsideVertical)
        .Borders(Bdr).Weight = xlThin
    Next
    .Borders(xlInsideHorizontal).Weight = xlHairline
End With
Sh.Range("D2:H" & d + 1).NumberFormat = "#,##0.00"
Sh.Range("I2:L" & d + 1).NumberFormat = "#,##0.000"
Application.ScreenUpdating = True
MsgBox " Xong" & vbNewLine & Timer() - tmr
End Sub
Với P2=151, kết quả 3 cột cuối chỉ có dòng đầu, thiếu kết quả zone 2 và 3
 
Upvote 0
Bạn thử hết các trường hợp với code này xem nhé (tôi đã thử, với các trường hợp đã phát hiện ở các bài trên thì đã ra được kết quả đúng. Biết đâu có những tình huống khác tôi chưa lường hết).

Tôi dùng mảng và sau khi chép dữ liệu thì kẻ viền và định dạng kiểu số bằng VBA cho giống với dữ liệu nguồn. Không định dạng đậm hoặc tô màu.
Rich (BB code):
Sub Copy_Theo_STT()
Dim wsh As Object
Dim Sh As Object
Dim lR&, d&, k&, j&, i&, x&
Dim tmr#, arr, arrkq, Bdr
tmr = Timer()
Application.ScreenUpdating = False
Set Sh = Sheets("KET QUA")
ReDim arrkq(1 To 5000, 1 To 12)
For i = 2 To Sh.Cells(Rows.Count, 16).End(xlUp).Row
    x = 1
    For Each wsh In ThisWorkbook.Worksheets
        If wsh.Name <> "KET QUA" Then
            arr = wsh.Range("A2:L" & wsh.Range("B" & Rows.Count).End(xlUp).Row)
            For j = 1 To UBound(arr)
                If arr(j, 1) = Sh.Cells(i, 16) Then
                    If Len(arr(j + 1, 1)) = 0 Then
                        On Error Resume Next
                        If x = 1 Then
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR - 1, k)
                                Next
                            Loop Until Len(arr(j + lR, 1)) > 0
                        Else
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR, k)
                                Next
                            Loop Until Len(arr(j + lR + 1, 1)) > 0
                        End If
                        On Error GoTo 0
                        lR = 0: Exit For
                    Else
                        d = d + 1
                        For k = 1 To UBound(arr, 2)
                            arrkq(d, k) = arr(j, k)
                        Next
                        Exit For
                    End If
                End If
            Next
        End If
    x = x + 1
    Next wsh
Next i
Sh.Range("A2:L5000").Clear
Sh.Range("A2").Resize(d, 12) = arrkq
With Sh.Range("A2:L" & d + 1)
    .Font.Name = "Times New Roman"
    .Font.Size = 12
    For Each Bdr In Array(xlLeft, xlRight, xlTop, xlBottom, xlInsideVertical)
        .Borders(Bdr).Weight = xlThin
    Next
    .Borders(xlInsideHorizontal).Weight = xlHairline
End With
Sh.Range("D2:H" & d + 1).NumberFormat = "#,##0.00"
Sh.Range("I2:L" & d + 1).NumberFormat = "#,##0.000"
Application.ScreenUpdating = True
MsgBox " Xong" & vbNewLine & Timer() - tmr
End Sub
Và code bị lỗi lặp lại các stt không có diễn giải (ví dụ stt 162,163 lặp lại 2 lần, chỉ cần 1 dòng stt 163, stt 162 )
cảm ơn.
 
Upvote 0
Và code bị lỗi lặp lại các stt không có diễn giải (ví dụ stt 162,163 lặp lại 2 lần, chỉ cần 1 dòng stt 163, stt 162 )
cảm ơn.
Haha, đó là tôi không hiểu cần phải làm như bạn nói nên cố làm kết quả ra như vậy chứ không phải code lỗi.
 
Upvote 0
bạn @Maika8008 sửa lại code lại giúp mình được không ?
Với lại bạn cho mình hỏi , trong code của bạn làm sao giữ nguyên hàm sum trong diễn giải được không ?
cảm ơn bạn trước
 
Upvote 0
bạn @Maika8008 sửa lại code lại giúp mình được không ?
Với lại bạn cho mình hỏi , trong code của bạn làm sao giữ nguyên hàm sum trong diễn giải được không ?
cảm ơn bạn trước
Thêm 2 dòng để loại 2 kết quả lặp lại như bài #25:
Rich (BB code):
Sub Copy_Theo_STT()
Dim wsh As Object
Dim Sh As Object
Dim lR&, d&, k&, j&, i&, x&
Dim tmr#, arr, arrkq, Bdr
tmr = Timer()
Application.ScreenUpdating = False
Set Sh = Sheets("KET QUA")
ReDim arrkq(1 To 5000, 1 To 12)
For i = 2 To Sh.Cells(Rows.Count, 16).End(xlUp).Row
    x = 1
    For Each wsh In ThisWorkbook.Worksheets
        If wsh.Name <> "KET QUA" Then
            arr = wsh.Range("A2:L" & wsh.Range("B" & Rows.Count).End(xlUp).Row)
            For j = 1 To UBound(arr)
                If arr(j, 1) = Sh.Cells(i, 16) Then
                    If Len(arr(j + 1, 1)) = 0 Then
                        On Error Resume Next
                        If x = 1 Then
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR - 1, k)
                                Next
                            Loop Until Len(arr(j + lR, 1)) > 0
                        Else
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR, k)
                                Next
                            Loop Until Len(arr(j + lR + 1, 1)) > 0
                        End If
                        On Error GoTo 0
                        lR = 0: Exit For
                    Else
                        If x = 1 Then
                            d = d + 1
                            For k = 1 To UBound(arr, 2)
                                arrkq(d, k) = arr(j, k)
                            Next
                            Exit For
                        End If
                    End If
                End If
            Next
        End If
    x = x + 1
    Next wsh
Next i
Sh.Range("A2:L5000").Clear
Sh.Range("A2").Resize(d, 12) = arrkq
With Sh.Range("A2:L" & d + 1)
    .Font.Name = "Times New Roman"
    .Font.Size = 12
    For Each Bdr In Array(xlLeft, xlRight, xlTop, xlBottom, xlInsideVertical)
        .Borders(Bdr).Weight = xlThin
    Next
    .Borders(xlInsideHorizontal).Weight = xlHairline
End With
Sh.Range("D2:H" & d + 1).NumberFormat = "#,##0.00"
Sh.Range("I2:L" & d + 1).NumberFormat = "#,##0.000"
Application.ScreenUpdating = True
MsgBox " Xong" & vbNewLine & Timer() - tmr
End Sub
Ý bạn là giữ Sum ở cột I - Khối lượng từng phần phải không? Nếu đúng vậy thì bạn cho biết làm vậy để làm gì vì ai cũng hiểu chỗ đó là Sum các dòng dưới rồi.

P/S: tiện thể hỏi luôn: tại sao công thức Sum đó thừa 1 dòng (lấn xuống dòng đầu của STT phía dưới)?
 
Lần chỉnh sửa cuối:
Upvote 0
trước tiên bản ơn bạn @Maika8008 trước nha.
ý 1 : mình muốn giữ hàm sum ở cột I - Khối lượng từng phần vì thuận tiên cho bên cđt kiểm tra số liệu xem có đúng không thôi.
ý 2: công thức sum có dòng thừa vì mình hay chèn thêm phần diễn giải ở dòng dưới , nếu không lại phải kéo lại hàm sum thêm lần nữa , rất mất thời gian .
Bài đã được tự động gộp:

Thêm 2 dòng để loại 2 kết quả lặp lại như bài #25:
Rich (BB code):
Sub Copy_Theo_STT()
Dim wsh As Object
Dim Sh As Object
Dim lR&, d&, k&, j&, i&, x&
Dim tmr#, arr, arrkq, Bdr
tmr = Timer()
Application.ScreenUpdating = False
Set Sh = Sheets("KET QUA")
ReDim arrkq(1 To 5000, 1 To 12)
For i = 2 To Sh.Cells(Rows.Count, 16).End(xlUp).Row
    x = 1
    For Each wsh In ThisWorkbook.Worksheets
        If wsh.Name <> "KET QUA" Then
            arr = wsh.Range("A2:L" & wsh.Range("B" & Rows.Count).End(xlUp).Row)
            For j = 1 To UBound(arr)
                If arr(j, 1) = Sh.Cells(i, 16) Then
                    If Len(arr(j + 1, 1)) = 0 Then
                        On Error Resume Next
                        If x = 1 Then
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR - 1, k)
                                Next
                            Loop Until Len(arr(j + lR, 1)) > 0
                        Else
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR, k)
                                Next
                            Loop Until Len(arr(j + lR + 1, 1)) > 0
                        End If
                        On Error GoTo 0
                        lR = 0: Exit For
                    Else
                        If x = 1 Then
                            d = d + 1
                            For k = 1 To UBound(arr, 2)
                                arrkq(d, k) = arr(j, k)
                            Next
                            Exit For
                        End If
                    End If
                End If
            Next
        End If
    x = x + 1
    Next wsh
Next i
Sh.Range("A2:L5000").Clear
Sh.Range("A2").Resize(d, 12) = arrkq
With Sh.Range("A2:L" & d + 1)
    .Font.Name = "Times New Roman"
    .Font.Size = 12
    For Each Bdr In Array(xlLeft, xlRight, xlTop, xlBottom, xlInsideVertical)
        .Borders(Bdr).Weight = xlThin
    Next
    .Borders(xlInsideHorizontal).Weight = xlHairline
End With
Sh.Range("D2:H" & d + 1).NumberFormat = "#,##0.00"
Sh.Range("I2:L" & d + 1).NumberFormat = "#,##0.000"
Application.ScreenUpdating = True
MsgBox " Xong" & vbNewLine & Timer() - tmr
End Sub
Ý bạn là giữ Sum ở cột I - Khối lượng từng phần phải không? Nếu đúng vậy thì bạn cho biết làm vậy để làm gì vì ai cũng hiểu chỗ đó là Sum các dòng dưới rồi.

P/S: tiện thể hỏi luôn: tại sao công thức Sum đó thừa 1 dòng (lấn xuống dòng đầu của STT phía dưới)?
Code của bạn @Maika8008 chạy rất nhanh. mình có 16 sheet, mỗi sheet 15.000 dòng mà chạy vèo cái là xong
cảm ơn bạn rất nhiều.
 
Lần chỉnh sửa cuối:
Upvote 0
trước tiên bản ơn bạn @Maika8008 trước nha.
ý 1 : mình muốn giữ hàm sum ở cột I - Khối lượng từng phần vì thuận tiên cho bên cđt kiểm tra số liệu xem có đúng không thôi.
ý 2: công thức sum có dòng thừa vì mình hay chèn thêm phần diễn giải ở dòng dưới , nếu không lại phải kéo lại hàm sum thêm lần nữa , rất mất thời gian .
Nếu cần thiết phải như vậy thì bạn thay Sub ở trên bằng 2 Sub bên dưới (Sub chính gọi Sub TaoHamSum để làm theo yêu cầu của bạn), với kết quả có sự thay đổi nho nhỏ so với dữ liệu nguồn, đó là: ô chứa hàm Sum nằm ngang với ô Khối lượng ZONE x ở cột B.

Đồng thời tôi định dạng đậm, nghiêng luôn cho dễ nhìn.

Bạn thử code:
Mã:
Sub Copy_Theo_STT()
Dim wsh As Object
Dim Sh As Object
Dim lR&, d&, k&, j&, i&, x&
Dim tmr#, arr, arrkq, Bdr
tmr = Timer()
Application.ScreenUpdating = False
Set Sh = Sheets("KET QUA")
ReDim arrkq(1 To 5000, 1 To 12)
For i = 2 To Sh.Cells(Rows.Count, 16).End(xlUp).Row
    x = 1
    For Each wsh In ThisWorkbook.Worksheets
        If wsh.Name <> "KET QUA" Then
            arr = wsh.Range("A2:L" & wsh.Range("B" & Rows.Count).End(xlUp).Row)
            For j = 1 To UBound(arr)
                If arr(j, 1) = Sh.Cells(i, 16) Then
                    If Len(arr(j + 1, 1)) = 0 Then
                        On Error Resume Next
                        If x = 1 Then
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR - 1, k)
                                Next
                            Loop Until Len(arr(j + lR, 1)) > 0
                        Else
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR, k)
                                Next
                            Loop Until Len(arr(j + lR + 1, 1)) > 0
                        End If
                        On Error GoTo 0
                        lR = 0: Exit For
                    Else
                        If x = 1 Then
                            d = d + 1
                            For k = 1 To UBound(arr, 2)
                                arrkq(d, k) = arr(j, k)
                            Next
                            Exit For
                        End If
                    End If
                End If
            Next
        End If
    x = x + 1
    Next wsh
Next i
Sh.Range("A2:L5000").Clear
Sh.Range("A2").Resize(d, 12) = arrkq
With Sh.Range("A2:L" & d + 1)
    .Font.Name = "Times New Roman"
    .Font.Size = 12
    For Each Bdr In Array(xlLeft, xlRight, xlTop, xlBottom, xlInsideVertical)
        .Borders(Bdr).Weight = xlThin
    Next
    .Borders(xlInsideHorizontal).Weight = xlHairline
End With
Sh.Range("D2:H" & d + 1).NumberFormat = "#,##0.00"
Sh.Range("I2:L" & d + 1).NumberFormat = "#,##0.000"
Sh.Activate
Call TaoHamSum
Application.ScreenUpdating = True
MsgBox " Xong" & vbNewLine & Timer() - tmr
End Sub

Sub TaoHamSum()
Dim i&, d&, rw&, endR&

endR = Range("I" & Rows.Count).End(xlUp).Row + 1
If Range("J" & Rows.Count).End(xlUp).Row + 1 > endR Then endR = Range("J" & Rows.Count).End(xlUp).Row + 1
For i = 2 To Range("I" & Rows.Count).End(xlUp).Row + 1
    If Range("A" & i) <> "" Then
        Range("A" & i & ":L" & i).Font.Bold = True
    Else
        If Range("I" & i) <> "" And Range("B" & i) = "" Then
            Range("I" & i) = "": d = i + 2: rw = i + 1
            Do Until Range("B" & d + 1) = "" Or Range("A" & d + 1) <> ""
                d = d + 1
            Loop
            i = d
        ElseIf Range("I" & i) <> "" And Left(Range("B" & i), 10) = Sheet4.Range("Q1") Then
            d = i + 1: rw = i
            Do Until Range("B" & d + 1) = "" Or Range("A" & d + 1) <> ""
                d = d + 1
            Loop
            i = d
        End If
        Range("I" & rw).FormulaR1C1 = "=SUM(R[" & 1 & "]C:R[" & d - rw & "]C)"
        Range("B" & rw & ":I" & rw).Font.Bold = True
        Range("B" & rw & ":I" & rw).Font.Italic = True
    End If
Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Thêm 2 dòng để loại 2 kết quả lặp lại như bài #25:
Rich (BB code):
Sub Copy_Theo_STT()
Dim wsh As Object
Dim Sh As Object
Dim lR&, d&, k&, j&, i&, x&
Dim tmr#, arr, arrkq, Bdr
tmr = Timer()
Application.ScreenUpdating = False
Set Sh = Sheets("KET QUA")
ReDim arrkq(1 To 5000, 1 To 12)
For i = 2 To Sh.Cells(Rows.Count, 16).End(xlUp).Row
    x = 1
    For Each wsh In ThisWorkbook.Worksheets
        If wsh.Name <> "KET QUA" Then
            arr = wsh.Range("A2:L" & wsh.Range("B" & Rows.Count).End(xlUp).Row)
            For j = 1 To UBound(arr)
                If arr(j, 1) = Sh.Cells(i, 16) Then
                    If Len(arr(j + 1, 1)) = 0 Then
                        On Error Resume Next
                        If x = 1 Then
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR - 1, k)
                                Next
                            Loop Until Len(arr(j + lR, 1)) > 0
                        Else
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR, k)
                                Next
                            Loop Until Len(arr(j + lR + 1, 1)) > 0
                        End If
                        On Error GoTo 0
                        lR = 0: Exit For
                    Else
                        If x = 1 Then
                            d = d + 1
                            For k = 1 To UBound(arr, 2)
                                arrkq(d, k) = arr(j, k)
                            Next
                            Exit For
                        End If
                    End If
                End If
            Next
        End If
    x = x + 1
    Next wsh
Next i
Sh.Range("A2:L5000").Clear
Sh.Range("A2").Resize(d, 12) = arrkq
With Sh.Range("A2:L" & d + 1)
    .Font.Name = "Times New Roman"
    .Font.Size = 12
    For Each Bdr In Array(xlLeft, xlRight, xlTop, xlBottom, xlInsideVertical)
        .Borders(Bdr).Weight = xlThin
    Next
    .Borders(xlInsideHorizontal).Weight = xlHairline
End With
Sh.Range("D2:H" & d + 1).NumberFormat = "#,##0.00"
Sh.Range("I2:L" & d + 1).NumberFormat = "#,##0.000"
Application.ScreenUpdating = True
MsgBox " Xong" & vbNewLine & Timer() - tmr
End Sub
Ý bạn là giữ Sum ở cột I - Khối lượng từng phần phải không? Nếu đúng vậy thì bạn cho biết làm vậy để làm gì vì ai cũng hiểu chỗ đó là Sum các dòng dưới rồi.

P/S: tiện thể hỏi luôn: tại sao công thức Sum đó thừa 1 dòng (lấn xuống dòng đầu của STT phía dưới)?
Có thể máy tôi cài office thấp nên chạy code của anh ra kết quả không đúng.
Anh thử nhập P2=151, P3=163, P4= 176, P5=177 và chay thử xem, sẽ thấy thiếu dữ liệu
nói chỉ lấy Zone1, zone2, zone3 của STT 151, sau đó nó chỉ có 1 dòng của 1 sh nào đó.
 

File đính kèm

  • Screenshot (13).png
    Screenshot (13).png
    296.4 KB · Đọc: 5
Upvote 0
Có thể máy tôi cài office thấp nên chạy code của anh ra kết quả không đúng.
Anh thử nhập P2=151, P3=163, P4= 176, P5=177 và chay thử xem, sẽ thấy thiếu dữ liệu
nói chỉ lấy Zone1, zone2, zone3 của STT 151, sau đó nó chỉ có 1 dòng của 1 sh nào đó.
Vẫn lấy đúng 4 STT đó bạn à! Các STT không có chi tiết thì sẽ lấy 1 dòng tại sheet DC. Chỉ là tôi nhầm chút về giải thuật nên 2 dòng 176, 177 không được định dạng, tôi sẽ cập nhật code bài #30.

@tranquynh.81 : tôi đã cập nhật code ở bài #30: chỉ thêm khai báo endR và thêm 2 dòng ở Sub TaoHamSum:
Rich (BB code):
Dim i&, d&, rw&, endR&

endR = Range("I" & Rows.Count).End(xlUp).Row + 1
If Range("J" & Rows.Count).End(xlUp).Row + 1 > endR Then endR = Range("J" & Rows.Count).End(xlUp).Row + 1
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu cần thiết phải như vậy thì bạn thay Sub ở trên bằng 2 Sub bên dưới (Sub chính gọi Sub TaoHamSum để làm theo yêu cầu của bạn), với kết quả có sự thay đổi nho nhỏ so với dữ liệu nguồn, đó là: ô chứa hàm Sum nằm ngang với ô Khối lượng ZONE x ở cột B.

Đồng thời tôi định dạng đậm, nghiêng luôn cho dễ nhìn.

Bạn thử code:
Mã:
Sub Copy_Theo_STT()
Dim wsh As Object
Dim Sh As Object
Dim lR&, d&, k&, j&, i&, x&
Dim tmr#, arr, arrkq, Bdr
tmr = Timer()
Application.ScreenUpdating = False
Set Sh = Sheets("KET QUA")
ReDim arrkq(1 To 5000, 1 To 12)
For i = 2 To Sh.Cells(Rows.Count, 16).End(xlUp).Row
    x = 1
    For Each wsh In ThisWorkbook.Worksheets
        If wsh.Name <> "KET QUA" Then
            arr = wsh.Range("A2:L" & wsh.Range("B" & Rows.Count).End(xlUp).Row)
            For j = 1 To UBound(arr)
                If arr(j, 1) = Sh.Cells(i, 16) Then
                    If Len(arr(j + 1, 1)) = 0 Then
                        On Error Resume Next
                        If x = 1 Then
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR - 1, k)
                                Next
                            Loop Until Len(arr(j + lR, 1)) > 0
                        Else
                            Do
                                d = d + 1: lR = lR + 1
                                For k = 1 To UBound(arr, 2)
                                    arrkq(d, k) = arr(j + lR, k)
                                Next
                            Loop Until Len(arr(j + lR + 1, 1)) > 0
                        End If
                        On Error GoTo 0
                        lR = 0: Exit For
                    Else
                        If x = 1 Then
                            d = d + 1
                            For k = 1 To UBound(arr, 2)
                                arrkq(d, k) = arr(j, k)
                            Next
                            Exit For
                        End If
                    End If
                End If
            Next
        End If
    x = x + 1
    Next wsh
Next i
Sh.Range("A2:L5000").Clear
Sh.Range("A2").Resize(d, 12) = arrkq
With Sh.Range("A2:L" & d + 1)
    .Font.Name = "Times New Roman"
    .Font.Size = 12
    For Each Bdr In Array(xlLeft, xlRight, xlTop, xlBottom, xlInsideVertical)
        .Borders(Bdr).Weight = xlThin
    Next
    .Borders(xlInsideHorizontal).Weight = xlHairline
End With
Sh.Range("D2:H" & d + 1).NumberFormat = "#,##0.00"
Sh.Range("I2:L" & d + 1).NumberFormat = "#,##0.000"
Sh.Activate
Call TaoHamSum
Application.ScreenUpdating = True
MsgBox " Xong" & vbNewLine & Timer() - tmr
End Sub

Sub TaoHamSum()
Dim i&, d&, rw&, endR&

endR = Range("I" & Rows.Count).End(xlUp).Row + 1
If Range("J" & Rows.Count).End(xlUp).Row + 1 > endR Then endR = Range("J" & Rows.Count).End(xlUp).Row + 1
For i = 2 To Range("I" & Rows.Count).End(xlUp).Row + 1
    If Range("A" & i) <> "" Then
        Range("A" & i & ":L" & i).Font.Bold = True
    Else
        If Range("I" & i) <> "" And Range("B" & i) = "" Then
            Range("I" & i) = "": d = i + 2: rw = i + 1
            Do Until Range("B" & d + 1) = "" Or Range("A" & d + 1) <> ""
                d = d + 1
            Loop
            i = d
        ElseIf Range("I" & i) <> "" And Left(Range("B" & i), 10) = Sheet4.Range("Q1") Then
            d = i + 1: rw = i
            Do Until Range("B" & d + 1) = "" Or Range("A" & d + 1) <> ""
                d = d + 1
            Loop
            i = d
        End If
        Range("I" & rw).FormulaR1C1 = "=SUM(R[" & 1 & "]C:R[" & d - rw & "]C)"
        Range("B" & rw & ":I" & rw).Font.Bold = True
        Range("B" & rw & ":I" & rw).Font.Italic = True
    End If
Next
End Sub
với P2=162 code tạo hàm Sum bị lỗi
 
Upvote 0
kính chào các anh các chị!
em có file trong file có 3 sheet , mình cần copy 3 sheet vào 1 sheet tổng hợp , điều kiện nếu giống cột số thứ tự (stt trong file ) thì copy các dòng từ sst đó . ví dụ stt 151 thì copy các dòng từ stt 151 đến truoéc dòng 152 . trong file em có sheet kết quả .
mong các anh chị giúp đỡ.
cảm ơn a/c nhiều
Nhập điều kiện lọc vào các ô P2, P3 ...
Chạy code
Mã:
Sub ABC()
  Dim aSh, sArr(), aSTT(), res(), Sh As Worksheet, stt&, tmp
  Dim eRow&, sRow&, sCol&, eR&, i&, r&, j&, k&, q&, n&
  'On Error Resume Next
  Set Sh = Sheets("KET QUA")
  Sh.Range("A2:L10000").Clear
  eRow = Sh.Range("P" & Rows.Count).End(xlUp).Row
  If eRow < 2 Then MsgBox ("Khong Co STT!"): Exit Sub
  aSTT = Sh.Range("P2:Q" & eRow).Value 'Lay 2 cot P va Q
  ReDim res(1 To 1000, 1 To 12) 'Gioi han ket qua 1000 dong
  aSh = Array("DC", "KD", "MD") 'Cac sheet du lieu
 
  Application.ScreenUpdating = false
  For q = 1 To UBound(aSTT)
    stt = aSTT(q, 1)
    For n = 0 To UBound(aSh)
      With Sheets(aSh(n))
        If Err.Number = 0 Then 'Neu có sheet aSh(n)
          sArr = .Range("A2:L" & .Range("B" & Rows.Count).End(xlUp).Row + 2).Value
          sRow = UBound(sArr) - 1
          sArr(sRow, 1) = "a": sCol = 0
          For i = 1 To sRow
            tmp = sArr(i, 1)
            If tmp <> Empty Then
              If tmp = stt Then
                If n > 0 Then
                  If sArr(i + 1, 1) <> Empty Then Exit For
                  i = i + 1
                  sCol = 9
                  k = k + 1
                Else
                  sCol = 12
                End If
              Else
                If sCol > 0 Then Exit For
              End If
            End If
            If sCol > 0 And sArr(i, 2) <> Empty Then
              k = k + 1
              For j = 1 To sCol
                res(k, j) = sArr(i, j)
              Next j
              If InStr(1, res(k, 2), "ZONE", vbTextCompare) Then r = k
              If res(k, 1) <> Empty Then k = k + 1
            End If
          Next i
          If i < sRow + 1 Then 'Cong thuc SUM
            If r Then res(r, 9) = "=Sum(I" & r + 2 & ":I" & k + 2 & ")"
          End If
        Else 'Khong có sheet aSh(n)
          Err.Number = 0
        End If
      End With
    Next n
  Next q
  If k Then
    Sh.Range("A2").Resize(k, 12) = res
    Sh.Range("A2").Resize(k, 12).Borders.Weight = xlThin
    Sh.Range("A2").Resize(k, 12).Borders(xlInsideHorizontal).Weight = xlHairline
    For i = 2 To k + 1
      If Sh.Range("A" & i).Value <> Empty Or InStr(1, Sh.Range("B" & i).Value, "ZONE", vbTextCompare) Then
        Sh.Range("A" & i).Resize(, 12).Font.Bold = True
      End If
    Next i
  End If
  Application.ScreenUpdating = True
End Sub
 
Upvote 0
chào các bạn !
Mình đã chạy code của @Maika8008 thấy vậy là quá ok rồi. mình cũng đã chạy thử code của @HieuCD rồi cũng rất nhanh , chỉ bị một lỗi nhỏ. hôm qua mình đã tổng hợp xong công việc của mình rồi. một lần nữa cảm ơn các bạn @Maika8008, @HieuCD, @HUONGHCKT , @vanthinh3101 rất nhiều đã giúp đỡ mình.
thanks all !

 
Upvote 0
Nếu vẫn còn quan tâm. xin Gửi lại bạn code đã có công thức sau khi đã loại đi các dòng tiêu đề STT trùng nhau- vị trí giống hệt trong các Sh thành phần.
Mã:
Option Explicit

Sub TONGHOP()
Dim wsh As Worksheet
Dim Sh As Worksheet, Rng As Range, sRng As Range
Dim Lr1&, Lr2&, Lr&, d&, k&, j&, i&, x&, C&, q&, Z&, T&
Dim tmr#
tmr = Timer()
On Error Resume Next
Application.ScreenUpdating = False
Set Sh = Sheets("KET QUA")
Sh.Range("A2:L10000").ClearContents
j = Sh.Cells(Rows.Count, 16).End(xlUp).Row
For i = 2 To j
x = 1
    For Each wsh In ThisWorkbook.Worksheets
        If wsh.Name <> "KET QUA" Then
            Set Rng = wsh.Range("A2:A10000")
            Set sRng = Rng.Find(Sh.Cells(i, 16))
                If Not sRng Is Nothing Then
                    d = sRng.Row
                Else
                    Exit For
                End If
                Lr1 = Sh.Cells(Rows.Count, 9).End(3).Row
                Lr2 = Sh.Cells(Rows.Count, 10).End(3).Row
                If Lr1 > Lr2 Then Lr = Lr1 Else Lr = Lr2
                    Z = Lr + 2: T = Z + 1
                If wsh.Cells(d + 1, 1) = Empty Then
                    k = wsh.Cells(d, 1).End(xlDown).Row - 1
                    C = d + 1
                Else
                    k = d
                    C = d
                    Z = Lr
                End If
            If x = 1 Then
                wsh.Range("A" & d, "M" & k).Copy Sh.Cells(Lr + 1, "A")
                q = Sh.Cells(Rows.Count, 2).End(xlUp).Row
                If wsh.Cells(d + 1, 1) = Empty Then
                    Sh.Cells(Z, 9).Formula = "=Sum(I" & T & ":I" & q & ")"
                End If
            Else
                Z = Lr + 1
                wsh.Range("A" & C, "M" & k).Copy Sh.Cells(Lr + 1, "A")
                q = Sh.Cells(Rows.Count, 2).End(xlUp).Row
                If wsh.Cells(d + 1, 1) = Empty Then
                    Sh.Cells(Z, 9).Formula = "=Sum(I" & T - 1 & ":I" & q & ")"
                End If
            End If
                x = x + 1
        End If
Next wsh
Next i
    Sh.Cells(1).Select
    Set Rng = Nothing: Set sRng = Nothing
    Application.ScreenUpdating = True

MsgBox " Xong" & vbNewLine & Timer() - tmr
End Sub
code chạy chậm hơn code của anh @HieuCD, những hy vọng nó cho ra kết quả đúng với ý định
 
Upvote 0
với P2=162 code tạo hàm Sum bị lỗi
Hic! Tôi đặt điều kiện so sánh với từ "Khối lượng" đặt tại Q1 nhưng không gửi file lên nên khi chạy code sẽ bị sai.

Tiện thể có 1 chỗ sai nữa khi STT là 163 chẳng hạn, kết quả chỉ có 1 dòng không có chi tiết thì code bị lỗi. Tôi sửa code TaoHamSum 1 chút, gửi lại:
Rich (BB code):
Sub TaoHamSum()
Dim i&, d&, rw&, endR&

endR = Range("I" & Rows.Count).End(xlUp).Row + 1
If Range("J" & Rows.Count).End(xlUp).Row + 1 > endR Then endR = Range("J" & Rows.Count).End(xlUp).Row + 1
For i = 2 To endR
    If Range("A" & i) <> "" Then
        Range("A" & i & ":L" & i).Font.Bold = True
        Range("A" & i & ":L" & i).Interior.ColorIndex = 43
    Else
        If Range("I" & i) <> "" And Range("B" & i) = "" Then
            Range("I" & i) = "": d = i + 2: rw = i + 1
            Do Until Range("B" & d + 1) = "" Or Range("A" & d + 1) <> ""
                d = d + 1
            Loop
            i = d
        ElseIf Range("I" & i) <> "" And Left(Range("B" & i), 10) = "Kh" & ChrW(7889) & "i l" & ChrW(432) & ChrW(7907) & "ng" Then
            d = i + 1: rw = i
            Do Until Range("B" & d + 1) = "" Or Range("A" & d + 1) <> ""
                d = d + 1
            Loop
            i = d
        End If
        If d > 0 And rw > 0 Then
            Range("I" & rw).FormulaR1C1 = "=SUM(R[" & 1 & "]C:R[" & d - rw & "]C)"
            Range("B" & rw & ":I" & rw).Font.Bold = True
            Range("B" & rw & ":I" & rw).Font.Italic = True
        End If
    End If
Next
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom