简体   繁体   English

ReDim保留引发错误下标超出范围

[英]ReDim Preserve raise error Subscript out of range

Getting a 得到一个

Run-time : Error No. 9 运行时:错误号9
Subscript out of range 下标超出范围

at the line: 在行:

ReDim Preserve aryFileNames(UBound(aryFileNames) - 1) 

In the code below which is meant to convert text files to Excel files in a particular folder. 在下面的代码中,该代码旨在将文本文件转换为特定文件夹中的Excel文件。

Sub ConvertTextFiles()
    Dim fso As Object '<---FileSystemObject
    Dim fol As Object '<---Folder
    Dim fil As Object '<---File
    Dim strPath As String
    Dim aryFileNames As Variant
    Dim i As Long
    Dim wbText As Workbook

    Application.ScreenUpdating = False
    '// I am assuming the textfiles are in the same folder as the workbook with //
    '// the code are. //
    strPath = ThisWorkbook.Path & Application.PathSeparator

    '// Set a reference to the folder using FSO, so we can use the Files collection.//
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fol = fso.GetFolder(strPath)

    '// Using FSO's Files collection, we'll run through and build an array of //
    '// textfile names that exist in the folder. //
    ReDim aryFileNames(0)
    For Each fil In fol.Files
        If fil.Type = "Text Document" Then
            '// If correct Type (a text file), we'll assign the name of the found //
            '// textfile to the last element in the array - then add an empty //
            '// element to the array for next loop around... //
            aryFileNames(UBound(aryFileNames)) = fil.Name
            ReDim Preserve aryFileNames(UBound(aryFileNames) + 1)
        End If
    Next
    '// ... now since we were adding an empty element to the array, that means we'll//
    '// have an emmpty ending element after the above loop -  get rid of it here. //
    ReDim Preserve aryFileNames(UBound(aryFileNames) - 1)

    '// Basically, For Each element in the array... //
    For i = LBound(aryFileNames) To UBound(aryFileNames)
        '// ...open the textfile, set a reference to it, SaveAs and Close. //
        Workbooks.OpenText Filename:=strPath & aryFileNames(i), _
        Origin:=xlWindows, _
        StartRow:=1, _
        DataType:=xlFixedWidth, _
        FieldInfo:=Array(Array(0, 1), _
        Array(7, 1), _
        Array(55, 1), _
        Array(68, 1))
        Set wbText = ActiveWorkbook
        wbText.Worksheets(1).Columns("A:D").EntireColumn.AutoFit
        wbText.SaveAs Filename:=strPath & Left(aryFileNames(i), Len(aryFileNames(i)) - 4), _
        FileFormat:=xlWorkbookNormal

        wbText.Close
    Next
    Application.ScreenUpdating = True
End Sub 

You'll get a subscript out of range any time your For Each loop doesn't execute or you don't find any text documents. 每当您的For Each循环不执行或找不到任何文本文档时,您都将获得下标超出范围。 The starting bound of the array is 0 and in that case it never gets incremented, so this line of code... 数组的起始边界为0,在这种情况下,它永远不会递增,因此这行代码...

ReDim Preserve aryFileNames(UBound(aryFileNames) - 1) 

...is trying to size the array to a bound of -1. ...正在尝试将数组的大小调整为-1。 Since you're working with strings, you can take advantage of a quirk in the Split function to simplify your array sizing. 由于您正在使用字符串,因此可以利用Split函数中的一个怪癖来简化数组大小。 If you Split a vbNullString, VBA will return a String array with a UBound of -1. 如果拆分vbNullString,则VBA将返回UBound为-1的String数组。 Instead of initializing it with ... 而不是用...初始化它

ReDim aryFileNames(0)

... and then trimming it afterward, you can just do this: ...然后进行修整,您可以执行以下操作:

aryFileNames = Split(vbNullString)
'UBound of the array is now -1.
For Each fil In fol.Files
    If fil.Type = "Text Document" Then
        ReDim Preserve aryFileNames(UBound(aryFileNames) + 1)
        aryFileNames(UBound(aryFileNames)) = fil.Name
    End If
Next
'Array is correct size - you can skip "trimming" it.
'ReDim Preserve aryFileNames(UBound(aryFileNames) - 1)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM