Cách sử dụng Application.ScreenUpdating?

  • Thread starter Thread starter nhatky@
  • Ngày gửi Ngày gửi
Liên hệ QC

nhatky@

Thành viên mới
Tham gia
1/10/11
Bài viết
24
Được thích
0
Em có đoạn code này, nhờ ac xem dùm em cách sử dụng Application.ScreenUpdating như vậy đã đúng chưa? Và vị trí đặt vậy ổn không?
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i&, j&, dongcuoi&
    'Trong truong hop nay em bo tri Application.ScreenUpdating nhu vay dung chua?
    Application.ScreenUpdating = False 'Em de dong nay o day da dung chua? Neu chua dung xin sua lai dum em nhe!
    dongcuoi = Sheet2.Range("B5000").End(3).Row
    If Target.Address = "$C$5" Then
        Sheet2.Range("A8:F5000").Clear
        With Sheet1.Range(Sheet1.[A1], Sheet1.[A5000].End(3)).Resize(, 7)
            .AutoFilter 1, ">=" & CLng(Sheet2.Range("C3").Value), 1, "<=" & CLng(Sheet2.[C4].Value)
            .AutoFilter 2, Sheet2.Range("C5").Value
            .Offset(1, 2).Resize(, 5).SpecialCells(12).Copy Sheet2.Range("B8")
            .AutoFilter
        End With
        With Sheet2.Range("A7").CurrentRegion
        If .Rows.Count > 1 Then
            .Resize(, 1).SpecialCells(4).Value = Evaluate("row(R:R)")
        End If
        End With
    End If
    Application.ScreenUpdating = True 'Em de dong nay o day da dung chua? Neu chua dung xin sua lai dum em nhe!
End Sub
 
Em có đoạn code này, nhờ ac xem dùm em cách sử dụng Application.ScreenUpdating như vậy đã đúng chưa? Và vị trí đặt vậy ổn không?
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i&, j&, dongcuoi&
    'Trong truong hop nay em bo tri Application.ScreenUpdating nhu vay dung chua?
    Application.ScreenUpdating = False 'Em de dong nay o day da dung chua? Neu chua dung xin sua lai dum em nhe!
    dongcuoi = Sheet2.Range("B5000").End(3).Row
    If Target.Address = "$C$5" Then
        Sheet2.Range("A8:F5000").Clear
        With Sheet1.Range(Sheet1.[A1], Sheet1.[A5000].End(3)).Resize(, 7)
            .AutoFilter 1, ">=" & CLng(Sheet2.Range("C3").Value), 1, "<=" & CLng(Sheet2.[C4].Value)
            .AutoFilter 2, Sheet2.Range("C5").Value
            .Offset(1, 2).Resize(, 5).SpecialCells(12).Copy Sheet2.Range("B8")
            .AutoFilter
        End With
        With Sheet2.Range("A7").CurrentRegion
        If .Rows.Count > 1 Then
            .Resize(, 1).SpecialCells(4).Value = Evaluate("row(R:R)")
        End If
        End With
    End If
    Application.ScreenUpdating = True 'Em de dong nay o day da dung chua? Neu chua dung xin sua lai dum em nhe!
End Sub
Việc sử dụng câu lệnh Application.ScreenUpdating = True (hoặc False) chỉ nhằm mục đích bật (hoặc tắt) việc cập nhật thông tin trên màn hình, và trong một số trường hợp có thể làm giảm, tăng tốc độ code một chút cho nên về lý thuyết thì bạn có thể đặt chỗ nào đó tùy ý và trong trường hợp như code trên, bạn đặt như vậy là hợp lý rồi, nghĩa là trước khi chạy code thì tắt chế độ cập nhật thông tin, sau khi code chạy xong thì bật lại. Và đây cũng là một nguyên tắc rất quan trọng: Sau khi đã sử dụng xong thì hãy trả về nguyên trạng những tùy chọn của Excel để tránh những rắc rối không đáng có sau này (chẳng hạn chế độ tự động tính toán - Application.Calculation, chế độ báo lỗi - Application.DisplayAlerts, tiêu đề - Application.Caption... và nói chung là những thuộc tính liên quan đến đối tượng Application).
 
