Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Excel 2003升级到2007,结果为;堆栈溢出错误“;关于以前工作的vba_Vba_Excel 2007_Locking_Cells - Fatal编程技术网

从Excel 2003升级到2007,结果为;堆栈溢出错误“;关于以前工作的vba

从Excel 2003升级到2007,结果为;堆栈溢出错误“;关于以前工作的vba,vba,excel-2007,locking,cells,Vba,Excel 2007,Locking,Cells,以下VBA代码在Excel2003中运行良好,但在Excel2007中会导致堆栈溢出错误。根据下拉菜单选择,解锁或锁定某些单元格需要该代码。我需要能够在Excel2003和2007中运行代码。请帮忙 Private Sub Worksheet_Change(ByVal Target As Range) If [E28] = "NO" Then ActiveSheet.Unprotect ("PASSWORD") [K47:K53].Locked = False

以下VBA代码在Excel2003中运行良好,但在Excel2007中会导致堆栈溢出错误。根据下拉菜单选择,解锁或锁定某些单元格需要该代码。我需要能够在Excel2003和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

堆栈溢出几乎肯定来自递归。不确定为什么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

只要工作表中的任何单元格发生更改,就会调用您的方法。“否”块更改目标单元格的内容,从而导致再次调用该方法

选项:

  • 按照Joe的建议使用一个标志变量,看看您是否已经在执行
  • 测试“Target”值,看看它是否是E28,这是否是您想要捕获的单元格更改。差不多

    如果目标地址为“$E$28”,则退出Sub


  • 这个网站的完美问题!