Làm sao để code chạy nhanh

Liên hệ QC

Hoacomay96

Thành viên chính thức
Tham gia
18/3/08
Bài viết
96
Được thích
8
Các bác cho em hỏi, em có đoạn code thực hiện tìm điều kiện để chèn dòng trắng vào vùng dữ liêụ, và code mở từng file và saveas sang tên khác nhưng 2 code thực hiện lệnh rất lâu. ví dụ với dữ liệu 3000 dòng và chèn dòng trắng là 1000 dòng thì thời gian thực hiện hết là 30 phút, với code để save as thì với 100 file mất khoảng 15 phút vậy em nhờ các bác trên diễn đàn bảo em phương pháp nào để tăng tốc cho code. em xin cảm ơn.
 
bạn có thể tắt tính năng tự động tính toán bằng lệnh sau:
Application.Calculation = xlManual
hay thêm cái này:
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False
ngoài ra bạn nên tin chỉnh lại giải thuật để xử lý nhanh hơn.
 
Upvote 0
Giải đáp câu 1 đây, bạn thử & cho biết kết quả, nha!

Em có đoạn code thực hiện tìm điều kiện để chèn dòng trắng vào vùng dữ liêụ, nhưng code thực hiện lệnh rất lâu. ví dụ với dữ liệu 3000 dòng và chèn dòng trắng là 1000 dòng thì thời gian thực hiện hết là 30 phút. Vậy em nhờ các bác trên diễn đàn bảo em phương pháp nào để tăng tốc cho code. em xin cảm ơn.
Với 6.000 dòng dữ liệu, gồm 4 cột [Ma], [HoTen], [NgaySinh] & [DiaChi] Với độ dài thực thụ
sau khi chạy macro sẽ cho ta 8.931 dòng trong khoảng 0.3281 gy trên máy của mình!


PHP:
Option Explicit
 Sub Add1000Row() 
 On Error Resume Next
  Dim lRow As Long, Wz As Long
 Dim Rng As Range:          Dim Timer_ As Double
 
 Sheets("Sheet2").Select
 lRow = Range("B65432").End(xlUp).Row
    Application.ScreenUpdating = False
 Timer_ = Timer:            Range("E2") = lRow
 For Wz = lRow To 1 Step -1
    With Range("A" & Wz)
        If .Value Mod 180 = 3 Then
            If Rng Is Nothing Then
                Set Rng = .Resize(10, 1)
            Else
                Set Rng = Union(Rng, .Resize(25, 1))
            End If
        ElseIf .Value Mod 120 = 4 Then
            If Rng Is Nothing Then
                Set Rng = .Resize(10, 1)
            Else
                Set Rng = Union(Rng, .Resize(50, 1))
            End If
        End If
    End With
 Next Wz
 Rng.EntireRow.Select
 Selection.Insert shift:=xlDown
 Range("E4") = Timer - Timer_
 Range("E6") = Range("B65432").End(xlUp).Row
End Sub

Mã:
[COLOR="White"]Sub DelectRows()
 Dim lRow As Long, Wz As Long
 Dim Rng As Range

  lRow = Sheets("Sheet2").Range("B65432").End(xlUp).Row
  For Wz = lRow To 1 Step -1
    If Cells(Wz, 1) = "" Then
        If Rng Is Nothing Then
            Set Rng = Cells(Wz, 1).EntireRow
        Else
            Set Rng = Union(Rng, Cells(Wz, 1).EntireRow)
        End If
    End If
  Next Wz
  Rng.Delete
  Set Rng = Nothing
End Sub[/COLOR]
 
Lần chỉnh sửa cuối:
Upvote 0
bạn có thể tắt tính năng tự động tính toán bằng lệnh sau:
Application.Calculation = xlManual
hay thêm cái này:
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False
ngoài ra bạn nên tin chỉnh lại giải thuật để xử lý nhanh hơn.
Sử dụng cách này đúng là tăng tốc cho chương trình nhưng cần phải cẩn thận mỗi khi cần kết xuất dữ liệu thì phải cho tính toán lại nếu không kết quả trả về sẽ không chính xác.

TDN
 
Upvote 0
Tăng tốc cho code

