Вы можете использовать com-объект в AutoHotkey, но я бы не рекомендовал делать это таким образом.
Если вы поместите макрос Worksheet_Change()
в вашу электронную таблицу, Excel будет оценивать его каждый раз, когда вы вводите что-либо вручную (т. Е. Когда вы обновляете ячейку или меняете ее). Макрос получит объект Range из измененных ячеек, поэтому из объекта диапазона можно получить строку и столбец. Если столбец - это столбец, который вас интересует (в вашем случае, столбец K
), тогда вы используете ту же строку и другой столбец (в вашем случае, столбец N
) для вставки времени. Макрос Worksheet_Change()
будет вызываться для всех обновлений электронных таблиц при каждом изменении ячейки, поэтому важно различать, какие столбцы вам нужны, поскольку подпрограмма также будет выполняться для любых обновлений столбцов, которые вас не интересуют.
Приведенный ниже пример кода должен легко адаптироваться. Он разработан с несколькими вариантами, которые вы можете удалить и адаптировать к вашей ситуации.
- Он предназначен для вставки даты, а не времени ... это легко изменить
- Он предназначен для запуска нескольких столбцов, а не только одного столбца
- Чтобы обеспечить гибкость при изменении структуры электронной таблицы или перемещении столбцов, она не жестко закодирована в конкретном столбце, то есть
K
или N
Описание пункта 3 в деталях:
- Код не опирается на жестко закодированные значения адресов столбцов
- Вместо этого он опирается на первую строку
MyRange = Range("1:1")
являющуюся строкой заголовка (которая также обычно выглядит хорошо)
- Как только строка заголовка определена (т. Е. Жестко закодирована как строка
1
), она находит заголовки столбцов, которые важны для запуска обновления.
- После того, как он находит эти заголовки столбцов, он проверяет, была ли измененная ячейка в одном из этих столбцов.
- Если ячейка была в одном из этих столбцов, то Дата вставляется
Эта настройка позволяет вам использовать помеченную строку заголовка в первой строке и перемещать столбцы позже по желанию (вставлять или удалять столбцы где угодно), при этом автоматическая вставка по-прежнему работает правильно, даже если интересующие вас ячейки больше не находятся на те же самые колонки K
или N
больше. Если вы не заботитесь об этом, конечно, вы можете просто оставить свою таблицу без заголовков, уберите WorksheetFunction.Match
кода и использование жестко закодированных адресов столбцов.
Чтобы использовать этот код, откройте редактор VBA - как правило, слева будет дерево, показывающее VBAProject (имя файла) с подпапкой для объектов Microsoft Excel, а затем подпункты для каждого из трех листов (по умолчанию на новая рабочая тетрадь), а также ThisWorkbook. Дважды щелкните на листе, на котором вы хотите, чтобы он работал, а затем вставьте нижеприведенную функцию Worksheet_Change()
чтобы вы могли использовать и редактировать ее для этого листа.
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