Xin hỏi 2 câu lệnh sau có tác dụng gì!

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

trungnt

Thành viên hoạt động
Tham gia
2/2/07
Bài viết
135
Được thích
88
Tôi thường thấy trong các code thỉnh thoảng có câu lệnh sau:
Application.ScreenUpdating = False
Application.ScreenUpdating = True
Tôi không hiểu các câu lệnh trên có tác dụng gì và dùng trong trường hợp nào ..... (tôi đoán khi chạy code màn hình không bị nháy thì phải) mong các anh chị chỉ giúp dùm tôi.!!!
 
LỆnh 1 HỦy BỎ ChẾ ĐỘ CẬp NhẬt MÀn HÌnh
LỆnh 2 PhỤc HỒi ChẾ ĐỘ CẬp NhẬt MÀn HÌnh
Trong Code Ct Ở ĐẦu VÀ CuỐi Ct ĐỂ Ct ChẠy Nhanh HƠn VÀ MÀn HÌnh KhÔng BỊ NhẤp NhÁy
 
Upvote 0
LỆnh 1 HỦy BỎ ChẾ ĐỘ CẬp NhẬt MÀn HÌnh
LỆnh 2 PhỤc HỒi ChẾ ĐỘ CẬp NhẬt MÀn HÌnh
Trong Code Ct Ở ĐẦu VÀ CuỐi Ct ĐỂ Ct ChẠy Nhanh HƠn VÀ MÀn HÌnh KhÔng BỊ NhẤp NhÁy
Tôi nghĩ cái này chưa chắc... để màn hình ko nhấp nháy thì đồng ý... còn để nhanh hơn uh?... he.. he.. Đâu có đơn giãn thế...
 
Upvote 0
Tôi nghĩ cái này chưa chắc... để màn hình ko nhấp nháy thì đồng ý... còn để nhanh hơn uh?... he.. he.. Đâu có đơn giãn thế...

Nó ko pain screen thì tức là sẽ nhanh hơn rồi.

Ai làm lập trình cũng biết, nếu phải tác động nhiều tới đối tượng thì phải tắt công việc "Pain" cái window hiện thời đi.

Ví dụ: 1 cái Grid (cũng được gọi là 1 window object), khi phải load 1 triệu bản ghi từ 1 ADO Recorset lên đó thì phải viết kiểu như sau:

Đây chỉ là ví dụ thôi nhé, ko phải Grid nào cũng có thuộc tính giống như thế
oGrid.Redraw = False '// Turn off painting
Set oGrid.DataSource = oRS '// Populate recordset to Grid
oGrid.Redraw = True '// Turn on painting

Đấy, việc Redraw bật tắt thường xuyên phải sử dụng. Khi nào cái oRS đó chứa 1 triệu bản ghi trở lên thì mới thấy tác dụng.
 
Upvote 0
Đâu có đâu đại ca.. tôi đã thử nhiều lần rồi, thấy vẫn vậy.. chẳng nhanh hơn tí nào...
Giã sử thời gian tính toán là 10s... Nếu ko có đoạn code đó thì nó sẽ nhảy tưng tưng trong 10s rồi mới ra kết quả... Bằng ngược lại, cho code ấy vào nó cũng vẩn tính 10s, nhưng nó "đơ" ra rồi tí nữa nó sẽ ra kết quả...
Hi... hi...
Nếu có nhanh hơn (vì lý do khỏi load tín hiệu hình) thì tôi nghĩ chả đáng là bao... Ít nhất là đối với tác giã hỏi câu này (cho dù có nói nhanh cũng chả ai biết nhanh ở đường nào)
Đúng ko?
ANH TUẤN
 
