Tối ưu hộ code Trích lọc duy nhất!

Liên hệ QC

ThuNghi

Hãy cho rồi sẽ nhận!
Thành viên đã mất
Tham gia
16/8/06
Bài viết
3,808
Được thích
4,449
Tôi có dữ liệu trên Sh Tmp gồm MaHH, TenHH, DVT, SL liệt kê theo thời gian nhập.
Tôi muốn trích lọc thành 1 bảng nhập duy nhất theo mahh.
- Phương án 1: Lọc duy nhất theo MaHH, các thông số còn lại dùng VLookup và Sumif.
PHP:
Option Explicit
Dim endR As Long, SoDong As Long, iSh As Long, eRow As Long
Dim Sh As Worksheet, WsName As String, iR As Long, rngData As Range
Sub GanTmpNhap()
With Application
  .DisplayAlerts = False:  .ScreenUpdating = False:  .Calculation = xlCalculationManual
End With
Sheets("TongHop").Select
[A6:F65000].ClearContents
With Sheets("TMP")
    endR = .[A65000].End(xlUp).Row
    'Set rngData = .Range("C1:C" & endR)
    'rngData.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    'endR = .[A65000].End(xlUp).Row
       Set rngData = .Range("A1:A" & endR)
    With rngData
        .AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
        "A5"), Unique:=True
    End With
    .Range("A1:C" & endR).Name = "rngData"
    .Range("D2:D" & endR).Name = "rngSL"
    .Range("A2:A" & endR).Name = "rngMaHH"
End With
Range("Extract").ClearContents: Names("Extract").Delete
endR = [A6].End(xlDown).Row
With Application
  .Calculation = xlCalculationAutomatic
End With
With Range(Cells(6, 2), Cells(endR, 2))
    .FormulaR1C1 = "=vlookup(RC1,rngData,2,0)"
    .Offset(, 1).FormulaR1C1 = "=vlookup(RC1,rngData,3,0)"
End With
With Range(Cells(6, 2), Cells(endR, 3))
    .Value = .Value
End With
Names("rngData").Delete
TaoSLNhap
 
With Application
  .DisplayAlerts = True: .ScreenUpdating = True
End With
 
 
End Sub
 
Sub TaoSLNhap()
Range(Cells(6, 4), Cells(endR, 4)).FormulaR1C1 = "=SUMIF(rngMaHH,RC[-3],rngSL)"
Range(Cells(6, 2), Cells(endR, 4)).Value = Range(Cells(6, 2), Cells(endR, 4)).Value
 
Names("rngSL").Delete: Names("rngMaHH").Delete
Set rngData = Nothing
With Sheets("TMP")
    .[A2:N65000].ClearContents
End With
End Sub
- Phương án 2: Lọc duy nhất theo MaHH, TenHH, DVT phần SL dùng Sumif.
- Phương án 3: Lọc theo MaHH, các thông số còn lại dùng VLookup và Sumif. Nhưng mà sumif theo range
Set rngSL = .Range("D2:D" & endR)
khác với name
.Range("D2:D" & endR).Name = "rngSL"
Các bạn xem hộ phương án 3 này dùng sum if theo cái nào nhanh hơn.
Xem lại hộ code trên tôi viết sai chỗ nào mà chay gần 5 phút.
Cám ơn nhiều!
 

File đính kèm

  • BANGTONGHOPNXT-AdFi.rar
    212.9 KB · Đọc: 139
Chỉnh sửa lần cuối bởi điều hành viên:
Tôi có dữ liệu trên Sh Tmp gồm MaHH, TenHH, DVT, SL liệt kê theo thời gian nhập.
Tôi muốn trích lọc thành 1 bảng nhập duy nhất theo mahh.
- Phương án 1: Lọc duy nhất theo MaHH, các thông số còn lại dùng VLookup và Sumif.
PHP:
Option Explicit
Dim endR As Long, SoDong As Long, iSh As Long, eRow As Long
Dim Sh As Worksheet, WsName As String, iR As Long, rngData As Range
Sub GanTmpNhap()
With Application
  .DisplayAlerts = False:  .ScreenUpdating = False:  .Calculation = xlCalculationManual
