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

时间:2013-10-22 12:34:34

标签: excel-vba vba excel

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

我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

方法1

一种方式(并且标准来说,它会大量增加)是根据平均用例对数组进行一些任意的维度。

当你要超过数组大小时,重新加载加倍元素的数量。

然后在最后,将其调整到实际所需的大小。

方法2(Bunk)

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

答案 1 :(得分:2)

要么

Redim arr(0) as String

然后

arr(ubound(arr)) = "newFilename"
ReDim Preserve arr(ubound(arr)+1)

然后循环

ReDim Preserve arr(ubound(arr)-1)

通过最后一个元素缩小它。


作为使用数组的替代方法。您可以使用CollectionDictionary

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

要查看实施的真实示例,请参阅thisthat


如果您决定使用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

或使用此

Sub CountFiles()
    Dim strDir As String
    Dim fso As Object
    Dim objFiles As Object
    Dim obj As Object
    Dim lngFileCount As Long

    strDir = "C:\path..."

    Set fso = CreateObject("Scripting.FileSystemObject")

    Set objFiles = fso.GetFolder(strDir).Files

    lngFileCount = objFiles.count

    MsgBox lngFileCount

    Set objFiles = Nothing
    Set fso = Nothing
    Set obj = Nothing

End Sub