Upvote 0
Vấn đề là:
- Đoạn code đó có tác động gì tới các controls/control ko ấy chứ (nếu chỉ for I = 1 .... 1 tỷ, rồi trong vòng lặp đó chỉ thực hiện A = A + 1 thì chả tác động gì tới các controls nào trên form cả). Phải tác động thật nhiều tới các window (ko có chữ "s" nhé) làm cho window đó phải pain đi pain lại (cái này ai lập trình C for Windows nói phát hiểu ngay). Hoặc đơn giản thế này, hãy thử fillcolor lên form bằng cách vẽ từng pixel cho đến khi nó kín cái form đó. Nếu cứ vẽ 1 cái nó hiện ra thì có lẽ tới tết công gô mới fill hết 1 cái form.

- Số lượng dữ liệu có nhiều ko ấy chứ?


Application.ScreenUpdating = False

For i = 1 to n '//1 tỷ
- Nếu lệnh thực hiện trong này ko tác động gì tới Control (tức Window) (ví dụ: A = A + 1) thì ScreenUpdating = False cũng trả có ý nghĩa gì vì nó có pain cái gì đâu.
- Nếu lệnh thực hiện trong này làm cho các control phải pain lại (không thể dùng từ khác từ pain được vì bản chất đúng là PAIN thật) thì với câu lệnh ScreenUpdating = False nó sẽ ko pain nữa. Khi nào thực hiện xong (ví dụ vòng for này) thì bật lại ScreenUpdating = True để ta có thể xem kết quả việc việc thực hiện. Tức là các window chỉ pain 1 lần sau khi thực hiện xong thôi, ko pain liên tục giữa chừng.
- Khi nào n = cực lớn mới thấy tác dụng, còn n = 10,..., 100 thì nhiều khi do tốc độ máy tính mình nhanh quá nên chỉ thấy nó thay đổi tý tẹo
Next
Application.ScreenUpdating = True

Nói chung, phải hiểu biết về lập trình windows (Windows Programming) thì vấn đề này ko cần nói gì thêm cả. Và Hải cũng chỉ nói tới đây thôi (vì giải thích cực kỳ kỹ lưỡng rồi). Thực ra bài này Tuân nói từ lâu lắm rồi (về vấn đề tăng tốc trong Excel)
 
Lần chỉnh sửa cuối:
Upvote 0
@To Anh Tuấn
Anh Tuấn down cái Progress bar này về test thử có Application.ScreenUpdating = False và không có nó thì anh sẽ thấy ngay. Anh cho nó duyệt thử 500 dòng thôi cũng đủ thấy sự khác biệt rõ ràng về tốc độ.

Hoặc Anh làm 1 vòng lặp For để Delete 5000 dòng và dùng Application.ScreenUpdating = True / False thì anh sẽ thấy rõ ngay về tốc độ

TDN
 
Upvote 0
Giải thích dùm câu lệnh IF Not Intersect(Target,...

Các bạn làm ơn giải thích dùm dòng lệnh sau:

IF
Not Intersect(Target, Range("K41:J41")) Is Nothing Then

Cảm ơn nhiều
 
Upvote 0
Các bạn làm ơn giải thích dùm dòng lệnh sau:

IF
Not Intersect(Target, Range("K41:J41")) Is Nothing Then

Cảm ơn nhiều

lệnh này thường được sử dụng trong WorkSheet_change,...

Intersect(Target, Range("K41:J41")) Trả về kết quả giao của 2 vùng
Intersect(Target, Range("K41:J41"))Is Nothing -> nghĩa là không có vùng giao không gì

NHƯNG not (phủ định) lại khác:
Not Intersect(Target, Range("K41:J41")) Is Nothing -> nghĩa là có giao -> tức là vùng K41:J41 có sự thay đôi / hay nỏi cách khác Target - tức là con trỏ ô đang ở trong vùng này


 
Upvote 0
Các bạn làm ơn giải thích dùm dòng lệnh sau:

IF
Not Intersect(Target, Range("K41:J41")) Is Nothing Then

Cảm ơn nhiều
Nói ngắn gọn:
Nếu cell mà ta đang xét ko nằm trong vùng K41:J41 thì khỏi cần làm gì cả... (Im re luôn).. Bằng ngược lại thì... làm tiếp khúc bên dưới....
 
Upvote 0
Web KT

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

Back
Top Bottom