在Excel的 ListObject中,当某一列发生变化时,如何触发将数据写入到另一张表的日志?
我正在做一个Excel VBA项目,需要跟踪表格中某一列的变更。
我的目标:
每当在 "T-0 Date" 列(属于 "Table1")修改日期时,我希望自动执行以下操作:
- 识别变动。
- 在另一张工作表中的名为 "T0Change" 的表(ListObject)中添加新的一行。
- 将该新行填充为更新后的日期、当前时间戳,以及从原始行在 Table1 中查找到的对应的“经度”值。
挑战:
作为初学者,我一直在为在目标表中找出“最后一个空行”而苦恼。使用Find或 End(xlUp) 的尝试并不稳定,尤其是因为我的表并非从单元格A1开始。
我希望找到一种干净、专业的处理方式,使用 ListObjects(Excel Tables) 而不是rang
解决方案
为了解答你的“挑战”:
一个表格(ListObject)不应该有任何空行(在数据库表中也没有“空行”这一说法)。你始终可以使用 ListRows.Add 方法添加新行。不带参数时,该方法会在表的末尾添加一行。
Dim table As ListObject
Set table = ThisWorkbooks.Worksheets("Sheet2").ListObjects("T0Change") ' <-- Change Sheetname
Dim lrow As ListRow
Set lrow = table.ListRows.Add
With lrow.range
.Cells(1, 1) = ... ' (whatever you want to log)
End With
如果你不想记录“旧值”,任务会相对简单。你可以使用 Worksheet_Change-event
Private Sub Worksheet_Change(ByVal Target As Range)
Dim delta As Long
delta = ListObjects("Table1").ListColumns("Longitude").Index - ListObjects("Table1").ListColumns("T-0 Date").Index
Dim cell As Range
For Each cell In Target
If Intersect(cell, ListObjects("Table1").ListColumns("T-0 Date").Range) Then
Dim longitute
longitute = Target.Offset(, delta)
AddLogEntry cell.Value2, longitute
End If
Next cell
End Sub
你也可以直接在变更事件中写入日志条目,但我更愿意为此设置一个单独的常规程序(我把它命名为 AddLogEntry)
Sub AddLogEntry(newValue, longitute)
Dim table As ListObject
Set table = ThisWorkbook.Worksheets("Sheet2").ListObjects("T0Change") ' <-- Change Sheetname
Dim lrow As ListRow
Set lrow = table.ListRows.Add
With lrow.Range
.Cells(1, 1) = newValue
.Cells(1, 2) = Now
.Cells(1, 3) = longitute
End With
End Sub
当你还想记录被修改单元格的旧值时,情况会变得更棘手。基本上有两种方法:
- 使用Undo/Redo来找出旧值,例如这里:
https://stackoverflow.com/a/50504790/7599798 - 使用
Worksheet_SelectionChange-Event在值被修改之前保存该值:
How do I get the old value of a changed cell in Excel VBA?
但这里开始会变得复杂,尤其是当用户使用Copy&Paste一次复制多格时。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。