Chào Thầy,
Tại sao đoạn code VBA (dưới đây) kh chạy tốc độ rất chậm, phải gần 2 phút. Thầy vui lòng hướng dẫn cách tăng tốc độ cho đoạn code. Cảm ơn Thấy.
Sub InPhieuDeNghiGiaoHang()
Application.ScreenUpdating = False
'Goi UserForm nhap du lieu dau vao
usf_NhapNgay.Show
With Worksheets("Delivery_Proposal_Letter")
.Unprotect
Dim rg As Range
Dim cond As FormatCondition
Set rg = .Range("A2:F99")
'clear any existing conditional formatting
rg.FormatConditions.Delete
'Bo an dong
.Range("A9:A200").EntireRow.Hidden = False
Dim i As Long
'An cac dong trong bang Pivot pvt_Goods_Proposal_Print
For i = 9 To 30
If .Range("B" & i).value = "" Then
.Range("B" & i).EntireRow.Hidden = True
End If
Next
'An cac dong trong bang Pivot pvt_Truck_Proposal_Print
For i = 33 To 200
If .Range("H" & i).value = "" Then
.Range("H" & i).EntireRow.Hidden = True
End If
Next
'define the rule for each conditional format
Set cond = rg.FormatConditions.Add(xlCellValue, xlEqual, "(blank)")
'define the format applied for conditional format
With cond
.Font.Color = vbWhite
End With
Application.Goto Reference:=Worksheets("Delivery_Proposal_Letter").Range("A1"), Scroll:=True
'Thiet lap Scale to Print
With .PageSetup
.Zoom = False
.FitToPagesTall = 2
.FitToPagesWide = 1
End With
.Activate
ActiveWindow.View = xlPageBreakPreview
.ResetAllPageBreaks
ActiveWindow.View = xlNormalView
.Protect
End With
Set rg = Nothing
Set cond = Nothing
i = Empty
Application.ScreenUpdating = True
End Sub
Code chậm là do 2 nguyên nhân:
1. Tư duy về sử dụng Vòng lặp
ở đây bạn dùng biến i trên cả 2 vòng lặp, và trong vòng lặp thứ 2 chạy từ 33 tới 200 chỉ với mục đích là xét ô nào không có dữ liệu thì ẩn đi. Việc này nên cân nhắc, bởi có 1 cách nhanh hơn rất nhiều là tạo bộ lọc Filter, lọc bỏ giá trị blank là xong.
Hoặc bạn có thể xét lại: nếu dùng cho mục đích xử lý bảng tính để in thôi thì có thể trích xuất dữ liệu cần in ra 1 nơi khác bằng Advanced filter. Sau đó in ở vùng mới thay vì in ngay bảng dữ liệu gốc. Như thế nhanh và đơn giản hơn nhiều.
2. Việc thiết lập trang in
Bạn đang làm khá nhiều động tác thừa liên quan tới thiết lập vùng in, đặc biệt là code
ActiveWindow.View = xlPageBreakPreview
Việc đặt activeWindow khiến excel chạy chậm, nháy màn hình nhiều.
Bạn nên xác định lại trình tự công việc cho rõ ràng hơn nhé. Mình thấy khá rối, thừa nhiều lệnh không cần thiết.
---
Gợi ý của mình là:
Từ bảng dữ liệu ban đầu => trích xuất ra 1 bảng khác bằng Advanced filter (với điều kiện loại bỏ dòng trống)
=> thiết lập vùng in cho bảng được trích xuất
(chỉ cần lệnh Set Print Area là được. Vùng in mới sẽ tính từ dòng đầu tới dòng cuối của bảng trích xuất)
Do đây là các bảng Pivot Table, nên bảng dữ liệu nó thay đổi. Thầy hướng dẫn giúp kỹ thuật Advance Filter. Cảm ơn Thầy.
Chào bạn bạn có thể đọc bài này nhé
Bạn tham khảo nội dung về code Advanced Filter trong bài 4 chương 13 nhé.
Bạn lưu ý là trong chương trình bài học không hướng dẫn cách viết code với đối tượng pivot table và table. Đây là 2 đối tượng khá đặc biệt nên code sẽ phức tạp hơn nhiều so với bình thường. Vậy nên bạn chỉ sử dụng các kỹ thuật báo cáo thông thường bằng hàm, công thức, hay bằng các công cụ có sẵn của excel như Advanced Filter thôi nhé. Khi đó ứng dụng VBA sẽ dễ dàng hơn nhiều.
Chân thành cảm ơn Thầy. Đúng là tôi đang lập trình liên quan đến các đối tượng pivot table và table, có sử dụng Power Query vì phải tạo lập các dữ liệu để đưa lên Sharepoint và OneDrive for Business, sau đó sẽ dùng cho Power BI và Power Pivot tiếp cận dữ liệu này. Đoạn code đó là liên quan đến bảng in ấn từ Pivot Table (trong đó có việc giấu "(blank)"); tuy nhiên, hôm qua từ góp ý của Thầy, tôi đã chuyển đổi các dòng lệnh, thay đổi chiến lược nên đã chạy ổn, thời gian khoảng 12-15 giây.
Cảm ơn bạn, chúc bạn học tốt cùng gitiho