2012-05-14 4 views
35

nhiều người sử dụng nhiều mảng trong Excel/VBA để lưu trữ danh sách dữ liệu. Tuy nhiên, có các đối tượng thu mà theo quan điểm của tôi là MUCH MUCH thuận tiện hơn (chủ yếu là: không cần phải xác định lại chiều dài của danh sách).Tại sao sử dụng mảng trong VBA khi có bộ sưu tập?

Vì vậy, tôi chân thành tự hỏi bản thân mình nếu tôi bỏ lỡ điều gì đó? Tại sao người khác vẫn sử dụng mảng để lưu trữ danh sách dữ liệu? Nó chỉ đơn giản là một nôn nao của quá khứ?

Trả lời

31

Một số lý do để sử dụng mảng thay vì các bộ sưu tập (hoặc từ điển):

  • bạn có thể chuyển dễ dàng mảng để dao động (và ngược lại) với Range("A1:B12") = MyArray
  • bộ sưu tập có thể lưu trữ chỉ phím độc đáo trong khi mảng có thể lưu trữ bất kỳ giá trị nào
  • bộ sưu tập phải lưu trữ một cặp (khóa, giá trị) trong khi bạn có thể lưu trữ bất kỳ thứ gì trong một mảng

Xem Chip Pearson's article về mảng cho một sự hiểu biết tốt hơn

Một câu hỏi tốt hơn Thà tại sao mọi người sẽ sử dụng bộ sưu tập trên các từ điển (ok, bộ sưu tập là tiêu chuẩn VBA trong khi bạn phải nhập khẩu điển)

+4

Ngoài ra các mảng hoạt động tốt hơn các bộ sưu tập (ngoại trừ truy cập tra cứu khóa khi bạn không thể lập chỉ mục trực tiếp vào mảng). –

+0

@CharlesWilliams: cảm ơn cho mẹo – JMax

+13

Bộ sưu tập không phải lưu trữ khóa, đó là tùy chọn. Bộ sưu tập cũng có thể lưu trữ bất kỳ giá trị nào, chỉ các khóa (nếu bạn sử dụng chúng) phải là duy nhất. – Cutter

3

Bộ sưu tập tự động thay đổi kích thước chậm hơn (theo lý thuyết, các triển khai khác nhau rõ ràng sẽ có số dặm riêng của chúng). Nếu bạn biết bạn có một số lượng các mục nhập và bạn chỉ cần truy cập chúng theo kiểu tuyến tính thì một mảng truyền thống là cách tiếp cận chính xác.

15

@CharlesWilliams câu trả lời là chính xác: lặp qua tất cả các giá trị của một mảng nhanh hơn việc lặp lại một Bộ sưu tập hoặc từ điển: rất nhiều, vì vậy tôi luôn sử dụng phương thức Keys() hoặc Items() của từ điển khi tôi cần thực hiện điều đó. một mảng vectơ.

Lưu ý: Tôi sử dụng lớp Từ điển nhiều hơn tôi sử dụng bộ sưu tập, phương thức Exists() quá hữu ích.

Có, hoặc tất nhiên, hạn chế đối với bộ sưu tập và từ điển. Một trong số đó là các mảng có thể là 2 hoặc thậm chí 3 chiều - một cấu trúc dữ liệu tốt hơn nhiều cho dữ liệu được lập bảng. Bạn có thể mảng lưu trữ làm thành viên của bộ sưu tập, nhưng có một số nhược điểm: một trong số đó là bạn có thể không tham chiếu đến mục đó - trừ khi bạn sử dụng arrItem = MyDictionary(strKey) bạn gần như chắc chắn sẽ nhận được bản sao 'ByVal' mảng; đó là xấu nếu dữ liệu của bạn là động và có thể thay đổi theo nhiều quy trình. Nó cũng chậm: rất nhiều phân bổ và deallocation.

Tệ hơn hết, tôi không hoàn toàn tin tưởng VBA để deallocate bộ nhớ nếu tôi có một bộ sưu tập hoặc từ điển với các mảng như các thành viên (hoặc đối tượng!): Không vào out-of-phạm vi, không phải bởi Set objCollection = Nothing, thậm chí không Bởi objDictionary.RemoveAll - rất khó để chứng minh rằng vấn đề tồn tại với bộ công cụ kiểm tra giới hạn có sẵn trong VBE, nhưng tôi đã thấy đủ rò rỉ bộ nhớ trong các ứng dụng sử dụng các mảng trong từ điển để biết rằng bạn cần phải thận trọng. Điều đó đang được nói, tôi không bao giờ sử dụng một mảng mà không có lệnh Erase ở đâu đó.

@JMax đã giải thích các điểm cộng lớn khác cho mảng: bạn có thể điền một mảng trong một lần 'nhấn' vào trang tính và viết lại tác phẩm của mình chỉ trong một lần truy cập.Bạn có thể, tất nhiên, tận dụng tối đa cả hai thế giới bằng cách xây dựng một lớp Mảng được lập chỉ mục: mảng 2 chiều với các đối tượng bộ sưu tập hoặc từ điển được liên kết lưu trữ một số loại định danh hàng làm khóa và hàng thứ tự làm Các mục dữ liệu.