2008-12-08 16 views
0

Le code VBA suivant fonctionne très bien dans Excel 2003, mais génère une erreur de dépassement de pile dans Excel 2007. Le code est requis pour déverrouiller ou verrouiller certaines cellules en fonction d'une sélection de menu déroulant. Je dois être en mesure d'exécuter le code dans Excel 2003 et 2007. S'il vous plaît aider.La mise à niveau d'Excel 2003 vers 2007 entraîne une erreur de débordement de pile sur le vba précédemment utilisé

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

Parfait genre de question pour ce site! –

Répondre

2

Le dépassement de pile provient presque certainement de la récursivité. Vous ne savez pas pourquoi vous n'obtenez pas de débordement de pile dans Excel 2003 - une erreur est peut-être déclenchée avant que la pile ne déborde.

Vous pouvez protéger contre quelque chose de récursion infinie comme ce qui suit:

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

Votre méthode est appelée chaque fois qu'une cellule dans les changements de feuille de calcul. Votre bloc "NO" change le contenu des cellules cibles, ce qui provoque l'appel de la méthode.

Options:

  1. Utilisez une variable de marquer comme Joe a suggéré, pour voir si vous vous exécutiez déjà
  2. test la valeur « cible » pour voir si elle est E28, si c'est le changement de cellule que vous vouloir capturer. Quelque chose comme

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