Помогите найти ошибку

Программирование на Visual Basic for Applications
Sandra_83
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 11.10.2006 (Ср) 15:32

Помогите найти ошибку

Сообщение Sandra_83 » 27.10.2006 (Пт) 17:58

У меня есть проверка столбца с суммами (ColInd) не неотрицательное значение. Если я стираю значение в ячейке, влияющей на сумму, то столбец ColInd обнуляется автоматически. А значение ячейки Cell(3,3) куда идет результат проверки только после нажатия Enter.

Подскажите как нужно исправить, чтобы все обновлялось сразу и одновременно.
На Worksheet_Change поставить нельзя, все подвисает.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim I As Integer
Dim RowInd As Integer
Dim ColInd As Integer

RowInd = 11
ColInd = 11

On Error Resume Next

For I = RowInd To Range("LstRow2").Row
'ThisWorkbook.ActiveSheet.Unprotect (pass)
If Cells(RowInd, ColInd).Value >= 0 Then
Cells(3, 3).Value = "OK"
RowInd = RowInd + 1
Else
Cells(3, 3).Value = "ERROR"
End If
Next

'ThisWorkbook.ActiveSheet.Unprotect (pass)

End Sub

Genyaa
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 17.10.2006 (Вт) 13:46

Re: Помогите найти ошибку

Сообщение Genyaa » 27.10.2006 (Пт) 20:33

Sandra_83 писал(а):На Worksheet_Change поставить нельзя, все подвисает.

Мне кажется, ошибка именно здесь.

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

Но чтобы этого зацикливания не было, нужно в обработчике события Change анализировать Target и в случае, если изменение происходит "не там" (в столбце ColInd или в Cell(3,3)), то ничего происходить не должно и процедура должна завершаться "в холостую".

А SelectionChange именно так и работает, что событие обрабатывается только после изменения положения курсора на листе (точнее - после изменения выделения... курсор - это частный случай выделения - выделена одна текущая ячейка).
Всякое решение плодит новые проблемы.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Re: Помогите найти ошибку

Сообщение KL » 27.10.2006 (Пт) 23:12

Sandra_83 писал(а):На Worksheet_Change поставить нельзя, все подвисает.


Чепуха :-) Поставь вначале процедуры Application.EnableEvents=False, а в конце соотв-но Application.EnableEvents=True.

Sandra_83 писал(а):'ThisWorkbook.ActiveSheet.Unprotect (pass)
...
'ThisWorkbook.ActiveSheet.Unprotect (pass)

Не знаю, заметила ли ты (судя по тому, что комманды закомментированы возможно, что да), что код для события Workbook_Open, который я тебе предложил в другой теме:

Sheets("Лист1").Protect Password:= pass, UserInterfaceOnly:= True

защищает лист таким образом, что на многие макросы эта защита не распространяется. А значит, не нужно запароливать и распароливать лист для изменения значений ячеек.

Эта процедура должна повторяться каждый раз при открытии книги, т.к. параметр UserInterfaceOnly не сохраняется при закрытии файла.
Привет,
KL


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 91

    TopList  
cron