2012-03-23 32 views
5

Tôi đang viết một Excel vĩ mô, và tôi đang gặp rắc rối bù trừ một đối tượng Scripting.Dictionary:VB Rõ ràng Scripting.Dictionary đối tượng

Dim test As Integer 
test = CompListDict.Count 
CompListDict.RemoveAll 
Set CompListDict = Nothing 
Set CompListDict = CreateObject("Scripting.Dictionary") 
Dim test1 As Integer 
test1 = CompListDict.Count 

Trước khi tôi làm điều này, tôi thêm các mục vào từ điển, và sau đó tôi cố gắng để xóa nó, nhưng test1 sẽ bằng kiểm tra và bằng nr của các đối tượng tôi đã thêm vào.

Tôi đang làm gì sai? Cảm ơn bạn!

Trả lời

6

Nếu tôi chạy macro sau trên máy trạm của tôi, nó hoạt động:

 Set compListDict = CreateObject("Scripting.Dictionary") 

     compListDict.Add 1, "Test" 

     Dim test As Integer 
     test = compListDict.Count 
     compListDict.RemoveAll 

     Set compListDict = Nothing 
     Set compListDict = CreateObject("Scripting.Dictionary") 

     Dim test1 As Integer 
     test1 = compListDict.Count 

Sau khi chạy nó, test1 bằng 0, và thử nghiệm bằng 1.

Đảm bảo bạn có Option Explicit được kích hoạt, và bạn không có bất kỳ lỗi chính tả nào trong các tên biến của bạn.

Ngoài ra, hãy đảm bảo bạn không có tuyên bố "Tiếp tục lỗi khi tiếp tục" vì nó sẽ ẩn các lỗi trong mã của bạn. Thử đặt "Lỗi trên Goto 0" trước đoạn mã của bạn để Excel hiển thị bất kỳ thông báo lỗi nào.

Vì bạn đang đặt giá trị biến thành Không có gì và gán cho nó một đối tượng từ điển mới, nên không thể giữ lại giá trị được lưu trữ trước.

Tôi cũng đã cố gắng chạy đoạn mã sau, và nó cũng cho kết quả tương tự:

 Set compListDict = CreateObject("Scripting.Dictionary") 

     compListDict.Add 1, "Test" 

     Dim test As Integer 
     test = compListDict.Count 
     compListDict.RemoveAll 

     Dim test1 As Integer 
     test1 = compListDict.Count 

Hy vọng rằng sẽ giúp ...

3

Mã của bạn trông ok mặc dù 2 dòng mà bạn thiết lập dict của bạn không có gì và tái tạo nó là không cần thiết.

Không chắc chắn nếu nó có liên quan nhưng có một lỗi trong một số phiên bản của VBA IDE: nếu bạn đã thêm một chiếc đồng hồ trên dict(aKeyThatDoesNotExist) nó có thể dẫn đến tgat key được thêm vào dict và không thể tháo rời. giải pháp duy nhất tôi biết: khởi động lại Excel để xóa bộ nhớ.

EDIT

Đối Siddharth: Tested với Excel 2003 & 2010.

Tạo một cuốn sách mới.
Mở VBA IDE.
Loại này trong module Sheet1:

Option Explicit 

Sub test() 

    Dim d As Variant 
    Set d = CreateObject("Scripting.Dictionary") 

    d.Add "a", "a" 
    Debug.Print d.Count 

    'Add watch here on d and d("b") 

    Debug.Print d.Count 

End Sub 

Run nó trong từng chế độ bước và khi trên dòng nhận xét, thêm một chiếc đồng hồ trên dd("b"). Các Debug.Print thứ hai sẽ in 2. Cho đến nay, bạn có thể nghĩ rằng chiếc đồng hồ tạo ra một mục, đó là lạ bởi vì bạn sẽ không mong đợi xem có tác dụng phụ.

Chạy lại macro: trước tiênDebug.Print sẽ in 2 và bạn sẽ nhận thấy rằng từ điển đã có khóa "b".

Thực tế, trái với những gì tôi đã nói ở trên, xóa đồng hồ trên d("b") và chạy lại macro sẽ đặt lại từ điển một cách chính xác.

+0

Hmmm thú vị. Bạn có thể tái tạo nó hay nó là một điều ngẫu nhiên? –

+0

@SiddharthRout Xem chỉnh sửa của tôi. – assylias

+0

Cảm ơn sẽ nhìn vào nó ngày hôm nay :) Và nếu tôi có thể tái sản xuất nó sau đó tôi sẽ tập tin lỗi này với MS hôm nay :) –

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