如何在 Excel 表的某个范围内插入不应使用 autohotkey 中的 com 对象自动更新的时间?

如何在 Excel 表的某个范围内插入不应使用 autohotkey 中的 com 对象自动更新的时间?

我想在一个不应自动更新的范围内插入时间。例如,如果单元格 k5 中有任何值,则当前时间应自动插入单元格 N5 中。同样,如果 k6 中有任何值,则当前时间应自动插入 N6 中,依此类推。还有一件事我想提请您注意,整个 K 列中也有一个公式,因此如果我在 K 列左侧的任何单元格中输入任何值,它会在其对应单元格(在 K 列中)中显示计算结果。此外,时间不应自动更新。我尝试使用这个公式

=如果 (K5 < 0," ",如果 (K5 = 0," ",NOW ()))

此公式有效,但它会自动使用系统时钟更新时间。我希望它不要更新时间。您还可以查看快照:

在此处输入图片描述

有什么帮助吗?

答案1

您可以在 AutoHotkey 中使用 com 对象,但我不建议这样做。

如果您将Worksheet_Change()宏放入电子表格中,Excel 会在您每次手动输入内容时(即,当您更新或更改单元格时)对其进行评估。宏将接收已修改单元格的 Range 对象,因此您可以从 range 对象中获取行和列。如果列是您关心的列(在您的情况下为 列K),则可以使用相同的行和不同的列(在您的情况下为 列N)来插入时间。Worksheet_Change()每当单元格发生变化时,都会调用宏来更新所有电子表格,因此区分您关心的列非常重要,因为该例程也会对您不关心的列的任何更新执行。

下面的代码示例应该很容易适应。它设计了一些变体,您可以删除并适应您的情况。

  1. 它旨在插入日期,而不是时间......这很容易改变
  2. 它旨在触发多列,而不仅仅是一列
  3. 为了能够灵活地重新设计电子表格或移动列,它没有硬编码到特定的列,即KN

第3项的详细描述:

  • 代码不依赖于硬编码的列地址值
  • 相反,它依赖于第一行MyRange = Range("1:1")作为标题行(通常看起来也不错)
  • 一旦定义了标题行(即硬编码为 row 1),它就会找到触发更新的重要列标题
  • 找到这些列标题后,它会检查发生更改的单元格是否位于其中一列中
  • 如果单元格位于其中一列,则插入日期

此设置允许您在第一行中使用带标签的标题行,并在以后随意移动列(在任意位置插入或删除列),即使您关心的单元格不再位于相同KN列位置,自动插入仍可正常工作。如果您不关心这些,当然可以保留没有标题的电子表格,删除代码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

相关内容