Đoạn code của em nhu sau, nho các anh xem hộ và khắc phục cho nó chạy nhanh hon.em co file du liệu kèm theo.
Option Explicit
Option Base 1
Public dir, ten1, ten2, ten3 As String
Sub ten()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
Dim path1, path2, dir, dir1, dir2 As String
Dim i, j, r, crc, tctmax, tothua As Integer
Dim Msg, x, WorkbookIsOpen As String
Dim a, b, them As Integer
Dim CreateFileList As Variant
Dim FileFilter As String, IncludeSubFolder As Boolean
Dim FileList() As String, FileCount As Long
dir = "D:\txt\"
CreateFileList = ""
Erase FileList
If FileFilter = "" Then FileFilter = "*.xls*"
With Application.FileSearch
.NewSearch
.LookIn = dir
.Filename = FileFilter
.SearchSubFolders = IncludeSubFolder
.FileType = msoFileTypeAllFiles
If .Execute(SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending) = 0 Then Exit Sub
ReDim FileList(.FoundFiles.Count)
For FileCount = 1 To .FoundFiles.Count
FileList(FileCount) = .FoundFiles(FileCount)
Next FileCount
MsgBox "Tæng sè file lµ: " & FileCount - 1, , "files"
.FileType = msoFileTypeExcelWorkbooks
End With
CreateFileList = FileList
Erase FileList
ten1 = InputBox("nhËp tªn 1: ", "ten 1")
ten2 = InputBox("nhap ten 2: ", "ten 2 ")
ten2 = InputBox("nhËp tªn 3: ", "ten 3")
dir2 = "d:\tenkhac\"
On Error Resume Next
For i = 1 To FileCount - 1
path1 = dir & "TXT_" & Format(i, "") & ".xls"
path2 = dir2 & "ten_" & Format(i, "") & ".xls"
For j = 1 To FileCount - 1
Const xlInfo = -4129
On Error Resume Next
Workbooks(path1).Activate
If Err = 0 Then
MsgBox "File TXT ®ang më", , "txt "
ActiveWorkbook.Close
Else
WorkbookIsOpen = False
End If
Next j
Workbooks.Open Filename:=path1
ActiveWorkbook.SaveAs Filename:=path2
Workbooks(path1).Close
ActiveSheet.PageSetup.PrintArea = ""
With ActiveSheet.PageSetup
.LeftMargin = Application.InchesToPoints(0.75)
.RightMargin = Application.InchesToPoints(0)
.TopMargin = Application.InchesToPoints(0.5)
.BottomMargin = Application.InchesToPoints(0)
.HeaderMargin = Application.InchesToPoints(0.5)
.FooterMargin = Application.InchesToPoints(0.5)
.FirstPageNumber = xlAutomatic
.Order = xlDownThenOver
.PaperSize = xlPaperA4
.Zoom = 100
.PrintErrors = xlPrintErrorsDisplayed
End With
ActiveWorkbook.Worksheets("Sheet1").Select
Rows("1:4").Select
Selection.Insert Shift:=xlDown
Range(Cells(1, 1), Cells(1, 7)).Select: Selection.Merge
Range(Cells(2, 1), Cells(2, 7)).Select: Selection.Merge
Range(Cells(3, 1), Cells(3, 7)).Select: Selection.Merge
Range(Cells(1, 1), Cells(3, 1)).Select: Selection.HorizontalAlignment = xlVAlignCenter
Cells(1, 1).Select
With Selection.Font
.Name = ".VnArial NarrowH"
.Size = 12
End With
Cells(2, 1).Select
With Selection.Font
.Name = ".VnAvant"
.Size = 12
.Bold = True
End With
Cells(3, 1).Select
With Selection.Font
.Name = ".VnArial NarrowH"
.Size = 10
End With
Cells(1, 1) = "b¶ng thèng kª DT"
Cells(2, 1) = "Xa : " & ten1 & " - huyen : " & ten2 & " - tinh :" & ten3
Cells(3, 1) = "So hieu: " & Cells(5, 1).Value
Cells(4, 1) = "STT": Cells(4, 2) = "TCT": Cells(4, 3) = "DT": Cells(4, 4) = "Ma dat": Cells(4, 5) = "Ten": Cells(4, 6) = "them": Cells(4, 7) = "bo"
Range(Cells(4, 1), Cells(4, 6)).Select
With Selection.Font
.Name = ".vnarial"
.Size = 11
.ColorIndex = 5
End With
Range(Cells(5, 1), Cells(5, 7)).Select.Font.Name = ".vnarial"
Range(Cells(5, 1), Cells(5, 7)).Font.Size = 10
crc = Cells(1, 1).End(xlDown).Row
tctmax = Application.WorksheetFunction.Max(Range(Cells(5, 2), Cells(crc, 2)))
For r = 5 To crc
If Cells(r, 2).Value = tctmax Then
tothua = Range(Cells(5, 2), Cells(r, 2)).Rows.Count
End If
Next r
For r = 5 To (tothua + 5)
Cells(r, 1) = r - 4
Next r
Range(Cells(tothua + 5, 1), Cells(crc, 1)).ClearContents
Range(Cells(5, 6), Cells(crc, 6)).ClearContents
them = crc + tothua * 0.2 + 1
Range(Cells(6, 1), Cells(them, 7)).Select
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlHairline
.ColorIndex = 5
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlHairline
.ColorIndex = 5
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlHairline
.ColorIndex = 5
End With
Range(Cells(4, 1), Cells(them, 7)).Select
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 3
End With
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 3
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 3
End With
Range(Cells(4, 1), Cells(4, 7)).Select
With Selection.Borders
.LineStyle = xlContinuous
End With
Range("A:A").ColumnWidth = 5: Range("B:B").ColumnWidth = 5: Range("C:C").ColumnWidth = 9.86
Range("D:D").ColumnWidth = 9.14: Range("E:E").ColumnWidth = 23.14: Range("F:F").ColumnWidth = 27
Range("G:G").ColumnWidth = 11
Range("C:C").NumberFormat = "0.0"
Range(Cells(1, 1), Cells(them + 10, 7)).RowHeight = 20
Range(Cells(1, 1), Cells(them + 10, 7)).Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
Cells(them, 1) = "Tong cong ="
Cells(them, 3) = Application.WorksheetFunction.Sum(Range(Cells(5, 3), Cells(them - 1, 4)))
Cells(them, 4).Select
Selection.HorizontalAlignment = xlLeft
Selection = "m2"
With Selection.Characters(Start:=2, Length:=1).Font
.Superscript = True
End With
Range(Cells(them, 1), Cells(them, 4)).Select
With Selection.Font
.Name = ".VnArial"
.Size = 10
.Bold = True
.HorizontalAlignment = xlLeft
End With

