答案1
您可以在 AutoHotkey 中使用 com 对象,但我不建议这样做。
如果您将Worksheet_Change()
宏放入电子表格中,Excel 会在您每次手动输入内容时(即,当您更新或更改单元格时)对其进行评估。宏将接收已修改单元格的 Range 对象,因此您可以从 range 对象中获取行和列。如果列是您关心的列(在您的情况下为 列K
),则可以使用相同的行和不同的列(在您的情况下为 列N
)来插入时间。Worksheet_Change()
每当单元格发生变化时,都会调用宏来更新所有电子表格,因此区分您关心的列非常重要,因为该例程也会对您不关心的列的任何更新执行。
下面的代码示例应该很容易适应。它设计了一些变体,您可以删除并适应您的情况。
- 它旨在插入日期,而不是时间......这很容易改变
- 它旨在触发多列,而不仅仅是一列
- 为了能够灵活地重新设计电子表格或移动列,它没有硬编码到特定的列,即
K
或N
。
第3项的详细描述:
- 代码不依赖于硬编码的列地址值
- 相反,它依赖于第一行
MyRange = Range("1:1")
作为标题行(通常看起来也不错) - 一旦定义了标题行(即硬编码为 row
1
),它就会找到触发更新的重要列标题 - 找到这些列标题后,它会检查发生更改的单元格是否位于其中一列中
- 如果单元格位于其中一列,则插入日期
此设置允许您在第一行中使用带标签的标题行,并在以后随意移动列(在任意位置插入或删除列),即使您关心的单元格不再位于相同K
或N
列位置,自动插入仍可正常工作。如果您不关心这些,当然可以保留没有标题的电子表格,删除代码WorksheetFunction.Match
并使用硬编码的列地址。
要使用此代码,请打开 VBA 编辑器 - 通常左侧会有一个树,其中显示 VBAProject(文件名),其中包含 Microsoft Excel 对象的子文件夹,然后是三个工作表(默认情况下在新工作簿上)以及 ThisWorkbook 的子项目。双击要在其上工作的 Sheet,然后插入Worksheet_Change()
下面的函数,以便您可以在该 Sheet 上使用和编辑它。
Private Sub Worksheet_Change(ByVal Target As Range)
'Do nothing if more than one cell is changed or content deleted
If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
'Debug.Print Time
MyRange = Range("1:1")
TotalColumn = Application.WorksheetFunction.Match("Total", MyRange, 0) 'exact match, row 1
ProjectColumn = Application.WorksheetFunction.Match("Project", MyRange, 0) 'exact match, row 1
DescriptionColumn = Application.WorksheetFunction.Match("Description", MyRange, 0) 'exact match, row 1
If Target.Column = TotalColumn Then ' If Total gets updated, then update the Total change date
DateColumn = Application.WorksheetFunction.Match("Date Last Total Change", MyRange, 0) 'exact match, row 1
'MsgBox DateColumn
' ------------------------------------------------
' EnableEvents not required, but keeps this routine from being called again
' ------------------------------------------------
Application.EnableEvents = False
'Update field with Date of last update
ActiveSheet.Cells(Target.Row, DateColumn).Value = Date
Application.EnableEvents = True ' re-enable events
' ------------------------------------------------
End If
If (Target.Column = TotalColumn) Or (Target.Column = ProjectColumn) Or (Target.Column = DescriptionColumn) Then
DateColumn1 = Application.WorksheetFunction.Match("Date", MyRange, 0) 'exact match, row 1
' Update the open date if it's empty, otherwise leave it alone
If ActiveSheet.Cells(Target.Row, DateColumn1).Value = "" Then
ActiveSheet.Cells(Target.Row, DateColumn1).Value = Date
End If
End If
End Sub