HKNHKN
HKNHKN
Thảo luận 6 thảo luận
Vỗ tay 0 vỗ tay
Lượt xem 541 lượt xem

Tại sao đoạn code VBA (dưới đây) kh chạy tốc độ rất chậm phải gần

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


Thảo luận 6 câu trả lời
Lượt xem 541 lượt xem
Vỗ tay vỗ tay
HKNHKN 09:06 - Jun 05, 2021

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)

Vỗ tay vỗ tay
HKNHKN 12:06 - Jun 05, 2021

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. 

Vỗ tay vỗ tay
HKNHKN 08:06 - Jun 07, 2021

Chào bạn bạn có thể đọc bài này nhé

https://gitiho.com/blog/huong-dan-cac...

Vỗ tay vỗ tay
HKNHKN 09:06 - Jun 07, 2021

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.

Vỗ tay vỗ tay
HKNHKN 10:06 - Jun 07, 2021

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.

Vỗ tay vỗ tay
HKNHKN 13:06 - Jun 07, 2021

Cảm ơn bạn, chúc bạn học tốt cùng gitiho

Vỗ tay vỗ tay
Câu hỏi liên quan
© 2020 - Bản quyền của Công Ty Cổ Phần Công Nghệ Giáo Dục Gitiho Việt Nam
Giấy chứng nhận Đăng ký doanh nghiệp số: 0109077145, cấp bởi Sở Kế hoạch và Đầu tư TP. Hà Nội
Giấy phép mạng xã hội số: 588, cấp bởi Bộ Thông tin và Truyền thông