从CSV导入数据至XLSM时VBA宏报错:Runtime Error 1004
解决VBA导入CSV时的Runtime Error 1004问题
这个Runtime Error 1004: Method 'Range' of object '_Global' failed错误,大概率是因为你没有明确指定Range所属的工作表导致的——直接用Range("A1")会默认引用当前活动工作表,如果此时活动表不是你要写入数据的目标表,就会触发这个错误。另外你的代码逻辑也有可以优化的地方,咱们一步步来修正:
原代码的核心问题点
- 未指定工作表:
Range("A1")属于全局_Global对象,完全依赖当前活动工作表,稳定性极差 - 冗余的判断逻辑:
If IsEmpty(Range("A1")) = True之后又用Else: If IsEmpty(Range("A1")) = False,完全没必要,还容易打乱代码执行流程 - 未完成的
GoTo Lin...语句:标签缺失会直接导致代码执行异常
修正后的完整代码示例
Sub LoadFromFile() Dim fileName As String Dim folder As String Dim lastRow As Long Dim destSheet As Worksheet ' 明确指定目标工作表,把"数据导入表"改成你实际的工作表名称 Set destSheet = ThisWorkbook.Sheets("数据导入表") ' 简化lastRow判断逻辑,更严谨 With destSheet If IsEmpty(.Range("A1").Value) Then lastRow = 1 Else ' 精准定位A列最后一行有数据的位置,避免漏判已有数据的情况 lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1 End If End With ' 获取当前XLSM文件所在目录 folder = ThisWorkbook.Path ' 遍历目录下所有CSV文件 fileName = Dir(folder & "\*.csv") Do While fileName <> "" ' 用QueryTable导入CSV数据,稳定可靠 With destSheet.QueryTables.Add(Connection:="TEXT;" & folder & "\" & fileName, Destination:=destSheet.Range("A" & lastRow)) .TextFileParseType = xlDelimited .TextFileCommaDelimiter = True ' 如果是其他分隔符(如分号),替换成对应属性 .Refresh BackgroundQuery:=False .Delete ' 导入后删除临时QueryTable,避免重复创建 End With ' 更新lastRow,准备导入下一个CSV lastRow = destSheet.Cells(destSheet.Rows.Count, "A").End(xlUp).Row + 1 fileName = Dir() ' 获取下一个CSV文件 Loop End Sub
关键改进说明
- 绑定目标工作表:用
Set destSheet = ThisWorkbook.Sheets("数据导入表")固定操作的工作表,所有Range引用都加上.前缀(比如.Range("A1")),彻底摆脱对活动工作表的依赖 - 优化行号判断:用
Cells(Rows.Count, "A").End(xlUp).Row精准找到数据末尾,比只判断A1是否为空更适合已有数据的场景 - 完善CSV导入流程:添加了完整的CSV遍历和导入逻辑,QueryTable是处理CSV导入的稳定方式,避免手动读取的各种坑
额外注意事项
- 确保目标工作表名称完全正确,不要出现拼写错误
- 如果你的CSV是分号、制表符等其他分隔符,把
.TextFileCommaDelimiter = True改成对应的属性(比如.TextFileSemicolonDelimiter = True) - 运行宏前先保存XLSM文件,否则
ThisWorkbook.Path会返回空值,导致找不到CSV文件
内容的提问来源于stack exchange,提问作者Rahilkhan Pathan
相关产品推荐
相关产品推荐

