Я работаю над листом excel, в котором каждая строка должна указывать последний раз, когда изменилась любая ячейка в этой строке. Самый простой метод, который я нашел, чтобы сделать это, чтобы поставить некоторое небольшое количество VBA в коде рабочего листа, например, так:Excel VBA: SendKeys не работает на некоторых компьютерах
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If (Target.Row > 2) And (Cells(Target.Row, "A") <> "") Then
Cells(Target.Row, "N").Value = Date
End If
Application.EnableEvents = True
End Sub
Это позволит эффективно изменить дату в столбце «N» всякий раз, когда какой-либо другой элемент в эта строка редактируется. Большой! Решено, за исключением ...
Поскольку я меняю значение ячейки в коде, стек отмены сразу теряется, и, конечно же, это означает, что ЛЮБАЯ работа на этом листе не может быть отменена.
Итак, альтернативой этому является трюк, превосходящий мышление, я не редактировал ячейку. Этот код сохраняет стек отмены при изменении даты:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cursorLocation As Range
Application.EnableEvents = False
If Target.Row > 2 And Cells(Target.Row, "A") <> "" Then
Set cursorLocation = ActiveCell
Cells(Target.Row, "N").Select
SendKeys "^;~", True
cursorLocation.Select
End If
Application.EnableEvents = True
End Sub
В этом случае мы выбираем ячейку, использование SendKeys подделать редактирования клетки, и восстановить курсор на прежнее место. «^; ~» использует Excel «Ctrl +»; ярлык для ввода даты. Большой! Решено, за исключением ...
Этот код отлично работает на моей машине (Win7, Excel 2010), но не работает на компьютере сотрудника (Win8, Excel 2010, возможно, немного быстрее). На машине Win8 (не знаю, является ли это проблемой ОС, кстати), происходит то, что всякий раз, когда меняется ячейка, каждая ячейка сразу под этой ячейкой становится текущей датой, и, конечно, сохранение истории отмены не имеет смысла, поскольку выполнение Отмена немедленно активирует код рабочего листа и снова превращает все в даты.
Я сам понял, что то же самое произойдет на моей машине, если я удалю «Ожидание», присущее команде SendKeys. То есть, если я использую линию:
SendKeys "^;~", False
Итак, что я предполагаю, что по какой-либо причине, даже при использовании той же версии Excel, мой компьютер ждет SendKeys команда, чтобы закончить, но компьютера моего коллеги нет. Есть идеи?
В пользу кого-то пытается это, я изменил мой «Если», чтобы можно вручную изменить дату обратно: 'Если Target.Row> 2 и клетки (Target.Row,«А») <> "" И Target.Column <> 14' –