[HỎI] Macro chạy quá lâu, cần giúp để giảm bớt thời gian chạy macro (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

bingoo511

Thành viên mới
Tham gia
8/1/11
Bài viết
15
Được thích
0
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Range("A6:S6").Select
    Selection.AutoFill Destination:=Range("A6:S2406"), Type:=xlFillDefault
    Range("A6:S2406").Select
End Sub

Mục đích nôm na của Mình là: kéo các công thức (A6:S6) xuống 2406 dòng

Mình record một đoạn macro rồi copy vào VBA cùng sự kiện là change mục đích là để update dữ liệu khi có thay đổi!! Nhưng thời gian chạy của đoạn code trên là .... vô cùng lâu

Các bác viết lại hộ mình đoạn trên để chạy nhẹ hơn với!?
 
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Range("A6:S6").Select
    Selection.AutoFill Destination:=Range("A6:S2406"), Type:=xlFillDefault
    Range("A6:S2406").Select
End Sub

Mục đích nôm na của Mình là: kéo các công thức (A6:S6) xuống 2406 dòng

Mình record một đoạn macro rồi copy vào VBA cùng sự kiện là change mục đích là để update dữ liệu khi có thay đổi!! Nhưng thời gian chạy của đoạn code trên là .... vô cùng lâu

Các bác viết lại hộ mình đoạn trên để chạy nhẹ hơn với!?

Câu cuối chỉ A6 là đủ.
 
Upvote 0
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Range("A6:S6").Select
    Selection.AutoFill Destination:=Range("A6:S2406"), Type:=xlFillDefault
    Range("A6:S2406").Select
End Sub

Mục đích nôm na của Mình là: kéo các công thức (A6:S6) xuống 2406 dòng

Mình record một đoạn macro rồi copy vào VBA cùng sự kiện là change mục đích là để update dữ liệu khi có thay đổi!! Nhưng thời gian chạy của đoạn code trên là .... vô cùng lâu

Các bác viết lại hộ mình đoạn trên để chạy nhẹ hơn với!?

Cái này thậm chí là chẳng cần đến code. Cứ dùng chức năng List (Excel 2003) hoặc Table (Excel 2007) ---> Công thức luôn tự fill
 
Upvote 0
Mã:
Private Sub [COLOR=#ff0000]Worksheet_Change[/COLOR](ByVal Target As Range)
    Range("A6:S6").Select
    Selection.[COLOR=#ff0000]AutoFill [/COLOR][COLOR=#ff0000]Destination:=[/COLOR]Range("A6:S2406"), Type:=xlFillDefault
    Range("A6:S2406").Select
End Sub

Mục đích nôm na của Mình là: kéo các công thức (A6:S6) xuống 2406 dòng

Mình record một đoạn macro rồi copy vào VBA cùng sự kiện là change mục đích là để update dữ liệu khi có thay đổi!! Nhưng thời gian chạy của đoạn code trên là .... vô cùng lâu

Các bác viết lại hộ mình đoạn trên để chạy nhẹ hơn với!?

Sự kiện Sheet_Change sẽ bị gọi theo kiểu hồi quy, nói cách khác là bị rơi vào 1 loop không có điều kiện thoát. Nếu bàn phím không có phím Break thì tiêu luôn (Hình như các loại Dell đều không có phím Break, lạ nhỉ)
Để tránh thì có thể dùng cờ (flag)
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Range("A6:S6").Select
    Selection.AutoFill Destination:=Range("A6:S2406"), Type:=xlFillDefault
    Range("A6:S2406").Select
End Sub

Mục đích nôm na của Mình là: kéo các công thức (A6:S6) xuống 2406 dòng

Mình record một đoạn macro rồi copy vào VBA cùng sự kiện là change mục đích là để update dữ liệu khi có thay đổi!! Nhưng thời gian chạy của đoạn code trên là .... vô cùng lâu

Các bác viết lại hộ mình đoạn trên để chạy nhẹ hơn với!?

Khi bạn thực hiện công việc Fill công thức thì bạn chỉ nên làm 1 sub trong 1 module rồi gán vào nút lệnh. Cái này chỉ làm 1 lần, bởi vì nếu bạn dùng sự kiện Change mà không chặn EnabledEvent thì chúng sẽ chạy mệt nghỉ luôn!

Khi sử dụng sự kiện, các bạn nên chỉ cho nó chạy cục bộ nơi nó xảy ra sự kiện thôi, đừng kéo theo từ trên xuống dưới. Giả sử là đã chặn EnabledEvent rồi thì cũng rất là dở vì cứ mỗi sự kiện xảy ra thì lại fill từ trên xuống dưới, vừa mất thời gian, vừa lặp đi lặp lại 1 công việc trong mỗi lần phát sinh.

Và cũng nói thêm với các sự kiện Change, SelectionChange, ... thì các bạn cũng phải biết giới hạn vùng thay đổi, nếu không, cứ mỗi lần thao tác bất cứ gì trên sheet thì xảy ra sự kiện, rất là mệt mỏi đấy nhé!
 
Upvote 0

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

Back
Top Bottom