Xử lý code VBA chạy chậm

Liên hệ QC

langkhachquaduong

Thành viên chính thức
Tham gia
23/7/19
Bài viết
50
Được thích
8
Mình mới tập tành VBA.Mình có viết code làm báo cáo tự động nhưng chạy rất chậm.Mong mọi người giúp đỡ.
 

File đính kèm

mình sửa lại chút:
Sub test2()
Sheet1.Range("h6:l5000").Clear
Dim ngay_1, ngay_2, ten As Range
Dim i, k, j As Long
Dim lr As Long
Dim arr As Variant
Dim temp
Set ngay_1 = Sheet1.Range("j2")
Set ngay_2 = Sheet1.Range("j3")
Set ten = Sheet1.Range("j4")
k = 0
lr = Sheet1.Range("a" & Rows.Count).End(xlUp).row
arr = Sheet1.Range("a3:f" & lr)
ReDim temp(1 To UBound(arr), 1 To 5)
For i = LBound(arr) To UBound(arr)
If arr(i, 2) = ten And arr(i, 1) >= ngay_1 And arr(i, 1) <= ngay_2 Then
k = k + 1
temp(k, 1) = arr(i, 1)
temp(k, 2) = arr(i, 2)
temp(k, 3) = arr(i, 3)
temp(k, 4) = arr(i, 4)
temp(k, 5) = arr(i, 5)
End If
Next i
Sheet1.Range("H6", "L" & Sheet1.Cells(Rows.Count, 8).End(xlUp).row + 5).ClearContents
Sheet1.Range("H6").Resize(UBound(temp, 1), UBound(temp, 2)) = temp
Sheet1.Range("h6:l" & k).Borders.LineStyle = xlHairline

End Sub
 
Upvote 0
mình sửa lại chút:
Sub test2()
Sheet1.Range("h6:l5000").Clear
Dim ngay_1, ngay_2, ten As Range
Dim i, k, j As Long
Dim lr As Long
Dim arr As Variant
Dim temp
Chỉ là góp ý nhỏ:
Dim ngay_1, ngay_2, ten As Range
Dim i, k, j As Long
Bạn nên khai báo thế này (tạm gọi là cho tường minh)
Dim ngay_1 As Range, ngay_2 As Range, ten As Range
Dim i As Long, k As Long, j As Long
Nếu không thì các biến khác bị xem như là kiểu data type mặc định là Variant, nó y chang như kiểu ta khai báo Dim temp

Thí nghiệm:
Với 2 biến Nghia và Dep sau dấu chấm (.) nó không show cái list theo thuộc tính Range, nhưng với Trai thì khác.
1582598668073.png
 
Lần chỉnh sửa cuối:
Upvote 0
Mình mới tập tành VBA.Mình có viết code làm báo cáo tự động nhưng chạy rất chậm.Mong mọi người giúp đỡ.
Thử với Filter mà không dùng vòng lặp.
Trong File tôi chừa có 100 ngàn dòng (vì quá dung lượng nên tôi xóa bớt), bạn Copy dữ liệu bỏ và sheet1 rồi thử code.
 

File đính kèm

Upvote 0
mình sửa lại chút:
Sub test2()
Sheet1.Range("h6:l5000").Clear
Dim ngay_1, ngay_2, ten As Range
Dim i, k, j As Long
Dim lr As Long
Dim arr As Variant
Dim temp
Set ngay_1 = Sheet1.Range("j2")
Set ngay_2 = Sheet1.Range("j3")
Set ten = Sheet1.Range("j4")
k = 0
lr = Sheet1.Range("a" & Rows.Count).End(xlUp).row
arr = Sheet1.Range("a3:f" & lr)
ReDim temp(1 To UBound(arr), 1 To 5)
For i = LBound(arr) To UBound(arr)
If arr(i, 2) = ten And arr(i, 1) >= ngay_1 And arr(i, 1) <= ngay_2 Then
k = k + 1
temp(k, 1) = arr(i, 1)
temp(k, 2) = arr(i, 2)
temp(k, 3) = arr(i, 3)
temp(k, 4) = arr(i, 4)
temp(k, 5) = arr(i, 5)
End If
Next i
Sheet1.Range("H6", "L" & Sheet1.Cells(Rows.Count, 8).End(xlUp).row + 5).ClearContents
Sheet1.Range("H6").Resize(UBound(temp, 1), UBound(temp, 2)) = temp
Sheet1.Range("h6:l" & k).Borders.LineStyle = xlHairline

End Sub
1. Sao mình không gán trực tiếp vào range mà phải thông qua biến temp
2.Tôi thấy bạn gán dim temp thì nó sẽ hiểu là variant, nếu gán dim temp as variant có ảnh hưởng gì không?
3.Sheet1.Range("H6").Resize(UBound(temp, 1), UBound(temp, 2)) = temp mình chưa hiểu code này lắm, ý nghĩa ntn?
4.Mình sửa lại code Sheet1.Range("h6:l" & k + 5).Borders.LineStyle = xlHairline
 
Lần chỉnh sửa cuối:
Upvote 0
1. Sao mình không gán trực tiếp vào range mà phải thông qua biến temp
2.Tôi thấy bạn gán dim temp thì nó sẽ hiểu là variant, nếu gán dim temp as variant có ảnh hưởng gì không?
3.Sheet1.Range("H6").Resize(UBound(temp, 1), UBound(temp, 2)) = temp mình chưa hiểu code này lắm, ý nghĩa ntn?
4.Mình sửa lại code Sheet1.Range("h6:l" & k + 5).Borders.LineStyle = xlHairline
1. Bạn thử chưa? và thấy nó có nhanh hơn không? Như mình hiểu bạn for i = ... to ... rồi sheet..range.. thì nó duyệt qua từng ô excel. Và nó chậm
2. Không. Như mình hiểu thì như thế
3. Lệnh resize bình thường mà: resize(hàng, cột) = ...
 
Upvote 0
1. Bạn thử chưa? và thấy nó có nhanh hơn không? Như mình hiểu bạn for i = ... to ... rồi sheet..range.. thì nó duyệt qua từng ô excel. Và nó chậm
2. Không. Như mình hiểu thì như thế
3. Lệnh resize bình thường mà: resize(hàng, cột) = ...
1.Minh đã thử nhanh hơn là mình gán vào range
2.Cám ơn bạn đã giải thích nhé.
 
Upvote 0
Web KT

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

Back
Top Bottom