我可以用一个未尺寸String数组与斯普利特()函数从字符串阅读领域,但显然,一个String数组必须的尺寸使用它在一个循环中。VBA,为何一个未尺寸阵列可与斯普利特()
这是为什么,并且是当阵列并不需要的尺寸有其他情况?
Dim field() As String
field = Split(data_line, "~")
Dim pref_line(10) As String
Input #1, pref_line(i)
我可以用一个未尺寸String数组与斯普利特()函数从字符串阅读领域,但显然,一个String数组必须的尺寸使用它在一个循环中。VBA,为何一个未尺寸阵列可与斯普利特()
这是为什么,并且是当阵列并不需要的尺寸有其他情况?
Dim field() As String
field = Split(data_line, "~")
Dim pref_line(10) As String
Input #1, pref_line(i)
但显然,一个字符串数组必须被定尺寸在循环中使用它。
当使用带有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
Split()
返回它自己的数组,无论你以前定义了什么。您正在有效覆盖变量的值。
Dim field() As String
声明的阵列,但是不分配它。
Dim pref_line(10)
作为字符串都声明并分配它。
field = Split(data_line, "~")
都分配一个数组并填充它。
其他人已经回答了您的问题,正确地说明了您的要求。所以我不会对此发表评论。
在旁注中,应尽可能避免使用Redimming阵列。只有在绝对必要时才这样做。请记住,它只是我们的一行代码,但对于运行时引擎来说却是一大堆工作。首先为新阵列找到一个新的连续内存位置;然后将数组项从旧的复制到新的;然后丢弃旧的数组。所以你看到一个Redim Preserve
语句为编译器产生了多少工作。
出于这个原因,在一个循环中redimming是“通常是”一个糟糕的主意,因为你事先知道循环多少次运行,你会多少元素在结束了。所以在这种情况下,在循环开始之前重新设置你的数组,而不是在循环内进行。最终的结果将是一个更好的性能:)
以@SiddharthRout的答复中的代码为例,请注意,循环将产生100个项目,因为您正在循环从1到100.因此,而不是ReDim Preserve field(n)
循环,在循环开始之前移动它。 ReDim Preserve field(100) as Long
,或者简单地说ReDim field(100) as Long
。
Pradeep那个循环就是一个例子。有很多情况下,你不知道循环可能运行多长时间,因此你必须在循环中使用Redim;) –
谢谢,所有。通过阅读文档,我无法获得很大的教训。 – Gene
@SiddharthRout:是的,你是对的。确切地说,我为什么从这条线开始,你已经得到了你的问题的答案。 :)这只是大多数程序员错过的一般性建议,然后想知道为什么他们的程序表现如此之慢。 –
+1好问题吸引好的答案 – 2013-11-27 13:49:24
@mehow:谢谢:)我同意 –
@PradeepKumar你说的对,我想我可能没有刷新页面或发生错误。+1在信用到期 – 2013-11-27 14:31:57