Excel VBA Worksheet_Activate事件工作表激活异常及数据提取问题
问题根因
- 代码中显式编写了
ss.Activate语句,执行到这行时会直接激活Salary Sheet,触发跳转 - 后续循环逻辑使用
Select、ActiveCell这类必须依赖当前激活工作表的写法,全程没有切回ESI_Punjab的逻辑,代码执行完成后自然停留在Salary Sheet - 原代码存在额外隐患:每次激活工作表都会重复追加员工编码,没有清空历史数据的逻辑,多次切换会产生大量重复值;
Rows.Count未指定所属工作表,跨表计算行数时容易出错;f列表头的文本直接断行,会触发VBA语法错误。
修复后完整代码
Private Sub Worksheet_Activate() Dim EP As Worksheet, ss As Worksheet Dim i As Long, outRow As Long Set EP = ThisWorkbook.Sheets("ESI_Punjab") Set ss = ThisWorkbook.Sheets("Salary Sheet") ' 设置行高列宽 EP.Range("A3").RowHeight = 48 EP.Range("A1").ColumnWidth = 11.14 EP.Range("B1").ColumnWidth = 14.86 EP.Range("C1").ColumnWidth = 24 EP.Range("D1").ColumnWidth = 20.86 EP.Range("E1").ColumnWidth = 16 EP.Range("F1").ColumnWidth = 39.43 EP.Range("G1").ColumnWidth = 13.57 ' 设置表头与格式 EP.Range("A3").Value = "Employee Code" EP.Range("A3").WrapText = True EP.Range("B3").Value = "IP Number" EP.Range("C3").Value = "IP Name" EP.Range("D3").Value = "No of Days for which wages paid/payable during the month" EP.Range("E3").Value = "Total Monthly Wages" EP.Range("F3").Value = "Reason Code for Zero workings days(numeric only; provide 0 for all other reasons- Click on the link for reference)" EP.Range("G3").Value = "Last Working Day" EP.Range("B3:G3").Interior.Color = RGB(204, 255, 255) EP.Range("B3:G3").Font.Bold = True EP.Range("B3:G3").WrapText = True ' 清空A列旧数据,避免重复写入 outRow = 4 EP.Range("A4:A" & EP.Rows.Count).ClearContents ' 遍历数据写入符合条件的员工编码,全程不需要激活目标工作表 For i = 5 To ss.Range("A" & ss.Rows.Count).End(xlUp).Row If ss.Cells(i, 10).Value = "Punjab" Then EP.Cells(outRow, 1).Value = ss.Cells(i, 1).Value outRow = outRow + 1 End If Next i End Sub
修复说明
- 移除所有
Activate、Select、ActiveCell相关逻辑,直接通过绑定的工作表对象操作单元格,从根源上避免工作表自动跳转的问题 - 新增历史数据清空逻辑,每次激活工作表时先清空A列表头下的旧员工编码,再写入最新筛选结果,不会产生重复数据
- 将原有的Copy粘贴操作改为直接取值赋值,运行效率更高,也不会占用系统剪贴板
- 为所有
Rows.Count指定所属工作表,避免跨表取行数时出现计算偏差 - 修正原代码中f列表头文本直接断行导致的语法报错
内容的提问来源于stack exchange,提问作者Drishti Consultancy
相关产品推荐
相关产品推荐

