2008-12-08 4 views
0

Следующий код VBA отлично работает в Excel 2003, но приводит к ошибке Ошибка стека в Excel 2007. Код требуется либо разблокировать или заблокировать определенные ячейки на основе выпадающего меню. Мне нужно иметь возможность запускать код как в Excel 2003, так и в 2007 году. Пожалуйста, помогите.Обновление от Excel 2003 до 2007 приводит к «ошибке переполнения стека» на ранее работающей vba

Private Sub Worksheet_Change(ByVal Target As Range) 
    If [E28] = "NO" Then 
    ActiveSheet.Unprotect ("PASSWORD") 
    [K47:K53].Locked = False 
    [K47:K53].Interior.ColorIndex = 16 
    [K47:K53].ClearContents 
    ActiveSheet.Protect ("PASSWORD") 
    Else 
    ActiveSheet.Unprotect ("PASSWORD") 
    [K47:K53].Interior.ColorIndex = 0 
    'Next line is optional, remove preceding apostrophe if protection should stay on. 
    ActiveSheet.Protect ("PASSWORD") 
    End If 
End Sub 
+0

идеального типа вопроса для этого сайта! – 2009-02-25 15:41:59

ответ

2

Переполнение стека почти наверняка происходит из рекурсии. Не знаете, почему вы не получаете переполнение стека в Excel 2003 - возможно, ошибка возникает перед переполнением стека.

Вы можете защитить от бесконечной рекурсии что-то вроде следующего:

Private m_bInChange As Boolean 

Private Sub Worksheet_Change(ByVal Target As Range) 
If m_bInChange Then Exit Sub 
On Error GoTo ErrHandler 
    m_bInChange = True 
    If [E28] = "NO" Then 
     ActiveSheet.Unprotect ("PASSWORD") 
     [K47:K53].Locked = False 
     [K47:K53].Interior.ColorIndex = 16 
     [K47:K53].ClearContents 
     ActiveSheet.Protect ("PASSWORD") 
    Else 
     ActiveSheet.Unprotect ("PASSWORD") 
     [K47:K53].Interior.ColorIndex = 0 
     'Next line is optional, remove preceding apostrophe if protection should stay on. 
     ActiveSheet.Protect ("PASSWORD") 
    End If 

    m_bInChange = False 
    Exit Sub 
ErrHandler: 
    m_bInChange = False 
    Exit Sub 
End Sub 
0

Ваш метод вызывается всякий раз, когда любая клетка в изменении рабочего листа. Ваш блок «НЕТ» изменяет содержимое целевых ячеек, что вызывает повторный вызов метода.

Варианты:

  1. Используйте переменную флаг, как предложил Джо, чтобы увидеть, если вы уже выполняется
  2. проверить значение «Target», чтобы увидеть, если это E28, если это изменение клеток вы хочу захватить. Что-то вроде

    Если Target.Address <> "$ E $ 28" Then Exit Sub

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

  • Нет связанных вопросов^_^