Aquí podría ser tu PUBLICIDAD


Actualizar de Excel 2003 a 2007 da como resultado un "error de desbordamiento de pila" en vba que funcionaba anteriormente

votos
0

El siguiente código VBA funciona muy bien en Excel 2003, pero da como resultado un error de desbordamiento de pila en Excel 2007. El código es necesario para desbloquear o bloquear ciertas celdas según una selección de menú desplegable. Necesito poder ejecutar el código tanto en Excel 2003 como en 2007. Por favor, ayuda.

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
Publicado el 08/12/2008 a las 18:13
fuente por usuario
En otros idiomas...        العربية       

2 respuestas

votos
2

El desbordamiento de la pila casi seguramente proviene de la recursión. No estoy seguro de por qué no está recibiendo un desbordamiento de pila en Excel 2003; quizás se esté produciendo un error antes de que la pila se desborde.

Puede proteger contra la recursión infinita algo como lo siguiente:

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
Respondida el 08/12/2008 a las 06:28
fuente por usuario Joe


Aquí podría ser tu PUBLICIDAD


votos
0

Su método se invoca cuando CUALQUIER celda en la hoja de trabajo cambia. Su bloque "NO" cambia el contenido de las celdas objetivo, lo que hace que el método sea llamado nuevamente.

Opciones:

  1. Usa una variable de bandera como sugirió Joe, para ver si ya estás ejecutando
  2. Pruebe el valor "Objetivo" para ver si es E28, si ese es el cambio de celda que desea capturar. Algo como

    Si Target.Address <> "$ E $ 28" Then Exit Sub

Respondida el 08/12/2008 a las 07:20
fuente por usuario GalacticCowboy