2012-01-26 62 views
7

Tôi muốn có một danh sách mảng trong VBA, vì vậy tôi có một biến khai báo trong excel VBA như:Array trong excel vba

Dim Students(10) as variant 

Bây giờ tôi muốn để lưu trữ các số trong danh sách sinh viên. các con số không liên tục. Đôi khi như:

Students(2,7,14,54,33,45,55,59,62,66,69) 

Tôi có thể làm điều này bằng cách nào? Tôi cũng có thể truy cập vào các mục trong danh sách như thế nào?

Trả lời

10

Học sinh phải được khai báo là mảng động. Đó là, một mảng có giới hạn có thể được thay đổi. Dim Students(10) cho một mảng có các giới hạn không thể thay đổi và không thể tải từ một mảng.

Dim Students() As Variant 

Để tải Học sinh:

Students = Array(2,7,14,54,33,45,55,59,62,66,69) 

Để truy cập vào các yếu tố:

Dim Inx As Long 

For Inx = LBound(Students) to UBound(Students) 
    Debug.Print Students(Inx) 
Next 

LBound (Lower bound) và UBound có nghĩa là vòng lặp for điều chỉnh theo số lượng thực tế của các yếu tố trong Sinh viên.

+0

+1 Làm tốt lắm! Cũng lưu ý rằng các mảng không bị ràng buộc theo mặc định. – JimmyPena

+1

@JP. Tôi biết nhưng bằng cách nào đó, trừ khi tôi đã tuyên bố rõ ràng ràng buộc thấp hơn, tôi không tin rằng nó sẽ luôn luôn bằng không. –

3

Bạn có thể thêm giá trị cho một mảng như thế này ...

For i = 1 to 10 
    Students(i) = i 
Next i 

Hoặc như thế này

Students = Array(2,7,14,54,33,45,55,59,62,66,69) 

Sau đó, bạn có thể truy cập các giá trị trong các dinh thự cùng. Lưu ý nếu bạn sử dụng tùy chọn thứ hai, bạn cần khai báo như sau:

Dim Students() As Variant 
4

Đây là quá phức tạp cho bạn ngay bây giờ, và có thể bạn sẽ không bao giờ chạy vào một tình huống mà bạn sẽ cần điều này, nhưng:

tôi sử dụng phương pháp sau đây để hình thành các mảng bộ nhớ hiệu quả hơn (vì Biến thể sử dụng bộ nhớ nhiều nhất của bất kỳ loại biến nào) trong khi vẫn có sự tiện lợi khi khai báo nội dung mảng trong một dòng. Để thực hiện theo ví dụ của bạn:

Dim Students() As Long 
Dim Array2() As String 

Array2() = Split("2,7,14,54,33,45,55,59,62,66,69", ",") 

ReDim Array1(0) As Long 
For Loop1 = LBound(Array2()) To UBound(Array2()) 
    ReDim Preserve Array1(0 To (UBound(Array1) + 1)) As String 
    Array1(Loop1) = Array2(Loop1) 
Next Loop1 
ReDim Preserve Array1(0 To (UBound(Array1) - 1)) As Long 

Erase Array2 

Một ví dụ về truy cập vào nó sẽ là một cái gì đó như:

For Loop1 = LBound(Students) to UBound(Students) 
    Msgbox Students(Loop1) 
Next Loop1 

Tôi học được điều này từ đây: http://www.vbforums.com/showthread.php?669265-RESOLVED-VBA-Excel-Assigning-values-to-array-in-a-single-line&p=4116778&viewfull=1#post4116778

+0

Lưu ý rằng bạn chỉ cần làm điều này cho các mảng không phải chuỗi, bởi vì đối với chuỗi bạn chỉ có thể làm 'arrStrings() = Split (" Item1, Item2, Item3 ",", ",, vbtextcompare)' hoặc bất cứ điều gì. – puzzlepiece87

0

Vâng, Điều đó phụ thuộc vào cách bạn sẽ cung cấp các giá trị cho mảng, bạn sẽ nhận được các giá trị từ Worksheet.Range hoặc từ TextBox hoặc ListB bò, Nhưng về cơ bản mã sẽ là một cái gì đó như thế:

Dim students(10) as Integer 
Dim Carrier as Integer 
For i = LBound(students) To UBound(Students) 
    'some code to get the values you want to from whatever is your source 
    'then assign the value to Carrier 

    students(i)=Carrier 
Next i 

Nó không phải là thực hành tốt để mờ một mảng như Ngôn ngữ địa phương khi bạn chắc chắn biết rằng bạn sẽ sử dụng số nguyên duy nhất, vì nó sẽ ăn rất nhiều bộ nhớ không cần thiết ngay từ đầu. Bạn cũng nên lưu ý các giới hạn của các con số sẽ được gán, nếu nó vượt quá giới hạn Integer thì bạn nên sử dụng Double hoặc Float. Đây là lần đầu tiên tôi tham gia trang web, Cheers.