Обновление с Excel 2003 до 2007 приводит к «ошибке переполнения стека» на ранее работающей vba - PullRequest
0 голосов
/ 08 декабря 2008

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

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

Ответы [ 2 ]

2 голосов
/ 08 декабря 2008

Переполнение стека почти наверняка происходит из-за рекурсии. Не уверен, почему вы не получаете переполнение стека в 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 голосов
/ 08 декабря 2008

Ваш метод вызывается всякий раз, когда ЛЮБАЯ ячейка на листе изменяется. Ваш блок "NO" изменяет содержимое целевых ячеек, что вызывает повторный вызов метода.

Опции:

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

    Если Target.Address <> "$ E $ 28", то выйти из Sub

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...