langkhachquaduong
Thành viên chính thức
- Tham gia
- 23/7/19
- Bài viết
- 50
- Được thích
- 8
Chỉ là góp ý nhỏ: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
Thử với Filter mà không dùng vòng lặp.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 đỡ.
1. Sao mình không gán trực tiếp vào range mà phải thông qua biến tempmì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
Đã thử chạy nhanh hơn là mình dùng mảng và vòng lặ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.
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ậm1. 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.Minh đã thử nhanh hơn là mình gán vào range1. 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) = ...