合并多个CSV文件时循环第二次出现下标越界错误
解决VBA循环处理CSV时的“下标越界”错误
错误原因分析
- CSV工作表引用错误:你用
Worksheets(fileNumber)引用CSV文件的工作表,但CSV文件打开后默认只有1个工作表,索引为1,而非循环变量fileNumber的值(比如第二次循环fileNumber=2,Worksheets(2)不存在,直接触发下标越界)。CSV打开后的工作表名称是文件名(不带.csv后缀),但用索引1引用更稳妥。 - 主工作簿引用错误:最后清理Scratch工作表时,代码写了
Workbooks("Output.xlsm"),但实际主工作簿是Master.xlsm,名称写错会导致后续循环出错。 - 窗口激活的不可靠性:依赖
Windows(fileName).Activate切换窗口的方式,在文件路径或窗口名称有变化时容易出错,应该直接通过对象变量引用工作簿和工作表,避免激活操作。
修正后的代码
Public Sub Combine() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Dim filePath As String Dim fileMin As Integer, fileMax As Integer, fileNumber As Integer Dim fileName As String Dim csvWB As Workbook ' 存储打开的CSV工作簿对象 Dim masterWB As Workbook ' 存储主工作簿对象 Dim scratchWS As Worksheet, outputWS As Worksheet Dim rngSource As Range Dim CLastFundRow As Long Dim CFirstBlankCol As Long ' 初始化主工作簿和工作表对象,避免重复引用 Set masterWB = ThisWorkbook Set scratchWS = masterWB.Worksheets("Scratch") Set outputWS = masterWB.Worksheets("Output") ' Mac下的路径处理 filePath = masterWB.Path If Right(filePath, 1) = ":" Then filePath = filePath & "Folder/" Else filePath = filePath & "/Folder/" End If fileMin = 1 fileMax = 10 For fileNumber = fileMin To fileMax fileName = fileNumber & ".csv" ' 打开CSV并赋值给变量,无需激活窗口 Set csvWB = Workbooks.OpenText(filePath & fileName) ' 修正:CSV只有1个工作表,用索引1引用 scratchWS.Range("A1:A100").Value2 = csvWB.Worksheets(1).Range("A1:A100").Value2 ' 关闭CSV工作簿 csvWB.Close saveChanges:=False ' 获取Scratch的最后一行数据 CLastFundRow = scratchWS.Cells(Rows.Count, 1).End(xlUp).Row ' 获取Output的第一个空列,处理初始为空的边界情况 If outputWS.Cells(1, Columns.Count).End(xlToLeft).Column = 1 And outputWS.Cells(1, 1).Value = "" Then CFirstBlankCol = 1 Else CFirstBlankCol = outputWS.Cells(1, Columns.Count).End(xlToLeft).Column + 1 End If ' 复制Scratch数据到Output对应列 Set rngSource = scratchWS.Range("A1:A" & CLastFundRow) outputWS.Cells(1, CFirstBlankCol).Resize(rngSource.Rows.Count, 1).Value2 = rngSource.Value2 ' 清理Scratch工作表 scratchWS.Cells.Clear Set rngSource = Nothing Set csvWB = Nothing Next Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub
关键优化点
- 新增对象变量直接引用工作簿和工作表,彻底避免窗口激活操作,代码稳定性大幅提升。
- 修正CSV工作表的引用逻辑,确保始终指向唯一的工作表。
- 修复Output空列判断的边界场景(第一次循环时Output为空的情况)。
- 优化数据复制写法,用
Resize精准匹配数据范围,避免原代码中多复制一列的问题。
内容的提问来源于stack exchange,提问作者debbybeginner
相关产品推荐
相关产品推荐