End With
Sheets("TongHop").Select
[A6:F65000].ClearContents
With Sheets("TMP")
    endR = .[A65000].End(xlUp).Row
    'Set rngData = .Range("C1:C" & endR)
    'rngData.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    'endR = .[A65000].End(xlUp).Row
       Set rngData = .Range("A1:A" & endR)
    With rngData
        .AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
        "A5"), Unique:=True
    End With
    .Range("A1:C" & endR).Name = "rngData"
    .Range("D2:D" & endR).Name = "rngSL"
    .Range("A2:A" & endR).Name = "rngMaHH"
End With
Range("Extract").ClearContents: Names("Extract").Delete
endR = [A6].End(xlDown).Row
With Application
  .Calculation = xlCalculationAutomatic
End With
With Range(Cells(6, 2), Cells(endR, 2))
    .FormulaR1C1 = "=vlookup(RC1,rngData,2,0)"
    .Offset(, 1).FormulaR1C1 = "=vlookup(RC1,rngData,3,0)"
End With
With Range(Cells(6, 2), Cells(endR, 3))
    .Value = .Value
End With
Names("rngData").Delete
TaoSLNhap
 
With Application
  .DisplayAlerts = True: .ScreenUpdating = True
End With
 
 
End Sub
 
Sub TaoSLNhap()
Range(Cells(6, 4), Cells(endR, 4)).FormulaR1C1 = "=SUMIF(rngMaHH,RC[-3],rngSL)"
Range(Cells(6, 2), Cells(endR, 4)).Value = Range(Cells(6, 2), Cells(endR, 4)).Value
 
Names("rngSL").Delete: Names("rngMaHH").Delete
Set rngData = Nothing
With Sheets("TMP")
    .[A2:N65000].ClearContents
End With
End Sub
- Phương án 2: Lọc duy nhất theo MaHH, TenHH, DVT phần SL dùng Sumif.
- Phương án 3: Lọc theo MaHH, các thông số còn lại dùng VLookup và Sumif. Nhưng mà sumif theo range
Set rngSL = .Range("D2:D" & endR)
khác với name
.Range("D2:D" & endR).Name = "rngSL"
Các bạn xem hộ phương án 3 này dùng sum if theo cái nào nhanh hơn.
Xem lại hộ code trên tôi viết sai chỗ nào mà chay gần 5 phút.
Cám ơn nhiều!

Bảng Tonghop thì có dữ liệu nhưng mã hàng hóa là duy nhất rồi, như vậy khỏi phải lọc
Còn bảng Tmp thì chẳng thấy có cái gì cả ?? Vậy thì lọc từ Sheet nào sang sheet nào ??

Trường hợp này dùng For next có khi còn nhanh hơn đấy

Thân!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Bảng Tonghop thì có dữ liệu nhưng mã hàng hóa là duy nhất rồi, như vậy khỏi phải lọc
Còn bảng Tmp thì chẳng thấy có cái gì cả ?? Vậy thì lọc từ Sheet nào sang sheet nào ??

Trường hợp này dùng For next có khi còn nhanh hơn đấy

Thân!
Sorry, do code tạo ra tmp xong và trích lọc xong thì xóa tmp.
Bác copy tonghop vào tmp chạy thử. Xem như khi nhập đã là duy nhất rồi.
Nó rất chậm.
Cám ơn!
 
Sorry, do code tạo ra tmp xong và trích lọc xong thì xóa tmp.
Bác copy tonghop vào tmp chạy thử. Xem như khi nhập đã là duy nhất rồi.
Nó rất chậm.
Cám ơn!

Nhưng dữ liệu ở Sheet Tonghop là duy nhất mà (Mỗi mã hàng không lặp lại)

Vậy thì việc gì phải trích lọc nữa ??

Thân!
 
Nhưng dữ liệu ở Sheet Tonghop là duy nhất mà (Mỗi mã hàng không lặp lại)

Vậy thì việc gì phải trích lọc nữa ??

Thân!
Bác ơn, lỡ xóa thôi, thì xem như trùng hợp nhập là duy nhất (chưa kiểm tra) mình trích lọc từ duy nhất -> duy nhất là chính nó. Thôi bác nhân đôi số record hộ. Quan trọng là sao nó chạy chậm. Bác cứ copy từ tonghop sang tmp vào từ dòng 2 và test hộ code. Máy tính mình treo luốn.
 
Tạo Marco để tổng hợp dữ liệu

Nếu chỉ cần tạo bảng tổng hợp như thế này thì ghi lại 1 marco tạo PivotTables, sau đó chỉnh sửa để chạy tự động cho các lần sau là nhanh và hiệu quả nhất.
Trình tự các bước ví dụ như sau:
1. Đặt tên sheet chứa dữ liệu: DataBase
2. Đặt 1 name để định vị ô chứa tiêu đề Mã hàng hóa, vdu: maHang (ở ô A2)
3. Tạo tên DataBase để quản lý dữ liệu:
= OFFSET(maHang,0,0,COUNTA(OFFSET(maHang,0,0,60000,1)),COUNTA(OFFSET(maHang,0,0,1,100)))
4. Dùng 1 sheet trống đặt tên InForm, sau này sẽ chứa dữ liệu kết quả để làm việc.
5. Gọi lệnh Record Marcro (...)
6. Tiến hành ghi marco, gồm các bước sau:
- Từ sheet DataBase, gọi PivotTable
- Chọn source dữ liệu (sau này trong mã ta sẽ sửa thành: DataBase!DataBase)
- Chọn kết xuất ra 1 new sheet
- Lần lượt add các field: maHang, TenHang, DVTinh.... vào vị trí cột ở Pivot
- Cuối cùng là filed SoLuong đưa vào vị trí row để tính Sum
- Trong bảng kết quả, chọn vùng chứa dữ liệu (gồm 4 cột), copy, paste special vào sheet InForm.
- Xóa sheet chứa Pivot.
- Kết thúc ghi marco.
7. vào VBA và chỉnh sửa để được 1 sub tổng quát nhất có thể.


Hy vọng cũng là 1 giải pháp khả thi.
 
Bác ơn, lỡ xóa thôi, thì xem như trùng hợp nhập là duy nhất (chưa kiểm tra) mình trích lọc từ duy nhất -> duy nhất là chính nó. Thôi bác nhân đôi số record hộ. Quan trọng là sao nó chạy chậm. Bác cứ copy từ tonghop sang tmp vào từ dòng 2 và test hộ code. Máy tính mình treo luốn.

Em tạm coi Sheet TongHop là Database, Sh Tmp là Sh Report.
Em cho Data hơn 15.000 dòng với mỗi mã hàng lặp 2 lần

Dùng For thì cũng nhanh và đơn giản (17s)

PHP:
Function TimRow(Ma As String) As Long
    On Error Resume Next
    TimRow = WorksheetFunction.Match(Ma, S002.Range("A:A"), False)
    'If TimRow = 0 Then TimRow = S002.Range("A65000").End(xlUp).Row + 1
End Function
PHP:
Sub Oke()
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With

    Dim iR As Long, iTemp As Long, TG As Double
    TG = Timer
    With S002
        .Range("A2:D30000").ClearContents
        For iR = 6 To S001.Range("A65000").End(xlUp).Row
            iTemp = TimRow(S001.Range("A" & iR).Value)
            If iTemp = 0 Then
                iTemp = .Range("A65000").End(xlUp).Row + 1
                .Range("A" & iTemp & ":D" & iTemp).Value = S001.Range("A" & iR & ":D" & iR).Value
            Else
                .Range("D" & iTemp).Value = .Range("D" & iTemp).Value + S001.Range("D" & iR).Value
            End If
        Next
        TG = Timer - TG
        .Range("E1") = TG
    End With
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
    End With
    
End Sub


Thực ra nếu bài toán chỉ như thế thì dùng Pivot Table cũng nhanh lắm (như HVL nói)
Thân
 

File đính kèm

  • BANGTONGHOPNXT-For.rar
    263.5 KB · Đọc: 107
Lần chỉnh sửa cuối:
Tôi có dữ liệu trên Sh Tmp gồm MaHH, TenHH, DVT, SL liệt kê theo thời gian nhập.
Tôi muốn trích lọc thành 1 bảng nhập duy nhất theo mahh.
- Phương án 1: Lọc duy nhất theo MaHH, các thông số còn lại dùng VLookup và Sumif.
- Phương án 2: Lọc duy nhất theo MaHH, TenHH, DVT phần SL dùng Sumif.
- Phương án 3: Lọc theo MaHH, các thông số còn lại dùng VLookup và Sumif. Nhưng mà sumif theo range
Set rngSL = .Range("D2:D" & endR)
khác với name
.Range("D2:D" & endR).Name = "rngSL"
Các bạn xem hộ phương án 3 này dùng sum if theo cái nào nhanh hơn.
Xem lại hộ code trên tôi viết sai chỗ nào mà chay gần 5 phút.
Cám ơn nhiều!