Cells(1, 8).Select
ActiveWorkbook.Close savechanges:=True
Next i
Application.Calculation = xlCalculationAutomatic
Application.DisplayAlerts = True
Workbooks("sofcode.xls").Save
Application.ScreenUpdating = True
End Sub
 

File đính kèm

Upvote 0
Đoạn code của em nhu sau, nho các anh xem hộ và khắc phục cho nó chạy nhanh hon.em co file du liệu kèm theo.
Mã:
Option Explicit:   Option Base 1
 Public dir, ten1, ten2, ten3 As String
Sub ten()
 Application.ScreenUpdating = False:        Application.DisplayAlerts = False
 Application.Calculation = xlCalculationManual
 Dim path1, path2, dir, dir1, dir2 As String
 Dim FileFilter As String, IncludeSubFolder As Boolean
 Dim FileList() As String, FileCount As Long
 Dim Msg, x, WorkbookIsOpen As String
 Dim i, j, r, crc, tctmax, tothua As Integer
 Dim a, b, them As Integer:                 Dim CreateFileList   As Variant

 dir = "D:\txt\"             ' '
 CreateFileList = "":                           Erase FileList
 If FileFilter = "" Then FileFilter = "*.xls*"
 With Application.FileSearch
          .NewSearch
          .LookIn = dir
          .Filename = FileFilter
          .SearchSubFolders = IncludeSubFolder
           .FileType = msoFileTypeAllFiles
           If .Execute(SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending) _
                      = 0 Then Exit Sub
           ReDim FileList(.FoundFiles.Count)
           For FileCount = 1 To .FoundFiles.Count
                  FileList(FileCount) = .FoundFiles(FileCount)
           Next FileCount
           MsgBox "Tæng sè file  lµ: " & FileCount - 1, , "files"
           .FileType = msoFileTypeExcelWorkbooks
 End With
 CreateFileList = FileList:                   Erase FileList
 ten1 = InputBox("nhËp tªn 1: ", "ten 1")
 ten2 = InputBox("nhap ten 2: ", "ten 2 ")
 ten2 = InputBox("nhËp tªn 3: ", "ten 3")
 dir2 = "d:\tenkhac\"
 On Error Resume Next
 For i = 1 To FileCount - 1
    path1 = dir & "TXT_" & Format(i, "") & ".xls"
    path2 = dir2 & "ten_" & Format(i, "") & ".xls"
    For j = 1 To FileCount - 1
        Const xlInfo = -4129
        On Error Resume Next
         Workbooks(path1).Activate
        If Err = 0 Then
             MsgBox "File TXT ®ang më", , "txt "
             ActiveWorkbook.Close
        Else
             WorkbookIsOpen = False
        End If
     Next j
     Workbooks.Open Filename:=path1:           ActiveWorkbook.SaveAs Filename:=path2
     Workbooks(path1).Close:                        ActiveSheet.PageSetup.PrintArea = ""
     With ActiveSheet.PageSetup
         .LeftMargin = Application.InchesToPoints(0.75)
        .RightMargin = Application.InchesToPoints(0)
        .TopMargin = Application.InchesToPoints(0.5)
        .BottomMargin = Application.InchesToPoints(0)
        .HeaderMargin = Application.InchesToPoints(0.5)
        .FooterMargin = Application.InchesToPoints(0.5)
        .FirstPageNumber = xlAutomatic:            .Order = xlDownThenOver
         .PaperSize = xlPaperA4:                       .Zoom = 100
         .PrintErrors = xlPrintErrorsDisplayed
      End With
      ActiveWorkbook.Worksheets("Sheet1").Select
      Rows("1:4").Select
      Selection.Insert Shift:=xlDown
      Range(Cells(1, 1), Cells(1, 7)).Select:             Selection.Merge
      Range(Cells(2, 1), Cells(2, 7)).Select:             Selection.Merge
      Range(Cells(3, 1), Cells(3, 7)).Select:             Selection.Merge
      Range(Cells(1, 1), Cells(3, 1)).Select         
      Selection.HorizontalAlignment = xlVAlignCenter
      Cells(1, 1).Select
      With Selection.Font
               .Name = ".VnArial NarrowH":                   .Size = 12
       End With
      Cells(2, 1).Select
       With Selection.Font
                .Name = ".VnAvant":                            .Size = 12
                 .Bold = True
        End With
        Cells(3, 1).Select
        With Selection.Font
                 .Name = ".VnArial NarrowH":                   .Size = 10
         End With
         Cells(1, 1) = "b¶ng thèng kª DT"
         Cells(2, 1) = "Xa : " & ten1 & " - huyen : " & ten2 & " - tinh :" & ten3
         Cells(3, 1) = "So hieu: " & Cells(5, 1).Value
         Cells(4, 1) = "STT":                         Cells(4, 2) = "TCT"
         Cells(4, 3) = "DT":                           Cells(4, 4) = "Ma dat"
         Cells(4, 5) = "Ten":                          Cells(4, 6) = "them"
         Cells(4, 7) = "bo"
         Range(Cells(4, 1), Cells(4, 6)).Select
         With Selection.Font
                .Name = ".vnarial":                                  .Size = 11
                .ColorIndex = 5
           End With
