2014-10-28 7 views
6

Я работаю над листом 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 команда, чтобы закончить, но компьютера моего коллеги нет. Есть идеи?

+1

В пользу кого-то пытается это, я изменил мой «Если», чтобы можно вручную изменить дату обратно: 'Если Target.Row> 2 и клетки (Target.Row,«А») <> "" И Target.Column <> 14' –

ответ

5

Вы правы. Это дает эту проблему в Excel 2010/Win8.

Попробуйте это. Используйте специальный код Wait, который я написал. (Проверено в Excel 2010/Win8)

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 "^;~" 
     Wait 1 '<~~ Wait for 1 Second 
     cursorLocation.Select 
    End If 
    Application.EnableEvents = True 
End Sub 

Private Sub Wait(ByVal nSec As Long) 
    nSec = nSec + Timer 
    While nSec > Timer 
     DoEvents 
    Wend 
End Sub 

enter image description here

Альтернативное

Doevents Использование также имеет желаемый эффект.

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 "^;~" 
     DoEvents 
     cursorLocation.Select 
    End If 
    Application.EnableEvents = True 
End Sub 
+0

Ну, это работает точно, но 1 секунда кажется ужасным долго ждать в вычислительных терминах. Есть ли более быстрый таймер, который я могу использовать? –

+0

См. «Альтернатива», которую я дал :) Возможно, вам придется обновить страницу. –

+0

Ничего, DoEvents, похоже, минимизирует задержку. –

Смежные вопросы