Excel VBA, код на листе не работает

У меня есть следующий код в листе1 (обратите внимание: этот код находится в объекте рабочего листа, а не в объекте рабочей книги или модуле):

Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Integer
r = ActiveCell.Row
Cells(r - 1, 7).Value = Now()
ActiveWorkbook.save
End Sub

Может кто-нибудь сказать мне, почему: 1. ActiveWorkbook.save не работает выше - вместо этого он застревает в бесконечном цикле; 2. почему я не могу выполнить код, просто нажав F8

Я попытался поместить ActiveWorkbook.save в отдельный модуль, а затем вызвать эту функцию из кода на листе, но это также застряло в бесконечном цикле.


person user1894469    schedule 14.12.2012    source источник
comment
Обновляя рабочий лист, вы снова запускаете событие изменения и так далее, чтобы создать бесконечный цикл. Вам необходимо отключить события с помощью Application.EnableEvents = False непосредственно перед обновлением, а затем снова включить события.   -  person Tim Williams    schedule 14.12.2012
comment
Бесконечный цикл ;-) +1 @TimWilliams   -  person bonCodigo    schedule 14.12.2012
comment
Спасибо за быстрый ответ, если я поставлю Application.EnableEvents = False прямо перед Cells(r - 1, 7).Value = Now(), тогда Cells(r - 1, 7).Value = Now() не работает. Я не получаю бесконечный цикл, если я вынимаю ActiveWorkbook.save, поэтому эта строка инициирует событие изменения (составляет ли сохранение файла событие изменения)   -  person user1894469    schedule 14.12.2012
comment
Есть ли в вашем коде какая-либо другая обработка событий? Возможно, вы непреднамеренно отключили обработку событий во время работы над своим кодом (настройка является постоянной), поэтому попробуйте запустить Application.EnableEvents = True на панели Immediate в VBE. Или поместите точку останова в свой код, чтобы вы могли быть уверены, что он действительно срабатывает.   -  person Tim Williams    schedule 14.12.2012
comment
Итак, у меня работает application.enableevents = true, но я вернулся к Square1. теперь у меня есть application.enableevents = false прямо над ActiveWorkbook.save, а затем у меня есть application.enableevents = false сразу после него, но я все еще зацикливаюсь. Кроме того, я нахожу удивительным то, что если я просто уберу строку ActiveWorkbook.save из моего кода выше, он будет работать нормально, не застрянет в цикле, хотя логически я должен ожидать этого, потому что как только Cells(r - 1, 7).Value = Now() выполняется, он должен вызвать событие изменения. но работает нормально.   -  person user1894469    schedule 15.12.2012
comment
Кстати, я использую 2003, просто решил упомянуть   -  person user1894469    schedule 15.12.2012
comment
переключатель события должен охватывать обновление ячейки, а не Save .   -  person Tim Williams    schedule 15.12.2012


Ответы (2)


Вам нужно отключить события, чтобы избежать бесконечного цикла

Private Sub Worksheet_Change(ByVal Target As Range)
application.enableevents=false
    Cells(target.row - 1, 7).Value = Now()
application.enableevents=true

ActiveWorkbook.save
End Sub
person nutsch    schedule 14.12.2012
comment
Я скопировал и вставил ваш код точно так, как указано, я не получаю бесконечный цикл, но затем Cells(target.row - 1, 7).Value = Now() не работает - person user1894469; 14.12.2012

Бесконечный цикл возникает из-за того, что когда вы обновляете ячейку текущей датой, это вызывает событие изменения рабочего листа, которое снова вызывает код события. Вам необходимо отключить события, как показано ниже:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim r As Integer
r = ActiveCell.Row

Application.EnableEvents = False    
Cells(r - 1, 7).Value = Now()    
Application.EnableEvents = True    
ActiveWorkbook.Save

End Sub
person InContext    schedule 14.12.2012
comment
Здравствуйте, я открыл новую книгу, скопировал ваш код точно в объект листа 1 и запустил его. Он больше не застревает в петле, но и ничего не делает. На самом деле, если я сделаю перерыв в коде, эта подпрограмма больше не будет вызываться. Есть идеи? Я ценю вашу помощь. - person user1894469; 15.12.2012
comment
@user1894469 user1894469, если вы частично сломали этот код, возможно, вы отключили Events и не включили их повторно. в окне Immediate VBE введите Application.EnableEvents = True и повторите попытку кода. - person brettdj; 15.12.2012