2012-05-31 35 views
5

Tôi gặp vấn đề lạ với thứ tự tính toán Excel - ô phụ thuộc được tính toán trước ô trước với giá trị tham số trống khi thiết lập phạm vi bẩn. Có cách nào để phát hiện các cuộc gọi "giả" đó không? Điều quan trọng đối với tôi khi tôi chạy một số logic kinh doanh thông minh trong ứng dụng thế giới thực và những cuộc gọi "giả" đó phá vỡ mọi logic. Ngoài ra những cuộc gọi "giả" nếu đăng ký với RTD không ràng buộc nó vào chủ đề đúng và do đó không thông báo cho chủ đề ngắt kết nối.Thứ tự tính toán lại Excel - tại sao ô phụ thuộc tính trước ô trước?

Excel 2010/32bit mới nhất tất cả.

Để minh họa cho vấn đề tôi đã tạo ra chức năng đơn giản:

Function Fnc(param2 As String) As String 
    Fnc = Application.ThisCell.Address 
    Debug.Print (Application.ThisCell.Address & " - " & param2) 
End Function 

Và thủ tục:

Sub SetDirty() 
    Range("B1:C1").Dirty 
End Sub 

Và tờ đơn giản:

$ A $ 1 = FNC (A1) = FNC (B1)

vào các tế bào A1, B1, C1.

Và kết quả rõ ràng:

$ A $ 1 $ B $ 1 $ C $ 1

Nếu tôi tính toán lại (CTRL + Alt + phím Shift + F9) tôi nhận được, như mong đợi :

$ B $ 1 - $ A $ 1

$ C $ 1 - $ B $ 1

Nhưng, đây là phần thú vị. Nếu tôi chạy SetDirty:

$ C $ 1-< ---- đâu này đến từ đâu?

$ B $ 1 - $ A $ 1

$ C $ 1 - $ B $ 1

Thanks cho bất kỳ đầu vào. Tôi muốn một giải pháp giải quyết vấn đề này, không phải là một giải pháp vì nó đã là một phần của loạt các giải pháp.

+1

Trang này: http://www.decisionmodels.com/calcsecretsc.htm và các trang khác tại cùng một trang web, sẽ trả lời câu hỏi của bạn. Đó là tác giả cũng thường xuyên trên Satckoverflow. – jtolle

+0

Nó không rõ ràng với tôi những gì bạn đang đưa vào đó các tế bào Excel - cau bạn xin chụp ảnh màn hình hoặc làm rõ ví dụ của bạn? – brettdj

+0

@brettdj như tôi đã nói trong bài viết của tôi: $ A $ 1 = fnc (A1) = fnc (B1) vào các ô A1, B1, C1 đơn giản vì đó là – Arnas

Trả lời

6

Các tế bào thường được tính lại nhiều hơn một lần: Excel bắt đầu với một chuỗi tính toán lại là chuỗi tính toán trước đó cộng với LIFO (cuối cùng trong ra đầu tiên) cho tất cả các tế bào biến đổi. Điều này làm cho các chức năng được gọi và đưa ra các ô không được tính toán - các hàm được gọi lại sau.
Bạn có thể phát hiện các tế bào không tính trong UDF của bạn sử dụng IsEmpty
Xem http://www.decisionmodels.com/calcsecretsj.htm biết chi tiết về UDFs và phát hiện các tế bào uncalculated
http://www.decisionmodels.com/calcsecretsc.htm để biết chi tiết về trình tự tính toán của Excel.

BTW hãy cẩn thận với Range.Dirty - một chút lỗi của nó

+0

Tôi đang sử dụng C#, là nó đủ để kiểm tra giá trị cho null nếu tế bào HasFormula? – Arnas

+0

Tôi không sử dụng C# (chỉ VBA, VB6 và C++) vì vậy tôi không thể trả lời rằng: thử một số xét nghiệm để xem nếu giá trị là null phát hiện tế bào trống. Tại sao không chỉ sử dụng IsEmpty http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.value.aspx –

+0

IsEmpty là hàm VBA. Excel không bao giờ vượt qua null từ công thức. null chỉ có thể trong hai trường hợp ô trống hoặc công thức không được tính toán. đúng nếu tôi đã sai lầm. – Arnas

Các vấn đề liên quan