vba,为什么无量纲数组与Split()一起使用

时间:2013-11-27 13:35:04

标签: arrays vba

我可以使用带有Split()函数的无量纲String数组来从String中读取字段,但显然,必须对String数组进行尺寸标注以在循环中使用它。

为什么会这样,是否存在不需要标注数组的其他情况?

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

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

4 个答案:

答案 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