1           Range(Cells(5, 1), Cells(5, 7)).Select.Font.Name = ".vnarial"     '<<==Sai?'
          Range(Cells(5, 1), Cells(5, 7)).Font.Size = 10
          crc = Cells(1, 1).End(xlDown).Row
           tctmax = Application.WorksheetFunction.Max(Range(Cells(5, 2), _
               Cells(crc, 2)))
          For r = 5 To crc
                 If Cells(r, 2).Value = tctmax Then _
                        tothua = Range(Cells(5, 2), Cells(r, 2)).Rows.Count
           Next r
           For r = 5 To (tothua + 5)
                    Cells(r, 1) = r - 4
           Next r
           Range(Cells(tothua + 5, 1), Cells(crc, 1)).ClearContents
           Range(Cells(5, 6), Cells(crc, 6)).ClearContents
            them = crc + tothua * 0.2 + 1
           Range(Cells(6, 1), Cells(them, 7)).Select
           With Selection.Borders(xlInsideHorizontal)
                       .LineStyle = xlContinuous:                  .Weight = xlHairline
                       .ColorIndex = 5
           End With
           With Selection.Borders(xlEdgeTop)
                       .LineStyle = xlContinuous:                 .Weight = xlHairline
                       .ColorIndex = 5
           End With
           With Selection.Borders(xlEdgeBottom)
                      .LineStyle = xlContinuous:                  .Weight = xlHairline
                      .ColorIndex = 5
           End With
           Range(Cells(4, 1), Cells(them, 7)).Select
           With Selection.Borders(xlInsideVertical)
                      .LineStyle = xlContinuous:                  .ColorIndex = 3
           End With
           With Selection.Borders(xlEdgeLeft)
                   .LineStyle = xlContinuous:                     .ColorIndex = 3
           End With
          With Selection.Borders(xlEdgeRight)
                    .LineStyle = xlContinuous:                    .ColorIndex = 3
         End With
         Range(Cells(4, 1), Cells(4, 7)).Select
         With Selection.Borders
                   .LineStyle = xlContinuous 
         End With
        Range("A:A").ColumnWidth = 5:                 Range("B:B").ColumnWidth = 5
        Range("C:C").ColumnWidth = 9.86:            Range("D:D").ColumnWidth = 9.14
         Range("E:E").ColumnWidth = 23.14:           Range("F:F").ColumnWidth = 27
         Range("G:G").ColumnWidth = 11:              Range("C:C").NumberFormat = "0.0"
         Range(Cells(1, 1), Cells(them + 10, 7)).RowHeight = 20
         Range(Cells(1, 1), Cells(them + 10, 7)).Select
         With Selection
                 .HorizontalAlignment = xlCenter:        .VerticalAlignment = xlCenter
         End With
        Cells(them, 1) = "Tong cong ="
        Cells(them, 3) = Application.WorksheetFunction.Sum(Range(Cells(5, 3), _
                Cells(them - 1, 4)))
        Cells(them, 4).Select
        Selection.HorizontalAlignment = xlLeft
         Selection = "m2"
          With Selection.Characters(Start:=2, Length:=1).Font
                    .Superscript = True
          End With
          Range(Cells(them, 1), Cells(them, 4)).Select
          With Selection.Font
                    .Name = ".VnArial":                                  .Size = 10
                    .Bold = True:                         .HorizontalAlignment = xlLeft
           End With       
           Cells(1, 8).Select
           ActiveWorkbook.Close savechanges:=True
    Next i
    Application.Calculation = xlCalculationAutomatic
    Application.DisplayAlerts = True:             Workbooks("sofcode.xls").Save
