首页 > 解决方案 > 尝试读取带有前导空格的字符串时需要帮助解决“下标超出范围”错误

问题描述

我正在自动将许多 excel 文件导出为 PDF。这些文件是我们的房间数据表,可能有 3-5 个用于数据验证的选项卡,但只有第一个和有时第二个选项卡需要导出。我不想对工作表名称进行硬编码,而是希望通过允许使用逗号分隔的列表来确定相同格式的文件集中的哪些选项卡(如果它被用于房间以外的其他东西)来证明宏的未来数据表),或者如果没有提供列表,则导出整个文件。我让它为“房间数据表,楼层平面图”的单元格内容工作,但在另一个用户以更语法正确的方式键入列表的情况下,我开始解析/修剪列表以也接受“房间数据表,楼层计划”。但是,我的代码给了我“下标超出范围”

我使用的解析方法是首先拆分字符串,然后修剪结果字符串数组的内容以删除任何前导和尾随空格。虽然 For i = 0 To... 循环似乎不是问题,因为宏在第一个列表中部分成功,但我也尝试切换到 For Each 循环无济于事。我还尝试了 Trim()、VBA.LTrim() 和正则表达式模式(您可以在下面的代码中看到我的正则表达式尝试注释掉了)。

我还跟踪了单元格 A9 和 A10 中每个解析方法的输出,以确保修剪正常运行,并且对于 Trim() 和 VBA.LTrim(),生成的字符串没有前导或尾随空格,正如预期的那样。在这些情况下,根据 A9 和 A10 的输出,数组应该具有与第一个列表相同的字符串,但是将元素保存回数组似乎会导致数组或其中的字符串超出范围错误。任何建议将不胜感激。

这是有问题的子:

Sub ProcessFolders(strPath As String, sheetList As String)
    Dim objFileSystem As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim objExcelFile As Object
    Dim objWorkbook As Excel.Workbook
    Dim strWorkbookName As String
    Dim sList As Variant

    If Len(sheetList) > 0 Then
        sList = Split(sheetList, ",")

        For i = 0 To UBound(sList)
            sList(i) = VBA.LTrim(sList(i))
        '    Set regEx = CreateObject("VBScript.RegExp")
        '    regEx.Pattern = "^\S*\."
        '    sList(i) = regEx.Replace(sList(i), "")
        Next i

    End If

    Range("A9").Value = sList(0)
    Range("A10").Value = sList(1)

    Set objFileSystem = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFileSystem.GetFolder(strPath)

    For Each objFile In objFolder.Files
        strFileExtension = objFileSystem.GetExtensionName(objFile)
        If LCase(strFileExtension) = "xls" Or LCase(strFileExtension) = "xlsx" Then
            Set objExcelFile = objFile
            Set objWorkbook = Application.Workbooks.Open(objExcelFile.Path)

            strWorkbookName = Left(objWorkbook.Name, (Len(objWorkbook.Name) - Len(strFileExtension)) - 1)
            If sheetList = "" Then
                objWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=strPath & strWorkbookName & ".pdf"
            Else
               Sheets(Split(sheetList, ",")).Select
               ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=strPath & strWorkbookName & ".pdf"
            End If
            objWorkbook.Close False
        End If
    Next
End Sub

标签: arraysexcelvbasplittrim

解决方案


Sheets(Split(sheetList, ",")).Select应该是Sheets(sList).Select。我已经进行了此更改,因此我没有考虑仔细检查我的这部分代码。感谢客人指出我的错误。


推荐阅读