Nhờ chỉnh sửa code trích lọc dữ liệu

Liên hệ QC

huonglien1901

GPE là ngôi nhà thứ 2 của tôi!!!
Tham gia
17/4/16
Bài viết
2,701
Được thích
2,434
Giới tính
Nam
Nghề nghiệp
Nhân viên kỹ thuật in ấn
Em chào mọi người!

Em có vấn đề nhờ mọi người hỗ trợ.

Em có đoạn code này:
PHP:
Dim aMOQ, aLGH, aGIOCOLLECT, aLDH

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim eRow As Long, supBln As Boolean, Rng As Range

  If Target.Address(0, 0) = "A3" Or Target.Address(0, 0) = "B1" Then
    Call TangToc(False)
    eRow = Range("A" & Rows.Count).End(xlUp).Row
    If eRow > 4 Then Range("A5:K" & eRow).Clear
    Call LungTung
    Call TangToc(True)
  End If
End Sub

Private Sub LungTung()
  Dim sArr(), cArr(), Res(), S, colArr
  Dim i As Long, eRow As Long, sRow As Long, k As Long
  Dim Contract As String, Stastus As String, iKey

  With Sheets("Car order")
    cArr = .Range("B2:F" & .Range("B" & Rows.Count).End(xlUp).Row).Value
  End With

  With Sheets("CAR proposal")
    sArr = .Range("C2:AK" & .Range("D" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)

  With CreateObject("scripting.dictionary")
    For i = 1 To UBound(cArr)
      iKey = cArr(i, 1)
      If .exists(iKey) = False Then .Add iKey, cArr(i, 5)
    Next i
    For i = 1 To sRow
      iKey = sArr(i, 1)
      If .exists(iKey) Then sArr(i, 10) = UCase(.Item(iKey)) Else sArr(i, 10) = ""
    Next i
  End With

  Stastus = UCase(Left(Range("B1").Value, 3))
  Contract = UCase(Range("A3").Value) & "*"
  With CreateObject("scripting.dictionary")
    For i = 1 To sRow
      If Left(sArr(i, 10), 3) = Stastus Or Len(Stastus) = 0 Then
        If UCase(sArr(i, 4)) Like Contract Then
          iKey = sArr(i, 2)
          If .exists(iKey) = False Then
            k = k + 1
            .Add iKey, Array(i)
          Else
            S = .Item(iKey)
            ReDim Preserve S(0 To UBound(S) + 1)
            S(UBound(S)) = i
            .Item(iKey) = S
          End If
        End If
      End If
    Next i
  
    If k Then
      If TypeName(aMOQ) <> "Variant()" Then Call CreateArr_DuLieuTimkiem
      colArr = Array(, 9, 11, 21, 22, 23, 26, 31, 32, 33, 34, 35)
      k = 0
      For Each iKey In .keys
        eRow = Range("A" & Rows.Count).End(xlUp).Row
        k = k + 1
        If k > 1 Then
          Range("A1:K4").Copy
          Range("A" & eRow + 1).PasteSpecial Paste:=xlPasteValues
          Range("A" & eRow + 1).PasteSpecial Paste:=xlPasteFormats
          Application.CutCopyMode = False
          eRow = eRow + 4
        End If

        Range("C" & eRow - 1) = iKey
        Set Rng = Range("D" & eRow - 1).Resize(, 8)
        Rng.ClearContents
        Call Dong_3(Rng, iKey)
      
        S = .Item(iKey)
        ReDim Res(0 To UBound(S), 1 To UBound(colArr))
        For n = 0 To UBound(S)
          If n = 0 Then Range("B" & eRow - 1) = sArr(S(n), 3)
          For j = 1 To UBound(colArr)
            Res(n, j) = sArr(S(n), colArr(j))
          Next j
        Next n
      
        Range("A" & eRow + 1).Resize(n).NumberFormat = "@"
        Range("A" & eRow + 1).Resize(n, UBound(colArr)) = Res
        Range("A" & eRow + 1).Resize(n, UBound(colArr)).Borders.LineStyle = 1
        If n > 1 Then Range("A" & eRow + 1).Resize(n, UBound(colArr)).Sort Range("A" & eRow + 1), 1, Header:=xlNo
      Next
      eRow = Range("A" & Rows.Count).End(xlUp).Row
      Range("E3:F" & eRow).NumberFormat = "#,###;[red](#,###);"
      Cells.EntireColumn.AutoFit
      Cells.EntireRow.AutoFit
    End If
  End With
End Sub

Private Sub CreateArr_DuLieuTimkiem()
  Dim wb As Workbook, eRow As Long

  Set wb = Workbooks.Open(ThisWorkbook.Path & "\DU LIEU TIM KIEM1.xlsm")
  With wb.Sheets("MOQ")
    If .AutoFilterMode = True Then .AutoFilterMode = False
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow > 1 Then aMOQ = .Range("B2:H" & eRow).Value
  End With

  With wb.Sheets("LGH")
    If .AutoFilterMode = True Then .AutoFilterMode = False
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow > 1 Then aLGH = .Range("B2:I" & eRow).Value
  End With
    
  With wb.Sheets("GIO COLLECT")
    If .AutoFilterMode = True Then .AutoFilterMode = False
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow > 1 Then aGIOCOLLECT = .Range("A2:C" & eRow).Value
  End With

  With wb.Sheets("LDH")
    If .AutoFilterMode = True Then .AutoFilterMode = False
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow > 1 Then aLDH = .Range("B2:P" & eRow).Value
  End With
  wb.Close False
End Sub

Private Sub Dong_3(ByRef Rng, ByVal iKey As String)
  Dim wb As Workbook, sArr()
  Dim i As Long, eRow As Long, sRow As Long

      sArr = aMOQ
      sRow = UBound(sArr)
      For i = 1 To sRow
        If sArr(i, 1) = iKey Then
          If Len(sArr(i, 4)) > 0 Then
            Rng(1, 1) = sArr(i, 4)
          ElseIf Len(sArr(i, 7)) > 0 Then
            Rng(1, 1) = sArr(i, 7)
          End If
          If Len(sArr(i, 3)) > 0 Then
            Rng(1, 2) = sArr(i, 3)
          ElseIf Len(sArr(i, 5)) > 0 Then
            Rng(1, 2) = sArr(i, 5)
          End If
          Exit For
        End If
      Next i

      sArr = aLGH
      sRow = UBound(sArr)
      For i = 1 To sRow
        If sArr(i, 1) = iKey Then
          If Len(sArr(i, 8)) > 0 Then Rng(1, 3) = sArr(i, 8)
          If Len(sArr(i, 3)) > 0 Then Rng(1, 4) = sArr(i, 3)
          Exit For
        End If
      Next i

      sArr = aGIOCOLLECT
      sRow = UBound(sArr)
      For i = 1 To sRow
        If sArr(i, 1) = iKey Then
          If Len(sArr(i, 3)) > 0 Then Rng(1, 5) = sArr(i, 3)
          Exit For
        End If
      Next i

      sArr = aLDH
      sRow = UBound(sArr)
      For i = 1 To sRow
        If sArr(i, 1) = iKey Then
          If Len(sArr(i, 15)) > 0 Then Rng(1, 6) = Replace(Application.Trim(Replace(sArr(i, 15), ",", " ")), " ", ",")
          If Len(sArr(i, 4)) > 0 Then Rng(1, 7) = sArr(i, 4)
          If Len(sArr(i, 5)) > 0 Then Rng(1, 8) = sArr(i, 5)
          Exit For
        End If
      Next i
End Sub

Private Sub TangToc(ByVal Bln As Boolean)
  Application.EnableEvents = Bln
  Application.ScreenUpdating = Bln
End Sub
Code này sẽ gộp chung nếu mã nhà cung cấp , tình trạng(Status), Tên nhà cung cấp, mã hợp đồng(M.....) trùng nhau và số đơn hàng khác nhau.
Code khi chạy nó gộp chung lại.
12.PNG

15.PNG
Trong sheet VD em có làm ví dụ mẫu.
Em muốn tách ra như thế này!


Số Order No 1923030809666
13.PNG
Số Order No 1923030809685

14.PNG

Em nhờ mọi người chỉnh sửa!

Em cảm ơn mọi người nhiều!
 

File đính kèm

Lần chỉnh sửa cuối:
Em chào mọi người!

Em có vấn đề nhờ mọi người hỗ trợ.

Em có đoạn code này:
PHP:
Dim aMOQ, aLGH, aGIOCOLLECT, aLDH

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim eRow As Long, supBln As Boolean, Rng As Range

  If Target.Address(0, 0) = "A3" Or Target.Address(0, 0) = "B1" Then
    Call TangToc(False)
    eRow = Range("A" & Rows.Count).End(xlUp).Row
    If eRow > 4 Then Range("A5:K" & eRow).Clear
    Call LungTung
    Call TangToc(True)
  End If
End Sub

Private Sub LungTung()
  Dim sArr(), cArr(), Res(), S, colArr
  Dim i As Long, eRow As Long, sRow As Long, k As Long
  Dim Contract As String, Stastus As String, iKey

  With Sheets("Car order")
    cArr = .Range("B2:F" & .Range("B" & Rows.Count).End(xlUp).Row).Value
  End With

  With Sheets("CAR proposal")
    sArr = .Range("C2:AK" & .Range("D" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)

  With CreateObject("scripting.dictionary")
    For i = 1 To UBound(cArr)
      iKey = cArr(i, 1)
      If .exists(iKey) = False Then .Add iKey, cArr(i, 5)
    Next i
    For i = 1 To sRow
      iKey = sArr(i, 1)
      If .exists(iKey) Then sArr(i, 10) = UCase(.Item(iKey)) Else sArr(i, 10) = ""
    Next i
  End With

  Stastus = UCase(Left(Range("B1").Value, 3))
  Contract = UCase(Range("A3").Value) & "*"
  With CreateObject("scripting.dictionary")
    For i = 1 To sRow
      If Left(sArr(i, 10), 3) = Stastus Or Len(Stastus) = 0 Then
        If UCase(sArr(i, 4)) Like Contract Then
          iKey = sArr(i, 2)
          If .exists(iKey) = False Then
            k = k + 1
            .Add iKey, Array(i)
          Else
            S = .Item(iKey)
            ReDim Preserve S(0 To UBound(S) + 1)
            S(UBound(S)) = i
            .Item(iKey) = S
          End If
        End If
      End If
    Next i
 
    If k Then
      If TypeName(aMOQ) <> "Variant()" Then Call CreateArr_DuLieuTimkiem
      colArr = Array(, 9, 11, 21, 22, 23, 26, 31, 32, 33, 34, 35)
      k = 0
      For Each iKey In .keys
        eRow = Range("A" & Rows.Count).End(xlUp).Row
        k = k + 1
        If k > 1 Then
          Range("A1:K4").Copy
          Range("A" & eRow + 1).PasteSpecial Paste:=xlPasteValues
          Range("A" & eRow + 1).PasteSpecial Paste:=xlPasteFormats
          Application.CutCopyMode = False
          eRow = eRow + 4
        End If

        Range("C" & eRow - 1) = iKey
        Set Rng = Range("D" & eRow - 1).Resize(, 8)
        Rng.ClearContents
        Call Dong_3(Rng, iKey)
     
        S = .Item(iKey)
        ReDim Res(0 To UBound(S), 1 To UBound(colArr))
        For n = 0 To UBound(S)
          If n = 0 Then Range("B" & eRow - 1) = sArr(S(n), 3)
          For j = 1 To UBound(colArr)
            Res(n, j) = sArr(S(n), colArr(j))
          Next j
        Next n
     
        Range("A" & eRow + 1).Resize(n).NumberFormat = "@"
        Range("A" & eRow + 1).Resize(n, UBound(colArr)) = Res
        Range("A" & eRow + 1).Resize(n, UBound(colArr)).Borders.LineStyle = 1
        If n > 1 Then Range("A" & eRow + 1).Resize(n, UBound(colArr)).Sort Range("A" & eRow + 1), 1, Header:=xlNo
      Next
      eRow = Range("A" & Rows.Count).End(xlUp).Row
      Range("E3:F" & eRow).NumberFormat = "#,###;[red](#,###);"
      Cells.EntireColumn.AutoFit
      Cells.EntireRow.AutoFit
    End If
  End With
End Sub

Private Sub CreateArr_DuLieuTimkiem()
  Dim wb As Workbook, eRow As Long

  Set wb = Workbooks.Open(ThisWorkbook.Path & "\DU LIEU TIM KIEM1.xlsm")
  With wb.Sheets("MOQ")
    If .AutoFilterMode = True Then .AutoFilterMode = False
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow > 1 Then aMOQ = .Range("B2:H" & eRow).Value
  End With

  With wb.Sheets("LGH")
    If .AutoFilterMode = True Then .AutoFilterMode = False
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow > 1 Then aLGH = .Range("B2:I" & eRow).Value
  End With
   
  With wb.Sheets("GIO COLLECT")
    If .AutoFilterMode = True Then .AutoFilterMode = False
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow > 1 Then aGIOCOLLECT = .Range("A2:C" & eRow).Value
  End With

  With wb.Sheets("LDH")
    If .AutoFilterMode = True Then .AutoFilterMode = False
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow > 1 Then aLDH = .Range("B2:P" & eRow).Value
  End With
  wb.Close False
End Sub

Private Sub Dong_3(ByRef Rng, ByVal iKey As String)
  Dim wb As Workbook, sArr()
  Dim i As Long, eRow As Long, sRow As Long

      sArr = aMOQ
      sRow = UBound(sArr)
      For i = 1 To sRow
        If sArr(i, 1) = iKey Then
          If Len(sArr(i, 4)) > 0 Then
            Rng(1, 1) = sArr(i, 4)
          ElseIf Len(sArr(i, 7)) > 0 Then
            Rng(1, 1) = sArr(i, 7)
          End If
          If Len(sArr(i, 3)) > 0 Then
            Rng(1, 2) = sArr(i, 3)
          ElseIf Len(sArr(i, 5)) > 0 Then
            Rng(1, 2) = sArr(i, 5)
          End If
          Exit For
        End If
      Next i

      sArr = aLGH
      sRow = UBound(sArr)
      For i = 1 To sRow
        If sArr(i, 1) = iKey Then
          If Len(sArr(i, 8)) > 0 Then Rng(1, 3) = sArr(i, 8)
          If Len(sArr(i, 3)) > 0 Then Rng(1, 4) = sArr(i, 3)
          Exit For
        End If
      Next i

      sArr = aGIOCOLLECT
      sRow = UBound(sArr)
      For i = 1 To sRow
        If sArr(i, 1) = iKey Then
          If Len(sArr(i, 3)) > 0 Then Rng(1, 5) = sArr(i, 3)
          Exit For
        End If
      Next i

      sArr = aLDH
      sRow = UBound(sArr)
      For i = 1 To sRow
        If sArr(i, 1) = iKey Then
          If Len(sArr(i, 15)) > 0 Then Rng(1, 6) = Replace(Application.Trim(Replace(sArr(i, 15), ",", " ")), " ", ",")
          If Len(sArr(i, 4)) > 0 Then Rng(1, 7) = sArr(i, 4)
          If Len(sArr(i, 5)) > 0 Then Rng(1, 8) = sArr(i, 5)
          Exit For
        End If
      Next i
End Sub

Private Sub TangToc(ByVal Bln As Boolean)
  Application.EnableEvents = Bln
  Application.ScreenUpdating = Bln
End Sub
Code này sẽ gộp chung nếu mã nhà cung cấp , tình trạng(Status), Tên nhà cung cấp, mã hợp đồng(M.....) trùng nhau và số đơn hàng khác nhau.
Code khi chạy nó gộp chung lại.
View attachment 220185

View attachment 220184
Trong sheet VD em có làm ví dụ mẫu.
Em muốn tách ra như thế này!


Số Order No 1923030809666
View attachment 220179
Số Order No 1923030809685

View attachment 220180

Em nhờ mọi người chỉnh sửa!

Em cảm ơn mọi người nhiều!
Code dai vay.
 
Upvote 0
Code này chạy chậm lắm, phải kg bạn?
 
Upvote 0
Do câu lệnh này:
Contract = UCase(Range("A3").Value) & "*"
Kết quả Contract = "R*"

và câu lệnh này:
If UCase(sArr(i, 4)) Like Contract Then
So sánh tương đối với R* thì với dữ liệu như hình thì cả 2 contract đều thỏa điều kiện

220193
 
Upvote 0
Do câu lệnh này:
Contract = UCase(Range("A3").Value) & "*"
Kết quả Contract = "R*"

và câu lệnh này:
If UCase(sArr(i, 4)) Like Contract Then
So sánh tương đối với R* thì với dữ liệu như hình thì cả 2 contract đều thỏa điều kiện

View attachment 220193
Vậy code đó sửa sao Thầy ơi!
Em đang bị rối đoạn đó.
Em cảm ơn Thầy nhiều!
 
Upvote 0
Dictionary thứ nhì nối thêm Contract No vào key:
PHP:
If Left(sArr(i, 10), 3) = Stastus Or Len(Stastus) = 0 Then
        If UCase(sArr(i, 4)) Like Contract Then
          iKey = sArr(i, 2) & "," & sArr(i, 4) 'Supplier code + Contract No
Khi gọi Sub Dong_3 và truyền tham số thì phải tách chuỗi iKey lấy Supplier code:
PHP:
Call Dong_3(Rng, Split(iKey, ",")(0)) 'Supplier code
Tên nhà cung cấp nối thêm Order No cho rõ ràng: Nếu 1 nhà CC có nhiều Contract No và tách báo cáo ra phải có thông tin
PHP:
If n = 0 Then Range("B" & eRow - 1) = sArr(S(n), 3) & " (Contract No " & Split(iKey, ",")(1) & ")"

Ghi chú:
1. Trước khi gán giá trị cho cArr và sArr nên gỡ Autofilter vì nếu đang filter thì dữ liệu bị thiếu
2. Chỉnh sửa như trên chỉ nhằm fix lỗi hiện tại, chưa làm gì để tối ưu thêm về thuật toán hoặc code
 

File đính kèm

Upvote 0
Dictionary thứ nhì nối thêm Order No vào key:
PHP:
If Left(sArr(i, 10), 3) = Stastus Or Len(Stastus) = 0 Then
        If UCase(sArr(i, 4)) Like Contract Then
          iKey = sArr(i, 2) & "," & sArr(i, 4) 'Supplier code + contract No
Khi gọi Sub Dong_3 và truyền tham số thì phải tách chuỗi iKey lấy Supplier code:
PHP:
Call Dong_3(Rng, Split(iKey, ",")(0)) 'Supplier code
Tên nhà cung cấp nối thêm Order No cho rõ ràng: Nếu 1 nhà CC có nhiều Order và tách báo cáo ra phải có thông tin
PHP:
If n = 0 Then Range("B" & eRow - 1) = sArr(S(n), 3) & " (Order No " & Split(iKey, ",")(1) & ")"

Ghi chú:
1. Trước khi gán giá trị cho cArr và sArr nên gỡ Autofilter vì nếu đang filter thì dữ liệu bị thiếu
2. Chỉnh sửa như trên chỉ nhằm fix lỗi hiện tại, chưa làm gì để tối ưu thêm về thuật toán hoặc code
Em cảm ơn Thầy nhiều!
Kết quả mỹ mãn Thầy ơi.
Nhờ Thầy tối ưu lại code nữa là đẹp, Code còn chạy hơi chậm.

Em cảm ơn Thầy nhiều!
 
Upvote 0
Hiện tại chạy dưới 0.5 giây, chấp nhận được rồi
Thầy ơi! Cho em hỏi vấn đề thiết lập trang in là, khi trích lọc dữ liệu ra mình chỉ chọn trong vùng đó khi nhấn nút Print thì cách làm sao Thầy!

Em cảm ơn Thầy nhiều!
 
Upvote 0
Record macro việc thiết lập print area, chỉnh lại chút xíu để lấy dòng cuối & cột cuối
 
Upvote 0
Record macro việc thiết lập print area, chỉnh lại chút xíu để lấy dòng cuối & cột cuối
Em record được cái này.
PHP:
Sub inan()
'
' inan Macro
'
' Keyboard Shortcut: Ctrl+Shift+K
'
    Range("A1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    ActiveWindow.View = xlPageBreakPreview
    ActiveSheet.VPageBreaks(2).DragOff Direction:=xlToRight, RegionIndex:=1
    ActiveSheet.VPageBreaks(1).DragOff Direction:=xlToRight, RegionIndex:=1
    ActiveSheet.VPageBreaks(1).DragOff Direction:=xlToRight, RegionIndex:=1
  
    Columns("C:C").EntireColumn.AutoFit
    ActiveSheet.VPageBreaks(1).DragOff Direction:=xlToRight, RegionIndex:=1
    Columns("B:B").EntireColumn.AutoFit
    Columns("B:B").Select
    ActiveSheet.VPageBreaks(1).DragOff Direction:=xlToRight, RegionIndex:=1
    Columns("G:G").EntireColumn.AutoFit
    Columns("C:C").ColumnWidth = 11.29
    ActiveSheet.VPageBreaks(1).DragOff Direction:=xlToRight, RegionIndex:=1
    End Sub
 
Upvote 0
Tôi record macro được mỗi 1 dòng:
PHP:
ActiveSheet.PageSetup.PrintArea = "$A$1:$K$316"
Thêm 2 dòng này sẽ có lợi:
PHP:
ActiveSheet.PageSetup.FitToPagesWide = 1
ActiveSheet.PageSetup.FitToPagesTall = False
Tóm lại là thêm đoạn này vào cuối sub lungtung:
PHP:
  eRow = [A100000].End(xlUp).Row
  With ActiveSheet.PageSetup
    .PrintArea = "$A$1:$K$" & eRow
    .FitToPagesWide = 1
    .FitToPagesTall = False
  End With
 
Upvote 0
Xin góp vài ngu ý về optimize code tới bạn huonglien1901:
1. Không dùng TypeName, dùng VarType. Code ASM của hàm TypeName khủng khiếp lắm, chả biết VBA làm cái gì mà kinh khủng thế, cở 3 cái màn hình này.
2. Dùng UCase$, Left$ thay cho UCase, Left. Tốc độ các hàm VBA có $ ở sau chỉ = 1/3-1/4 các hàm không có $
3. Không dùng Like, dùng InStr. Code ASM của Like cũng cỡ 2 màn hình này, InStr thì đơn giản hơn rất nhiều.
4. Không dùng Redim Preserve (X + 1) trong vòng For. Nên Redim bự bự, đủ dùng ở bắt đầu, ngoài vòng For. Sau vòng For Redim Preserve lại cho khớp.
Mình tối kỵ cái Redim trong vòng For này, VBA phải memalloc memory mới, memcpy nội dung cũ qua memory mới, free memory cũ. Hệ điều hành làm việc mệt mỏi đấy.
5. Debug thử xem trong vòng For, những lệnh, hàm... nào không thay đổi giữa những lần Next thì đưa ra ngoài vòng For.
.....
Thử đi bạn, xem tốc độ lên được bao nhiêu.
Thân.
 
Upvote 0
Hì hì, sao cười bác @SA_DQ ?
 
Upvote 0
Xin góp vài ngu ý về optimize code tới bạn huonglien1901:
1. Không dùng TypeName, dùng VarType. Code ASM của hàm TypeName khủng khiếp lắm, chả biết VBA làm cái gì mà kinh khủng thế, cở 3 cái màn hình này.
2. Dùng UCase$, Left$ thay cho UCase, Left. Tốc độ các hàm VBA có $ ở sau chỉ = 1/3-1/4 các hàm không có $
3. Không dùng Like, dùng InStr. Code ASM của Like cũng cỡ 2 màn hình này, InStr thì đơn giản hơn rất nhiều.
4. Không dùng Redim Preserve (X + 1) trong vòng For. Nên Redim bự bự, đủ dùng ở bắt đầu, ngoài vòng For. Sau vòng For Redim Preserve lại cho khớp.
Mình tối kỵ cái Redim trong vòng For này, VBA phải memalloc memory mới, memcpy nội dung cũ qua memory mới, free memory cũ. Hệ điều hành làm việc mệt mỏi đấy.
5. Debug thử xem trong vòng For, những lệnh, hàm... nào không thay đổi giữa những lần Next thì đưa ra ngoài vòng For.
.....
Thử đi bạn, xem tốc độ lên được bao nhiêu.
Thân.
Nhờ Anh tối ưu thuật toán code lại. Em còn gà mờ lắm.
Em cảm ơn Anh nhiều!
 
Upvote 0
Viết lại toàn bộ thì tui thua. "Nười nắm".
Bạn thay đổi code từ từ đi.
 
Upvote 0
Web KT

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

Back
Top Bottom