Tôi đã nhận thấy rằng UDF của tôi tính toán lại bất cứ khi nào tôi xóa các ô. Điều này gây ra sự chậm trễ lớn khi xóa toàn bộ các cột, bởi vì UDF được gọi cho mỗi và mọi ô được sử dụng. Vì vậy nếu bạn đang sử dụng 1000 UDFS, thì việc xóa một cột hoặc ô sẽ gọi nó là 1000 lần.Cần dừng UDF tính toán lại khi các ô không liên quan bị xóa
Bằng một ví dụ, đặt UDF sau đây trong một mô-đun, sau đó gọi nó từ bảng tính một loạt các lần với = HelloWorld()
Function HelloWorld()
HelloWorld = "HelloWorld"
Debug.Print Now()
End Function
Sau đó xóa liên tiếp. Nếu trải nghiệm của bạn giống như của tôi, bạn sẽ thấy nó được gọi một lần cho mỗi trường hợp sử dụng.
Bất cứ ai cũng có bất kỳ ý tưởng nào cho dù hành vi này có thể dừng lại không? Tôi cũng muốn được quan tâm tại sao nó nên được gọi. Có vẻ như một lỗ hổng trong cây phụ thuộc của Excel với tôi, nhưng cũng có thể là một lý do chính đáng.
Edit: Sau khi thử nghiệm, tôi đã tìm thấy nhiều hành động kích hoạt UDFs:
- Bất kỳ thay đổi số lượng cột rằng một ListObject (ví dụ Excel Bảng) kéo dài qua thay đổi kích thước (nhưng không hàng). Ngay cả khi bản thân UDF không có trong ListObject có liên quan, hoặc thực tế là trong bất kỳ bất kỳ ListObject nào cả.
- Thêm ô hoặc cột mới vào bất kỳ vị trí nào trong trang tính (nhưng không phải hàng).
Lưu ý rằng Manual Calc Mode không phải là một lựa chọn trên nhiều mặt trận. Thứ nhất, vì nó là một ứng dụng cấp thiết lập, nó chỉ đơn giản là trình bày một nguy cơ quá lớn mà ai đó sẽ sử dụng đầu ra của bất kỳ một trong các bảng tính mà họ xảy ra đã mở mà không nhận ra họ đang ở chế độ tính toán thủ công. Thứ hai, tôi không thực sự thiết kế một bảng tính cụ thể mà là viết một cuốn sách về cách những người không phát triển có thể sử dụng các mã có sẵn như UDF để làm những thứ có thể vượt ra ngoài chúng. Ví dụ bao gồm tự động ghép hoặc tách văn bản hoặc tìm kiếm chính xác kết hợp nhị phân UDF mà Charles Williams phác thảo tại https://fastexcel.wordpress.com/2011/07/22/developing-faster-lookups-part-2-how-to-build-a-faster-vba-lookup/ (Và vâng, tôi cung cấp cho họ nhiều cảnh báo rằng thường là giải pháp dựa trên công thức gốc sẽ hoạt động tốt hơn UDF. các chủ đề tôi đã tham chiếu ở trên, các chức năng viết cẩn thận có thể hoạt động tốt).
Tôi không biết người dùng sẽ sử dụng những điều này như thế nào.
Khi không có giải pháp lập trình, có vẻ như tôi sẽ chỉ ra trong cuốn sách mà người dùng có thể gặp phải sự chậm trễ đáng kể khi thêm hoặc xóa ô hoặc thay đổi kích thước ListObject nếu họ có UDFS chuyên sâu về tài nguyên. Ngay cả khi những UDF đó được viết một cách hiệu quả.
dicks blog đáp ứng stackoverflow :) Câu hỏi thú vị khi tôi xác nhận điều này giữ, mặc dù UDF của bạn không có dải ô liên quan, hàm volatile kết hợp với nó hoặc 'Application.Volatile'. Một nội dung đơn giản rõ ràng không kích hoạt UDF, một hàng xóa. Tôi sẽ chờ một bài đăng từ Charles Williams với sự quan tâm. – brettdj
Bạn đã thử đặt phương thức tính toán excel thành Manual. Chế độ tính toán thủ công nghĩa là Excel sẽ chỉ tính toán lại tất cả các sổ làm việc đang mở khi bạn yêu cầu bằng cách nhấn F9 hoặc Ctrl-Alt-F9 hoặc khi bạn Lưu sổ làm việc. Đối với sổ làm việc mất hơn một phần nhỏ của giây để tính lại thì thường là tốt hơn để đặt Tính toán thành Thủ công. – izzymo
Xin chào Izzymo. Tôi chỉ rõ Chế độ Calc bằng tay bất cứ khi nào tôi có thể, dựa trên những điều sau đây: * Khả năng đầu ra được sử dụng mà không có mô hình được làm mới. Tôi thường không phải là người dùng duy nhất. * Nếu sổ làm việc đầu tiên bạn mở trong ngày xảy ra là ngày được lưu trong chế độ Tính toán thủ công thì tất cả các sổ làm việc khác mà bạn mở trong ngày cũng sẽ được chuyển sang chế độ Tính toán thủ công. Có thể bạn thậm chí không biết. Chế độ calc thường được sử dụng để che dấu các triệu chứng của bảng tính được thiết kế kém. Không phải trong mọi trường hợp, và tôi không nói tất cả đều xấu. Hầu như chỉ có thể tránh được. – jeffreyweir