我可以使用带有Split()函数的无量纲String数组来从String中读取字段,但显然,必须对String数组进行尺寸标注以在循环中使用它。
为什么会这样,是否存在不需要标注数组的其他情况?
Dim field() As String
field = Split(data_line, "~")
Dim pref_line(10) As String
Input #1, pref_line(i)
答案 0 :(得分:3)
但显然,必须对String数组进行标注以在循环中使用它。
当使用带有Split()函数的无量纲String数组时,数组会自动标注尺寸并赋值给它。您也可以使用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
答案 1 :(得分:0)
Split()
都会返回自己的数组。您实际上是在覆盖变量的值。
答案 2 :(得分:0)
Dim field() As String
声明一个数组,但不分配它。
Dim pref_line(10)
As String声明并分配它。
field = Split(data_line, "~")
都会分配一个数组并填充它。
答案 3 :(得分:0)
其他人已经回答了你的问题,并正确地回答了你的要求。所以我不会对此发表评论。
另外,您应该尽可能避免使用Redimming数组。只有在绝对必要时才这样做。请记住,它只是我们的一行代码,但运行时引擎的工作量很大。首先为新阵列找到一个新的连续内存位置;然后将数组项从旧的复制到新的;然后丢弃旧阵列。所以你看到一个Redim Preserve
语句产生了编译器的工作量。
出于这个原因,在循环中重新调整“通常”是一个坏主意,因为您事先知道循环将运行多少次以及最后将有多少元素。所以在这种情况下,在循环开始之前重新调整数组,而不是在循环内部进行。最终结果将是更好的表现:)
以@SiddharthRout的回复中的代码为例,请注意循环将产生100个项目,因为您从1循环到100循环。所以在循环内部不是ReDim Preserve field(n)
,而是在它之外移动它循环的开始。 ReDim Preserve field(100) as Long
,或只是ReDim field(100) as Long
。