0

次の 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
4

2 に答える 2

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
于 2008-12-08T17:28:26.547 に答える
0

ワークシート内のセルが変更されるたびに、メソッドが呼び出されます。「NO」ブロックはターゲット セルの内容を変更するため、メソッドが再度呼び出されます。

オプション:

  1. ジョーが提案したようにフラグ変数を使用して、すでに実行しているかどうかを確認します
  2. 「ターゲット」値をテストして、それが E28 であるかどうか、それがキャプチャするセルの変更であるかどうかを確認します。何かのようなもの

    If Target.Address <> "$E$28" Then Sub を終了

于 2008-12-08T18:20:57.937 に答える