Theo boyxin: phương án này cực nhanh
  1. - Dữ liệu ở sheet chứa Data được Sort theo MaHH
  2. - Lọc duy nhất MaHH
  3. - Dùng Find MaHH để lấy Tên HH và ĐVT
  4. - Dùng Find MaHH kết hợp với Do While ...Loop để tính Số lượng
PHP:
Sub GPE_boyxin()
' Sheet1 = Sheet chứa Data
' Sheet2 = Sheet Tổng hợp
'------------------------------------------------------------
Dim Rng As Range, sRng As Range, fRng As Range, clls As Range
Dim S As Variant
    Sheet2.Activate: [F1] = Timer
With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
Set Rng = Sheet1.[A1].Resize(Sheet1.[a65535].End(xlUp).Row)
    Rng.Sort Key1:=Sheet1.[A2], Order1:=1, Header:=1
    Rng.AdvancedFilter 2, , [A1], True
Set sRng = Rng(1)
For Each clls In [A2].Resize([a65535].End(xlUp).Row - 1)
    With clls
        Set fRng = Rng.Find(What:=.Value, After:=sRng, LookAt:=1)
        .Offset(, 1).Resize(, 2) = fRng.Offset(, 1).Resize(, 2).Value
        S = S + fRng.Offset(, 3)
        Do While fRng = fRng.Offset(1)
            S = S + fRng.Offset(1, 3)
            Set fRng = fRng.Offset(1)
        Loop
        .Offset(, 3) = S: Set sRng = fRng:  S = 0
    End With
Next
    [F2] = Timer: [F3] = [F2] - [F1]
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
    .DisplayAlerts = True
End With
End Sub
 
Lần chỉnh sửa cuối:
Theo boyxin: phương án này cực nhanh
  1. - Dữ liệu ở sheet chứa Data được Sort theo MaHH
  2. - Lọc duy nhất MaHH
  3. - Dùng Find MaHH để lấy Tên HH và ĐVT
  4. - Dùng Find MaHH kết hợp với Do While ...Loop để tính Số lượng
PHP:
Sub GPE_boyxin()
' Sheet1 = Sheet chứa Data
' Sheet2 = Sheet Tổng hợp
'------------------------------------------------------------
Dim Rng As Range, sRng As Range, fRng As Range, clls As Range
Dim iR As Long, S As Long
    Sheet2.Activate: [F1] = Timer
With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
Set Rng = Sheet1.[A1].Resize(Sheet1.[a65535].End(xlUp).Row)
    Rng.Sort Key1:=Sheet1.[A2], Order1:=1, Header:=1
    Rng.AdvancedFilter 2, , [A1], True
Set sRng = Rng(1)
For Each clls In [A2].Resize([a65535].End(xlUp).Row - 1)
    With clls
        Set fRng = Rng.Find(What:=.Value, After:=sRng, LookAt:=1)
        .Offset(, 1).Resize(, 2) = fRng.Offset(, 1).Resize(, 2).Value
        S = S + fRng.Offset(, 3)
        Do While fRng = fRng.Offset(1)
            S = S + fRng.Offset(1, 3)
            Set fRng = fRng.Offset(1)
        Loop
        .Offset(, 3) = S
        Set sRng = fRng
    End With
Next
    [F2] = Timer: [F3] = [F2] - [F1]
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
    .DisplayAlerts = True
End With
End Sub

Quả thật AdvancedFilter thật mạnh, vì đây chính là yếu tố để tốc độ giảm đi kinh khủng.

Cảm ơn nhiều.

Thân!
 
Tối ưu code

Theo boyxin: phương án này cực nhanh
  1. - Dữ liệu ở sheet chứa Data được Sort theo MaHH
  2. - Lọc duy nhất MaHH
  3. - Dùng Find MaHH để lấy Tên HH và ĐVT
  4. - Dùng Find MaHH kết hợp với Do While ...Loop để tính Số lượng
