VBA批量打开工作簿遍历工作表修改单元格仅首个生效问题
故障原因
遍历工作表逻辑未覆盖全部工作表,是两处对象引用缺失导致的:
- 遍历工作表集合时未指定所属工作簿:
For Each ws In Worksheets默认调用当前活动工作簿的工作表集合,不会自动关联你通过Workbooks.Open打开的目标工作簿对象 - 单元格赋值时未指定所属工作表:
Range("A1")默认操作当前处于激活状态的工作表,不会跟随循环变量ws切换操作对象 - 测试版代码还遗漏了工作簿保存、关闭步骤,修改内容不会写入磁盘,打开的文件会残留后台占用资源。
修正后可直接运行的代码
Sub UpdateMetricsFixed() Dim wb As Workbook Dim ws As Worksheet Dim cell As Range ' 遍历选中区域内存储的所有文件路径 For Each cell In Selection ' 跳过空单元格避免报错 If Trim(cell.Value) <> "" Then Set wb = Workbooks.Open(cell.Value) ' 遍历当前打开的目标工作簿下的所有工作表 For Each ws In wb.Worksheets ' 对当前循环到的工作表指定单元格赋值 ws.Range("A1").Value = "Test" Next ws ' 所有工作表修改完成后保存并关闭工作簿 wb.Save wb.Close End If Next cell ' 释放对象占用内存 Set ws = Nothing Set wb = Nothing End Sub
使用提示
- 运行前请确认选中单元格内存储的是可正常访问的工作簿完整绝对路径,否则会触发文件找不到报错
- 如果需要修改其他单元格,直接替换
ws.Range("A1")中的单元格地址即可,例如要修改C5单元格就写为ws.Range("C5") - 如果选中区域可能存在无效路径,可自行添加错误捕获逻辑,避免代码运行中断
内容的提问来源于stack exchange,提问作者Rfordiani
相关产品推荐
相关产品推荐

