2009-02-20 43 views
22

Tôi cần phải thực hiện một số đối tượng tùy chỉnh trong VBA sẽ cần tham chiếu lẫn nhau và tôi có một số vấn đề.Trình tạo đối tượng Excel VBA và hàm hủy

Đầu tiên - cách các nhà thầu đối tượng hoạt động trong VBA như thế nào? Có các nhà thầu không?

Thứ hai - có các trình phá hủy không? Làm thế nào để VBA xử lý kết thúc vòng đời của đối tượng? Nếu tôi có một đối tượng tham khảo những người khác (và đây là tài liệu tham khảo duy nhất của họ), thì tôi có thể đặt nó thành Không gì và được thực hiện với nó hay có thể tạo ra rò rỉ memeory?

Công cụ bán hàng OO này chỉ là một chút khó chịu.

+1

Để thêm biến vào hàm tạo, hãy xem [câu hỏi StackOverflow này] [1]. [1]: http://stackoverflow.com/questions/15224113/pass-arguments-to-constructor-in-vba – GregNash

Trả lời

21

VBA hỗ trợ Mô-đun lớp. Chúng có một sự kiện Class_Initialize, đó là hàm tạo và lớp Class_Terminate, đó là hàm hủy. Bạn có thể xác định các thuộc tính và phương thức. Tôi tin rằng VBA sử dụng tính tham chiếu cho vòng đời của đối tượng. Đó là lý do tại sao bạn thấy nhiều Set bất kỳ = Không có gì trong loại mã đó. Trong trường hợp ví dụ của bạn, tôi nghĩ rằng nó sẽ không bị rò rỉ bất kỳ bộ nhớ nào. Nhưng bạn cần phải cẩn thận về tham chiếu vòng tròn.

16

Nếu bạn đang làm một mô-đun lớp trong VBA, cho các nhà xây dựng, bạn có thể sử dụng:

Private Sub class_initialize() 
.... 
End Sub 

Không có destructors, kể từ VBA là thu gom rác thải. Chỉ cần đảm bảo làm sạch mọi tham chiếu vòng tròn và bạn nên tránh mọi rò rỉ bộ nhớ có thể xảy ra.

+9

Đó là không đúng sự thật rằng không có một destructor. Đó là Class_Terminate – RubberDuck

8

Đã lâu rồi kể từ khi tôi sử dụng chúng, nhưng tôi không nghĩ bạn có thể chuyển các tham số vào các hàm tạo. Tôi nghĩ rằng đó là một trong những vấn đề tôi gặp phải, nhưng tôi đã gặp rất nhiều vấn đề về cách thức các lớp học làm việc và làm thế nào tôi mong đợi họ làm việc mà tôi có thể là một người không tin tưởng.

+2

Bạn nói đúng. Bạn không thể. – Tmdean

+0

Các lớp phức tạp hơn thường sẽ có các hàm "Start" -type và các biến trạng thái "objectStarted" để phù hợp với nguyên lý của một hàm tạo tham số. –

6

Có tồn tại Class_Terminate khá giống với hàm hủy.

0

Tôi xác nhận rằng class_initialize và class_terminate.

Bạn có thể kiểm tra nó bằng cách writting TestClass này:

Public testVar As Integer 

Private Sub class_initialize() 
    Debug.Print "Class init" 
    testVar = 10 
End Sub 

Private Sub class_terminate() 
    Debug.Print "Class terminate" 
End Sub 

Và viết mã này trong một module:

Sub test() 
    Dim myTestClass As New TestClass 
    Debug.Print myTestClass.testVar 
End Sub 

Và sau đó bạn sẽ thấy các bản ghi trong cửa sổ Debug. Nhưng với thử nghiệm này, chúng ta có thể thấy rằng class_initialize không được gọi khi bạn tạo cá thể (với mới) nhưng chỉ ở lần gọi đầu tiên của một methode trong cá thể hoặc nhận một giá trị var.

Các Class_Terminate dường như được gọi là ở phần cuối của testModule (Nếu một thể hiện được đánh dấu trên ThisWorkbook đối tượng, chấm dứt được "không bao giờ" gọi là ... có lẽ chỉ khi bảng tính được đóng cửa hoặc khi Excel đã bị đóng)

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