Tôi đã tạo một đối tượng mới trong vòng lặp và thêm đối tượng đó vào bộ sưu tập; nhưng khi tôi đọc lại bộ sưu tập sau đó, nó luôn được lấp đầy hoàn toàn với vật thể cuối cùng tôi đã thêm vào. Tôi đã đưa ra hai cách xung quanh điều này, nhưng tôi chỉ đơn giản là không hiểu tại sao thực hiện ban đầu của tôi là sai.VBA: Sự khác biệt trong hai cách tuyên bố một đối tượng mới? (Cố gắng hiểu tại sao giải pháp của tôi hoạt động)
gốc:
Dim oItem As Variant
Dim sOutput As String
Dim i As Integer
Dim oCollection As New Collection
For i = 0 To 10
Dim oMatch As New clsMatch
oMatch.setLineNumber i
oCollection.Add oMatch
Next
For Each oItem In oCollection
sOutput = sOutput & "[" & oItem.lineNumber & "]"
Next
MsgBox sOutput
Điều này dẫn đến mỗi linenumber là 10; Tôi rõ ràng là không tạo ra các đối tượng mới, nhưng thay vào đó sử dụng cùng một đối tượng mỗi lần thông qua vòng lặp, bất chấp việc khai báo nằm bên trong vòng lặp. Vì vậy, tôi đã thêm Set oMatch = Nothing
ngay trước dòng Next
và điều này đã khắc phục được sự cố, bây giờ là 0 đến 10. Vì vậy, nếu đối tượng cũ bị phá hủy rõ ràng, thì nó sẵn sàng tạo một cái mới? Tôi đã có thể nghĩ rằng lặp đi lặp lại tiếp theo thông qua vòng lặp sẽ gây ra bất cứ điều gì tuyên bố trong vòng lặp làm bị phá hủy do phạm vi?
Tò mò, tôi đã thử một cách khác để khai báo một đối tượng mới: Dim oMatch As clsMatch: Set oMatch = New clsMatch
. Điều này cũng vậy, dẫn đến 0 đến 10.
Bất cứ ai có thể giải thích cho tôi tại sao triển khai đầu tiên không đúng?
Trong VBA là considere d thực hành xấu để sử dụng "Như Mới". Khi bạn phát hiện ra một cách khó khăn, nó có thể dẫn đến tất cả các loại lỗi tinh tế. Tốt nhất là khai báo tất cả các biến của bạn ở trên cùng và sử dụng "= Mới" khi thích hợp. (Lưu ý phụ: Tôi sẽ nói chính xác ngược lại trong VB.Net) –
Phạm vi nhỏ nhất có thể trong VBA là mức độ thủ tục; khối 'Đối với ... Tiếp theo' (hoặc bất kỳ khối nào khác) không tạo phạm vi. –