Excel VBA日志代码修复请求:旧值未记录+多范围日志需求
修复后的Excel VBA代码
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Static startTime As Double ' 存储启动时间 Static oldValues As Variant ' 改为静态变量,保留启动时的旧值 Dim elapsedTime As Double ' 存储耗时 Dim logSheet As Worksheet Dim newValues As Variant Dim rowNum As Long Dim numColumns As Long Dim i As Long ' 配置多组启动/停止单元格与对应目标范围 Dim rangeConfigs As Variant rangeConfigs = Array( _ Array("B1", "C1", "O32:CL32"), _ Array("D1", "E1", "O33:CL33") ' 可添加更多组,格式:启动单元格, 停止单元格, 目标范围 ) Dim config As Variant Set logSheet = ThisWorkbook.Sheets("Log - Ratio") ' 遍历配置,匹配当前点击的单元格 For Each config In rangeConfigs ' 匹配启动单元格 If Not Intersect(Target, Me.Range(config(0))) Is Nothing Then startTime = Timer ' 存储当前目标范围的旧值 oldValues = Me.Range(config(2)).Value Exit Sub ' 匹配到后退出循环 ' 匹配停止单元格 ElseIf Not Intersect(Target, Me.Range(config(1))) Is Nothing Then elapsedTime = Timer - startTime newValues = Me.Range(config(2)).Value rowNum = logSheet.Cells(logSheet.Rows.Count, 1).End(xlUp).Row + 1 numColumns = Me.Range(config(2)).Columns.Count ' 写入日志基础信息 logSheet.Cells(rowNum, 1).Value = Now ' 时间戳 logSheet.Cells(rowNum, 2).Value = Application.UserName ' 操作人 logSheet.Cells(rowNum, 3).Value = config(2) ' 目标范围 ' 写入旧值(使用静态存储的启动时旧值) If IsArray(oldValues) Then For i = 1 To numColumns logSheet.Cells(rowNum, 3 + i).Value = oldValues(1, i) Next i End If ' 写入新值 For i = 1 To numColumns logSheet.Cells(rowNum, 3 + numColumns + i).Value = newValues(1, i) Next i Exit Sub ' 匹配到后退出循环 End If Next config End Sub
关键修改说明
1. 修复旧值记录异常
- 将
oldValues改为静态变量(Static):原代码中oldValues是局部变量,点击停止时已被销毁,无法保留启动时的旧值。改为静态变量后,值会在多次触发事件时持续保留。 - 停止时直接读取
oldValues数组:原代码在停止时重新读取单元格值,此时单元格已是新值,导致旧值记录错误,现在直接调用启动时存储的旧值数组。
2. 支持多范围日志记录
- 添加
rangeConfigs配置数组:可自由添加多组「启动单元格-停止单元格-目标范围」的组合,示例中新增了D1启动、E1停止对应O33:CL33的范围,后续只需按格式扩展数组即可支持更多范围。 - 遍历配置匹配点击事件:通过循环遍历配置数组,自动匹配当前点击的是哪一组的启动/停止单元格,无需重复编写IF判断逻辑。
内容的提问来源于stack exchange,提问作者jonathan
相关产品推荐
相关产品推荐

