Excel 将字符串读取到大小未知的数组

Excel 将字符串读取到大小未知的数组,excel,vba,Excel,Vba,我知道以前有人问过这个问题,但我找不到我想要的答案。 我想遍历一个目录并将所有文件读入一个数组。 我不知道目录包含多少文件,因此我不知道数组的大小。 对我来说,实现这一目标的最佳方式是什么? 我读到“ReDim”是一个性能杀手,但我找不到任何类似集合的列表 我遗漏了什么吗?方法1 一种方法(也是标准的方法,因为它会大量出现)是根据平均用例任意地对数组进行尺寸标注 当您将要超过数组大小时,重新定尺寸将使元素数加倍 最后,将其调整为实际需要的大小 方法2(铺位) 遍历目录以获取大小。然后在数组大小正

我知道以前有人问过这个问题,但我找不到我想要的答案。 我想遍历一个目录并将所有文件读入一个数组。 我不知道目录包含多少文件,因此我不知道数组的大小。 对我来说,实现这一目标的最佳方式是什么? 我读到“ReDim”是一个性能杀手,但我找不到任何类似集合的列表


我遗漏了什么吗?

方法1

一种方法(也是标准的方法,因为它会大量出现)是根据平均用例任意地对数组进行尺寸标注

当您将要超过数组大小时,重新定尺寸将使元素数加倍

最后,将其调整为实际需要的大小

方法2(铺位)


遍历目录以获取大小。然后在数组大小正确的情况下运行代码。但由于缺乏原子性,文件系统不可行。该方法在其他用例中也能很好地工作;但是不要在这里使用它。

方法1

一种方法(也是标准的方法,因为它会大量出现)是根据平均用例任意地对数组进行尺寸标注

当您将要超过数组大小时,重新定尺寸将使元素数加倍

最后,将其调整为实际需要的大小

方法2(铺位)

遍历目录以获取大小。然后在数组大小正确的情况下运行代码。但由于缺乏原子性,文件系统不可行。该方法在其他用例中也能很好地工作;但是不要在这里使用它。

Redim arr(0) as String
然后

然后在循环之后

ReDim Preserve arr(ubound(arr)-1)
将其收缩到最后一个空元素


作为使用数组的替代方法。您可以使用
集合
字典

集合不需要在初始化时知道其大小。您可以使用项目的
add()
方法添加项目

要查看实现的真实示例,请参见和


如果您决定使用
Dir()
函数并迭代以查看有多少个文件,下面是一个示例函数

Sub Main()

    ReDim arr(FilesInDirectoryCount("C:\...")) As String

End Sub

Function FilesInDirectoryCount(path As String)
  Dim f As String, c As Long
  f = Dir$(path)
  Do While Len(f) <> 0
    c = c + 1
    f = Dir$
  Loop
  FilesInDirectoryCount = c
End Function
或者

Redim arr(0) as String
然后

然后在循环之后

ReDim Preserve arr(ubound(arr)-1)
将其收缩到最后一个空元素


作为使用数组的替代方法。您可以使用
集合
字典

集合不需要在初始化时知道其大小。您可以使用项目的
add()
方法添加项目

要查看实现的真实示例,请参见和


如果您决定使用
Dir()
函数并迭代以查看有多少个文件,下面是一个示例函数

Sub Main()

    ReDim arr(FilesInDirectoryCount("C:\...")) As String

End Sub

Function FilesInDirectoryCount(path As String)
  Dim f As String, c As Long
  f = Dir$(path)
  Do While Len(f) <> 0
    c = c + 1
    f = Dir$
  Loop
  FilesInDirectoryCount = c
End Function

是的,谢谢,我想避免遍历目录两次。如果我找不到其他方法,我将使用方法1:)是的,谢谢,我想避免遍历目录两次。如果我找不到其他方法,我将使用方法1:)不。不。不。不。永远不要将数组按1迭代增长。但我喜欢你的收藏想法。所以把它想象成+-INT_MAX@Bathsheba我从未注意到VBA中有任何显著的差异或性能下降,将数组大小增加了一倍。我能读到更多关于它的链接吗?我想补充一下,作为你最后一个想法的答案+为你第一!谢谢,我觉得使用字典或收藏很奇怪,因为他们用的是钥匙,而我这里没有钥匙。只是想要一个简单的列表(我知道很多列表实现都使用ReDim,有趣的是我必须自己编写)@Bathsheba如果这是一个1000万个整数的数组,你就完全正确了,但这更可能是一个100个长度为100k的字符串的数组<代码>重拨保留在这种情况下不会增加太多开销。不会。不。不。永远不要将数组迭代增长1。但我喜欢你的收藏想法。所以把它想象成+-INT_MAX@Bathsheba我从未注意到VBA中有任何显著的差异或性能下降,将数组大小增加了一倍。我能读到更多关于它的链接吗?我想补充一下,作为你最后一个想法的答案+为你第一!谢谢,我觉得使用字典或收藏很奇怪,因为他们用的是钥匙,而我这里没有钥匙。只是想要一个简单的列表(我知道很多列表实现都使用ReDim,有趣的是我必须自己编写)@Bathsheba如果这是一个1000万个整数的数组,你就完全正确了,但这更可能是一个100个长度为100k的字符串的数组<在这种情况下,code>ReDim-Preserve不会增加那么多开销。