Vấn đề cập nhật kết quả của UDF

Liên hệ QC

nguoirung1234

Thành viên mới
Tham gia
12/3/07
Bài viết
45
Được thích
12
Giả sử ta tạo 1 UDF đơn giản sau :
Mã:
Function CONG()
    CONG=Range("A1")+Range("A2")
End Function
Tiếp theo, ta đặt UDF này vào 1 ô nào đó (ví dụ B1). Tất nhiên kết quả hàm cho ra là 0. Bây giờ, ta gõ vào A1 và A2 số bất kỳ (ví dụ A1=1, A2=2); ô B1 vẫn là 0. Nghĩa là Excel không tính lại UDF khi thay đổi ô A1 và A2.
Theo em hiểu thì nguyên nhân là do cách tính toán lại thông minh của Excel để tăng tốc độ tính toán : nó chỉ tính toán lại các công thức có tham chiếu đến ô vừa thay đổi giá trị.
Bây giờ, ta thay đổi UDF 1 chút :
Mã:
Function CONG(R As Range)
    CONG=Range("A1")+Range("A2")
End Function
Và trong ô B1 ta gõ =CONG(A1:A2). Lúc này, nếu thay đổi A1 hay A2 thì B1 cập nhật ngay.
Nhưng nếu ta dùng UDF có tham số như vậy trong 1 vùng lớn hàng ngàn ô thì tốc độ tính toán lại chậm vô cùng. Các anh chị có giải pháp nào hay hơn xin chỉ giúp (tất nhiên là vẫn dùng UDF chứ không phải thay bằng công thức)
 
Giả sử ta tạo 1 UDF đơn giản sau :
Mã:
Function CONG()
    CONG=Range("A1")+Range("A2")
End Function
Tiếp theo, ta đặt UDF này vào 1 ô nào đó (ví dụ B1). Tất nhiên kết quả hàm cho ra là 0. Bây giờ, ta gõ vào A1 và A2 số bất kỳ (ví dụ A1=1, A2=2); ô B1 vẫn là 0. Nghĩa là Excel không tính lại UDF khi thay đổi ô A1 và A2.
Theo em hiểu thì nguyên nhân là do cách tính toán lại thông minh của Excel để tăng tốc độ tính toán : nó chỉ tính toán lại các công thức có tham chiếu đến ô vừa thay đổi giá trị.
Bây giờ, ta thay đổi UDF 1 chút :
Mã:
Function CONG(R As Range)
    CONG=Range("A1")+Range("A2")
End Function
Và trong ô B1 ta gõ =CONG(A1:A2). Lúc này, nếu thay đổi A1 hay A2 thì B1 cập nhật ngay.
Nhưng nếu ta dùng UDF có tham số như vậy trong 1 vùng lớn hàng ngàn ô thì tốc độ tính toán lại chậm vô cùng. Các anh chị có giải pháp nào hay hơn xin chỉ giúp (tất nhiên là vẫn dùng UDF chứ không phải thay bằng công thức)
Thêm đoạn Application.Volatile vào đầu code là xong
PHP:
Function CONG()
  Application.Volatile
  CONG = Range("A1") + Range("A2")
End Function
Khỏi cần tham chiếu gì ráo
 
Em xin hỏi thêm 1 chút :

  1. Dùng Application.Volatile thì khi thay đổi bất kỳ ô nào trong Sheet thì UDF sẽ được tính lại, cho dù ô đó chẳng dính dáng gì đến UDF? Nếu đúng như vậy thì tốc độ làm việc trên Excel sẽ bị ảnh hưởng?
  2. Nếu như trong UDF lại tính toán dựa trên dữ liệu ở 1 hay nhiều Sheet khác thì sao ạ?
Xin các anh chị chỉ dẫn giúp.
 
Em xin hỏi thêm 1 chút :
Dùng Application.Volatile thì khi thay đổi bất kỳ ô nào trong Sheet thì UDF sẽ được tính lại, cho dù ô đó chẳng dính dáng gì đến UDF? Nếu đúng như vậy thì tốc độ làm việc trên Excel sẽ bị ảnh hưởng?
.
Công thức thường của Excel cũng có tính năng đó mà bạn ---> Thử 1 hàm bất kỳ sẽ biết liền ---> Đương nhiên tốc độ làm việc có ảnh hướng rồi
[*]Nếu như trong UDF lại tính toán dựa trên dữ liệu ở 1 hay nhiều Sheet khác thì sao ạ?
.
Bạn cứ thí nghiệm trước đi
 
Web KT

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

Back
Top Bottom