VBA读取CSV文件报错Run-time error '9':下标越界,因行结构不一致
嘿,这个下标越界的问题我太熟了!就是因为前两行的元素数量和你要读取的3-13行完全不一样,你要是直接按6个元素去访问,程序肯定懵圈报错。给你两个实用的解决办法,按需选就行:
方法一:逐行读取精准控制(适合自定义处理数据)
这种方法直接逐行读取文件,跳过前两行,只处理3到13行,完美避开结构不一致的问题。代码里我加了详细注释,一看就懂:
Sub ReadSpecificCSVRows() Dim filePath As String Dim fileNum As Integer Dim currentLine As String Dim lineCount As Integer Dim rowData As Variant ' 把这里换成你的CSV文件实际路径 filePath = "C:\YourTargetFile.csv" fileNum = FreeFile() ' 获取可用的文件编号 ' 打开文件准备读取 Open filePath For Input As #fileNum lineCount = 0 ' 循环读取直到文件末尾或者读到第13行 Do Until EOF(fileNum) Or lineCount >= 13 Line Input #fileNum, currentLine ' 读取一行内容 lineCount = lineCount + 1 ' 只处理第3到13行的内容 If lineCount >= 3 And lineCount <= 13 Then ' 用逗号拆分每行数据成数组 rowData = Split(currentLine, ",") ' 你确认这些行有6个元素,直接访问索引0到5就行 Debug.Print "编号1: " & rowData(0) & ", 编号2: " & rowData(1) & ", 编号3: " & rowData(2) _ & ", 编号4: " & rowData(3) & ", 编号5: " & rowData(4) & ", 编号6: " & rowData(5) ' 要是想把数据写入Excel工作表,比如写到Sheet1的对应行: ' Sheet1.Cells(lineCount - 2, 1).Resize(1, 6) = rowData End If Loop ' 记得关闭文件 Close #fileNum End Sub
这个方法的好处是完全可控,你可以在读取目标行的时候任意处理数据,不会因为前两行的结构问题报错。
方法二:用QueryTables快速导入到工作表(适合批量导入)
如果你只是想把3-13行的数据直接导入到Excel表格里,用QueryTables会更高效,不用逐行循环:
Sub ImportCSVRowsToSheet() Dim ws As Worksheet Dim qt As QueryTable Dim filePath As String ' 替换成你要导入的目标工作表 Set ws = ThisWorkbook.Sheets("Sheet1") filePath = "C:\YourTargetFile.csv" ' 先清空工作表内容(可选,根据需求调整) ws.Cells.Clear ' 创建QueryTable对象导入CSV数据 Set qt = ws.QueryTables.Add( _ Connection:="TEXT;" & filePath, _ Destination:=ws.Range("A1")) With qt .TextFileParseType = xlDelimited ' 按分隔符解析 .TextFileCommaDelimiter = True ' 分隔符是逗号 .TextFileStartRow = 3 ' 从第3行开始导入 .Refresh BackgroundQuery:=False ' 立即执行导入 ' 导入后只保留前11行(3到13一共11行),删除后面多余的行 ws.Rows(12 & ":" & ws.UsedRange.Rows.Count).Delete End With ' 清理QueryTable对象 qt.Delete End Sub
注意事项:
- 记得把代码里的文件路径和工作表名称换成你实际的内容
- 如果你的CSV用的是其他分隔符(比如分号),要调整
Split的参数或者TextFileCommaDelimiter为对应设置 - 第一种方法适合需要对每行数据做额外处理的场景,第二种适合快速批量导入
内容的提问来源于stack exchange,提问作者Eugen Draghici
相关产品推荐
相关产品推荐