Application.ScreenUpdating = True
End Sub
Nếu đây là đoạn code do bạn sản sinh ra thì mình thấy cần vài góp ý với bạn:
1*/ Mình phải bỏ ra gần 20 phút để cho nó dễ nhìn, như hiện nay. Việc này bạn nên lưu tâm; Khi học lập trình dù là thư ngôn ngữ dễ nhất, mọi cái đều phải tường minh & rõ ràng;
Vì không phải tài thánh gì, viết 1 lần là được ngay; Trong nhiều lần viết đi soát lại đó; Nếu phải tìm lỗi trong mớ lộn xộn đó thì đến bạn cũng chán nản nữa là ai sẽ giúp bạn!
Ví dụ cụ thể nha:
* Ngay khai báo các biến: Bạn có nhiều biến, nhưng để khắp nơi
Như mình thì khai biến kiểu chuỗi tập trung lại 1 chỗ; kiểu Integer tập trung lại 1 chổ
* Thụt đầu dòng các dòng lệnh & gióng cho ngay cột để dễ bề kiểm soát các vòng lặp cũng như with nào ra with đó.
* Thường chì nên không quá 2 dòng lệnh trên 1 hàng & cách nhau 1 khoảng dễ nhìn có thể;
Mình hiếm khi dùng 3 dòng lệnh trên 1 hàng; Trừ khi, VD:
Mã:
 Ij = 2:                  iW   = Ij + 3:                 iZ = 6
2./ Mình chưa thử, nhưng đoán rằng các dòng lệnh của bạn có vẻ dài, nhưng chắc không quá 10 gy đâu; Bạn xem lại:
a/. Dòng lệnh mà mình đánh số ở trên;
b/. excel của bạn đang bị virus
. . . . .

Vài lời cùng bạn, những mong hữu ích cho bạn. Đừng zận nha!
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh Sa_DQ đã mất nhiều thời gian để đọc và góp ý cho đoạn code của em.Thực sự em mới tập học lập trình VBa nên kiến thức còn hạn hẹp mong các anh thông cảm. những lời góp ý của anh thực sự bổ ích cho em. em mong các anh chỉ bảo nhiều.

Xin anh Sa_DQ cho em hỏi cái biến Timer dùng để làm gì, cách sử dụng như thế nào ạ ?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Web KT

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

Back
Top Bottom