Code trên, sửa tý xíu như sau thì thời gian xử lý giảm đáng kể
(Không biết, còn cách nào nhanh hơn không)
PHP:
Sub GPE_boyxin()
' Sheet1 = Sheet chứa Data
' Sheet2 = Sheet Tổng hợp
'------------------------------------------------------------
Dim Rng As Range, sRng As Range, fRng As Range, clls As Range
Dim Tmp As Variant, S As Variant, iR As Long
    Sheet2.[a1].CurrentRegion.Offset(1).ClearContents: [F1] = Timer
With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
'--------------------------------------------------------------------
Set Rng = Sheet1.[A1].Resize(Sheet1.[a65535].End(xlUp).Row)
    Rng.Sort Key1:=Sheet1.[a2], Order1:=1, Header:=1
    Rng.AdvancedFilter 2, , [A1], True
    Tmp = Range("B2:D" & [a65535].End(xlUp).Row)
Set sRng = Rng(1)
For Each clls In [a2].Resize([a65535].End(xlUp).Row - 1)
    iR = iR + 1: S = 0
    With clls
        Set fRng = Rng.Find(What:=.Value, After:=sRng, LookAt:=1)
        Tmp(iR, 1) = fRng.Offset(, 1): Tmp(iR, 2) = fRng.Offset(, 2)
        S = S + fRng.Offset(, 3)
        Do While fRng = fRng.Offset(1)
            S = S + fRng.Offset(1, 3): Set fRng = fRng.Offset(1)
        Loop
        Tmp(iR, 3) = S: Set sRng = fRng
    End With
Next
    Range("B2:D" & [a65535].End(xlUp).Row) = Tmp
'--------------------------------------------------------------------
    [F2] = Timer: [F3] = [F2] - [F1]
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
    .DisplayAlerts = True
End With
    Sheet2.Names("Extract").Delete
End Sub
 

File đính kèm

  • boyxin_TH NXT-AdFi New.rar
    258.3 KB · Đọc: 114
Lần chỉnh sửa cuối:
Code trên, sửa tý xíu như sau thì thời gian xử lý giảm đáng kể
(Không biết, còn cách nào nhanh hơn không)
Code trên thêm S = 0 khi next
Tmp(iR, 3) = S: Set sRng = fRng: S = 0
Khá khen cho BoyXin, mới xem qua HVL mà đã trểin khai quá tốt.
Tôi đang thắc mắc:
- Vấn đề AdFi lọc duy nhất theo MaHH rồi gán TenHH thì OK. Nếu lọc duy nhất > 1 cột thì chạy chậm.
- Tại sao dùng Vlookup và Sumif là hàm của Ex mà nó lại chậm. Lại phải dùng tới find. Tôi cũng thích dùng Find như mà sợ chậm nên làm biếng.
- Tại sao trong quá trình chạy code thì Tmp vẫn phải nhớ giá trị mà nó vẫn chạy nhanh hơn trong khi nếu ta tìm thấy thì gán vào.
Cám ơn BoyXin nhiều. Code rất hay.
 
Code trên, sửa tý xíu như sau thì thời gian xử lý giảm đáng kể
(Không biết, còn cách nào nhanh hơn không)
PHP:
[/quote]

Code sẽ nhanh hơn và chính xác hơn nếu sử dụng tham số [B]SearchOrder:=xlByColumns[/B] trong phương thức Find
Vì nếu như trên thì nó sẽ tìm kiếm cả ở các cột khác
Chúc vui.
 
Code sẽ nhanh hơn và chính xác hơn nếu sử dụng tham số SearchOrder:=xlByColumns trong phương thức Find
Vì nếu như trên thì nó sẽ tìm kiếm cả ở các cột khác
Chúc vui.
Ở trên đã có: Set Rng = Sheet1.[a1].Resize(Sheet1.[a65535].End(xlUp).Row) <=> Rng chỉ là 1 cột

Nên em nghĩ
Sẽ chỉ tìm trong phạm vi Rng mình đã Set sao tìm sang cột khác được nên SearchOrder:=xlByColumns Có cần thiết không?

-----------------------------------------
Thống kê - Tham khảo thêm cách dùng PivotTable cũng hay (tuy không nhanh bằng phương thức AdF + Find như trên)
PHP:
Sub PivotTable()
    Sheet3.Range([a1], [a1].SpecialCells(11)).Clear: [F1] = Timer