Lần chỉnh sửa cuối:
Upvote 0
Việc sử dụng câu lệnh Application.ScreenUpdating = True (hoặc False) chỉ nhằm mục đích bật (hoặc tắt) việc cập nhật thông tin trên màn hình, và trong một số trường hợp có thể làm giảm, tăng tốc độ code một chút cho nên về lý thuyết thì bạn có thể đặt chỗ nào đó tùy ý và trong trường hợp như code trên, bạn đặt như vậy là hợp lý rồi, nghĩa là trước khi chạy code thì tắt chế độ cập nhật thông tin, sau khi code chạy xong thì bật lại. Và đây cũng là một nguyên tắc rất quan trọng: Sau khi đã sử dụng xong thì hãy trả về nguyên trạng những tùy chọn của Excel để tránh những rắc rối không đáng có sau này (chẳng hạn chế độ tự động tính toán - Application.Calculation, chế độ báo lỗi - Application.DisplayAlerts, tiêu đề - Application.Caption... và nói chung là những thuộc tính liên quan đến đối tượng Application).

Vâng, cám ơn nghiaphuc. nhưng tại sao trong đoạn code đó nếu em vô hiệu hoá thì nó ít giật màn hình và cập nhật nhanh hơn?
 
Upvote 0
Vâng, cám ơn nghiaphuc. nhưng tại sao trong đoạn code đó nếu em vô hiệu hoá thì nó ít giật màn hình và cập nhật nhanh hơn?
Ý bạn "vô hiệu hóa" là thiết lập Application.ScreenUpdating = False hay là bỏ hẳn câu lệnh này? Nếu đặt nó là False thì đương nhiên rồi, bởi vì lúc này mình đã tắt việc cập nhật thông tin trên màn hình, chỉ khi nào gặp câu lệnh Application.ScreenUpdating = True thì Excel mới cập nhật lại, do đó màn hình sẽ ít giật hơn. Còn nếu hiểu theo nghĩa bỏ hẳn câu lệnh này thì có vẻ không hợp lý lắm.
 
Upvote 0
Ý bạn "vô hiệu hóa" là thiết lập Application.ScreenUpdating = False hay là bỏ hẳn câu lệnh này? Nếu đặt nó là False thì đương nhiên rồi, bởi vì lúc này mình đã tắt việc cập nhật thông tin trên màn hình, chỉ khi nào gặp câu lệnh Application.ScreenUpdating = True thì Excel mới cập nhật lại, do đó màn hình sẽ ít giật hơn. Còn nếu hiểu theo nghĩa bỏ hẳn câu lệnh này thì có vẻ không hợp lý lắm.

Anh nghiaphuc xem ví dụ trong file đính kèm ha. Nếu cde như vậy sẽ bị giật; và ngược lại bỏ Application.ScreenUpdating = True ở cuối đoạn thì OK ah.
 

File đính kèm

Upvote 0
Anh nghiaphuc xem ví dụ trong file đính kèm ha. Nếu cde như vậy sẽ bị giật; và ngược lại bỏ Application.ScreenUpdating = True ở cuối đoạn thì OK ah.
Có lẽ vấn đề ở chỗ các câu lệnh đánh số thứ tự.
Bạn thử nghiệm: Thay đoạn code đánh STT:
PHP:
With Sheet2.Range("A7").CurrentRegion
    If .Rows.Count > 1 Then
        .Resize(, 1).SpecialCells(4).Value = Evaluate("row(R:R)")
    End If
End With
bởi đoạn code sau:
PHP:
If [B65536].End(xlUp).Row > 7 Then
    [A8] = 1: [A8].DataSeries xlColumns, , , 1, [B65536].End(xlUp).Row - 7
End If
Nếu là mình thì mình sẽ sử dụng code như sau (sử dụng AdvancedFilter thay cho AutoFilter và Copy):
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$C$5" Then
        [A8:F5000].Clear
        [H2].FormulaR1C1 = "=AND(Sheet1!RC1>=R3C3,Sheet1!RC1<=R4C3,Sheet1!RC2=R5C3)"
        Sheet1.[A1].CurrentRegion.AdvancedFilter xlFilterCopy, [H1:H2], [B7:F7]
        If [B65536].End(xlUp).Row > 7 Then
            [A8] = 1: [A8].DataSeries xlColumns, , , 1, [B65536].End(xlUp).Row - 7
        End If
    End If
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom