VBA代码问题:选中多工作表仅首个执行B列查找替换D列值操作
解决VBA代码仅在首个选中工作表执行的问题
原代码问题分析
- 查找逻辑放在了工作表循环外部,仅在首个激活工作表的B列完成查找,后续循环切换工作表时,修改的始终是首个工作表中找到的单元格(
c对象绑定的是首个工作表的单元格) - 多余的
ws.Select操作不仅无意义,还可能导致对象引用混乱
修正后的代码
Sub RunCode() Dim str As String Dim newVal As Variant Dim ws As Worksheet Dim findRange As Range Dim foundCell As Range ' 获取输入的人员编码和新值,限制ID输入为文本类型 str = "PEC-00" & Application.InputBox(Prompt:="ID: ", Type:=2) newVal = Application.InputBox(Prompt:="New Value: ") Application.ScreenUpdating = False ' 遍历所有选中的工作表 For Each ws In ActiveWindow.SelectedSheets ' 定位当前工作表的B列 Set findRange = ws.Columns("B") ' 精确查找指定人员编码 Set foundCell = findRange.Find(What:=str, LookIn:=xlValues, LookAt:=xlWhole) ' 找到匹配项后,修改对应D列的值 If Not foundCell Is Nothing Then foundCell.Offset(, 2).Value = newVal End If Next ws Application.ScreenUpdating = True MsgBox "操作完成!" End Sub
关键修改说明
- 将查找逻辑移入工作表循环内部,确保每个选中工作表都单独执行B列的查找操作
- 移除
ws.Select,直接通过ws对象操作工作表,避免激活切换带来的对象引用错误 - 增加
LookAt:=xlWhole参数,确保精确匹配人员编码(避免部分匹配的错误) - 加入
Type:=2限制ID输入为文本类型,防止数字输入丢失编码格式 - 增加空值判断,避免找不到编码时触发运行错误
内容的提问来源于stack exchange,提问作者mohamed_fadil
相关产品推荐
相关产品推荐

