You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 01:30:46