2013-11-27 69 views
4

我可以用一个未尺寸String数组与斯普利特()函数从字符串阅读领域,但显然,一个String数组必须的尺寸使用它在一个循环中。VBA,为何一个未尺寸阵列可与斯普利特()

这是为什么,并且是当阵列并不需要的尺寸有其他情况?

Dim field() As String 
field = Split(data_line, "~") 

Dim pref_line(10) As String 
Input #1, pref_line(i) 

回答

3

但显然,一个字符串数组必须被定尺寸在循环中使用它。

当使用带有Split()函数的无标注字符串数组时,数组会自动进行标注并赋值给它。你也可以使用,在使用For i = LBound(field) to UBound(field)

Option Explicit 

Sub Sample() 
    Dim field() As String 
    Dim data_line As String 

    data_line = "aaa~bbb" 

    field = Split(data_line, "~") 

    Debug.Print field(0) 
End Sub 

是否还有其他情况一个循环,一个数组并不需要的尺寸?

是。当你不知道有多少物品需要添加到数组中时,则可以声明和取消标注数组,然后使用Redim Preserve来增加值。例如

Option Explicit 

Sub Sample() 
    Dim field() As Long 
    Dim n As Long, i As Long 

    ReDim Preserve field(n) 

    For i = 1 To 100 
     field(n) = i 
     n = n + 1 
     ReDim Preserve field(n) 
    Next i 
End Sub 
+0

+1好问题吸引好的答案 – 2013-11-27 13:49:24

+0

@mehow:谢谢:)我同意 –

+0

@PradeepKumar你说的对,我想我可能没有刷新页面或发生错误。+1在信用到期 – 2013-11-27 14:31:57

0

Split()返回它自己的数组,无论你以前定义了什么。您正在有效覆盖变量的值。

0

Dim field() As String声明的阵列,但是不分配它。

Dim pref_line(10)作为字符串都声明并分配它。

field = Split(data_line, "~")都分配一个数组并填充它。

0

其他人已经回答了您的问题,正确地说明了您的要求。所以我不会对此发表评论。

在旁注中,应尽可能避免使用Redimming阵列。只有在绝对必要时才这样做。请记住,它只是我们的一行代码,但对于运行时引擎来说却是一大堆工作。首先为新阵列找到一个新的连续内存位置;然后将数组项从旧的复制到新的;然后丢弃旧的数组。所以你看到一个Redim Preserve语句为编译器产生了多少工作。

出于这个原因,在一个循环中redimming是“通常是”一个糟糕的主意,因为你事先知道循环多少次运行,你会多少元素在结束了。所以在这种情况下,在循环开始之前重新设置你的数组,而不是在循环内进行。最终的结果将是一个更好的性能:)

以@SiddharthRout的答复中的代码为例,请注意,循环将产生100个项目,因为您正在循环从1到100.因此,而不是ReDim Preserve field(n)循环,在循环开始之前移动它。 ReDim Preserve field(100) as Long,或者简单地说ReDim field(100) as Long

+1

Pradeep那个循环就是一个例子。有很多情况下,你不知道循环可能运行多长时间,因此你必须在循环中使用Redim;) –

+0

谢谢,所有。通过阅读文档,我无法获得很大的教训。 – Gene

+1

@SiddharthRout:是的,你是对的。确切地说,我为什么从这条线开始,你已经得到了你的问题的答案。 :)这只是大多数程序员错过的一般性建议,然后想知道为什么他们的程序表现如此之慢。 –