2012-01-26 77 views
7

我想在VBA中,数组列表,所以我必须在Excel VBA中像宣称的变体:阵列在Excel VBA中

Dim Students(10) as variant 

现在我想存储在学生列表编号。这些数字并不连续。有时像:

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

我该如何做到这一点在vba中?我怎样才能访问列表项?

回答

10

学生必须声明为动态数组。也就是说,一个数组的边界可以改变。 Dim Students(10)给出了一个数组,其边界无法更改,无法从数组中加载。

Dim Students() As Variant 

要加载生:

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

要访问的元素:

Dim Inx As Long 

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

LBOUND(下限)和UBound函数意味着对环路调节到元件中的实际数量学生们。

+0

+1干得好!另请注意,数组默认情况下是零边界的。 – JimmyPena

+1

@JP。我知道,但不知何故,除非我已明确宣布下限,我不相信它将始终为零。 –

3

您可以添加值到一个这样的数组...

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

或者这样

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

然后你就可以在同一个庄园访问值。请注意,如果您使用第二个选项,则需要声明如下:

Dim Students() As Variant 
4

这是对你来说太复杂,现在,你可能从来没有碰到一个情况下,你就需要这样,而是:

我用更形成内存效率阵列下面的方法(因为Variant使用任何变量类型的大部分内存),同时仍然可以方便地将数组内容声明为一行。按照你的例子:

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 

访问它会是这样的一个例子:

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

我得知这个从这里:http://www.vbforums.com/showthread.php?669265-RESOLVED-VBA-Excel-Assigning-values-to-array-in-a-single-line&p=4116778&viewfull=1#post4116778

+0

请注意,您只需要对非字符串数组执行此操作,因为对于字符串,您可以简单地执行'arrStrings()= Split(“Item1,Item2,Item3”,“,”,vbtextcompare)'或其他任何操作。 – puzzlepiece87

0

好, 这取决于你将如何提供该数组的值,你会得到从Worksheet.Range的值TextBoxListB牛,但基本上代码将是类似的东西:

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 

这是不好的做法暗淡数组为Variant时,你当然知道,你要只使用整数,因为它会吃很多的首先不需要的内存。 你也应该知道要分配的数字的范围,如果它超过整数限制,那么你应该使用Double或Float。 这是我第一次参与网站,干杯。