VBA代码报错排查:打开最新版文件统计行数并写入单元格
解决VBA统计行数时报错的问题
嘿,我瞅了下你的代码,问题出在打开文件后没有正确引用工作簿对象上。你用f1来调用Worksheets,但f1是FileSystemObject返回的File对象,根本不是Excel的Workbook对象,Excel自然不知道你要操作哪个工作表啦。
接下来给你拆解修正点,再贴完整的修复代码:
主要问题点
- 打开文件后未将工作簿赋值给变量,错误地用FSO的File对象操作工作表
- 需求是写入(K,2)单元格(即第2行第11列),原代码写的是(2,20)(T列),不符合需求
修正后的代码
Sub CountRows() Dim SourceLocation As String Dim strdays As Integer Dim FSO As Object Dim f As Object, f1 As Object, fc As Object Dim wb As Workbook ' 新增工作簿对象变量 Dim LastRow As Long strdays = 2 SourceLocation = "H:\location\" Set FSO = CreateObject("Scripting.FileSystemObject") Set f = FSO.GetFolder(SourceLocation) Set fc = f.Files For Each f1 In fc ' 检查文件是最近2天修改的,且文件名前6位是myFile(不区分大小写) If DateDiff("d", f1.DateLastModified, Date) < strdays And LCase(Left(f1.Name, 6)) = "myfile" Then ' 打开文件并赋值给wb变量,建议加ReadOnly避免锁定文件 Set wb = Workbooks.Open(f1.Path, ReadOnly:=False) ' 如果需要保存就设为False,只读则True ' 统计Sheet1的A列最后一行行数 LastRow = wb.Worksheets("Sheet1").Range("A" & wb.Worksheets("Sheet1").Rows.Count).End(xlUp).Row ' 写入到K2单元格(第2行第11列) wb.Worksheets("Sheet1").Cells(2, 11).Value = LastRow ' 可选:保存并关闭工作簿,如果不需要保存可以去掉SaveChanges:=True wb.Close SaveChanges:=True Exit For ' 找到第一个符合条件的文件就退出循环 End If Next ' 释放对象,避免内存泄漏 Set wb = Nothing Set fc = Nothing Set f = Nothing Set FSO = Nothing End Sub
关键改动说明
- 新增
wb工作簿变量:把打开的文件赋值给wb,后续所有工作表操作都通过这个变量来引用,这是解决报错的核心。 - 修正单元格位置:把
Cells(2,20)改成Cells(2,11),对应需求中的(K,2)单元格。 - 明确引用Rows.Count:原代码中
Rows.Count默认是当前活动工作表的行数,加上wb.Worksheets("Sheet1").前缀,确保引用的是目标工作表的行数,避免活动工作表切换导致的错误。 - 添加对象释放:最后手动释放所有对象变量,避免VBA内存泄漏。
- 可选的ReadOnly参数:打开文件时可以根据需求设置
ReadOnly,如果只需要读取统计不需要修改,设为True更安全,不会锁定文件。
这样修改后,代码就能正常统计行数并写入指定单元格啦!
内容的提问来源于stack exchange,提问作者user11091170
相关产品推荐
相关产品推荐