With Application
    .DisplayAlerts = False
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
    Sheet1.[a1].CurrentRegion.Name = "Data": Sheet3.[a2].Name = "Start"
'---------------------------------------------------------------------------
    ActiveWorkbook.PivotCaches.Add(1, "Data").CreatePivotTable "Start", "GPE_boyxin"
    With PivotTables("GPE_boyxin")
        .PivotFields(Sheet1.[a1].Value).Orientation = 1
        .PivotFields(Sheet1.[a1].Value).Subtotals = Array(False, False, False, _
        False, False, False, False, False, False, False, False, False)
        .PivotFields(Sheet1.[b1].Value).Orientation = 1
        .PivotFields(Sheet1.[b1].Value).Subtotals = Array(False, False, False, _
        False, False, False, False, False, False, False, False, False)
        .PivotFields(Sheet1.[c1].Value).Orientation = 1
        .AddDataField .PivotFields(Sheet1.[d1].Value), "Sum " & Sheet1.[d1].Value, xlSum
    End With
    Sheet3.[a1].CurrentRegion.Columns.AutoFit
'---------------------------------------------------------------------------
    [F2] = Timer: [F3] = [F2] - [F1]
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
    .DisplayAlerts = True
End With
End Sub
 

File đính kèm

  • boyxin_THNXT AdFi_PivotTable.rar
    286.9 KB · Đọc: 61
Lần chỉnh sửa cuối:
Tôi đang thắc mắc:

  1. - Vấn đề AdFi lọc duy nhất theo MaHH rồi gán TenHH thì OK. Nếu lọc duy nhất > 1 cột thì chạy chậm.
  2. - Tại sao dùng Vlookup và Sumif là hàm của Ex mà nó lại chậm. Lại phải dùng tới find. Tôi cũng thích dùng Find như mà sợ chậm nên làm biếng.
  3. - Tại sao trong quá trình chạy code thì Tmp vẫn phải nhớ giá trị mà nó vẫn chạy nhanh hơn trong khi nếu ta tìm thấy thì gán vào.
Theo em hiểu

  1. AdFi lọc duy nhất >1 cột chạy chậm hơn AdFi lọc duy nhất = 1 cột (đương nhiên, không có gì là khó hiểu)
  2. Vlookup, Sumif là hàm của Excel, Find cũng là của Excel. Mỗi công cụ này đều có điểm mạnh, điểm yấu riêng, không phải cứ là công cụ của Excel thì chúng đều có tốc độ xử lý nhanh như nhau
  3. Trong đoạn code đó: Khi chạy code thì Tmp vẫn phải nhớ giá trị (nhớ vào bộ nhớ trong của máy) chỉ mất 1 lần gán các giá trị đó, còn trong khi nếu ta tìm thấy thì gán luôn vào Cells (mỗi Cells được gán 1 lần) - nhiều lần gán hơn nên quá trình xử lý chậm hơn
Không biết như vậy có đúng không. Mong được các bác chỉ bảo thêm
 
Tôi có dữ liệu trên Sh Tmp gồm MaHH, TenHH, DVT, SL liệt kê theo thời gian nhập.
Bài này dùng công thức chạy chậm vì dữ liệu quá nhiều và dữ liệu nằm trên 8 sheet. Tôi tổng hợp bằng cách:
- Nhóm tất cả dữ liệu nhập, xuất từ 8 sheet về sheet Temp
- Dùng 2 Pivote Table tổng hợp số liệu nhập, xuất. Nhóm 2 bảng tổng hợp thành 1. Chạy vòng lặp để ra Tồn.
 

File đính kèm

  • Thu Nghi BANGTONGHOPNXT-01.zip
    930.4 KB · Đọc: 85
Bài này dùng công thức chạy chậm vì dữ liệu quá nhiều và dữ liệu nằm trên 8 sheet. Tôi tổng hợp bằng cách:
- Nhóm tất cả dữ liệu nhập, xuất từ 8 sheet về sheet Temp
- Dùng 2 Pivote Table tổng hợp số liệu nhập, xuất. Nhóm 2 bảng tổng hợp thành 1. Chạy vòng lặp để ra Tồn.

Em có 2 giải pháp:

  1. TH_NXT_01 AdF + Find.rar
  2. TH_NXT_02 Pivot Table.rar
Mong nhận được sự góp ý
 
Web KT
Back
Top Bottom