arrays - 尝试读取带有前导空格的字符串时需要帮助解决“下标超出范围”错误
问题描述
我正在自动将许多 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
解决方案
Sheets(Split(sheetList, ",")).Select
应该是Sheets(sList).Select
。我已经进行了此更改,因此我没有考虑仔细检查我的这部分代码。感谢客人指出我的错误。
推荐阅读
- python - OpenCV 或 Numpy 中的对比度拉伸与限制和消隐
- python - Matplotlib Sliders - Autoscaling of the y-axis
- python - Comparing two lists from user input (lottery game)
- ios - Swift WKWebView 没有将全局处理程序注入网站
- django - Django create_superuser() missing 1 required positional argument: 'username'
- html - How to center modal window on view port, no matter where you are located on the page?
- angular - Vscode 说该类在库模块中不存在,但可以正确构建。我怎样才能解决这个问题?
- javascript - discord.js 从旧消息中读取反应
- ios - 如何在没有 https 的情况下使用 ftp 服务器安装 .ipa 文件?
- multithreading - 终止特定线程