vba - Excel VBA设置命名单元格公式使用范围属性

标签 vba excel range formula

希望你能帮忙。这时我的头撞在墙上。编写 VBA 相当新。我在下面列出了一些 VBA 代码。本质上,我要做的是锁定/解锁,更改填充颜色,并使用工作表更改事件和 ActiveSheet 根据下拉菜单中的输入为一系列单元格设置公式。代码存在于工作表本身上。除了公式设置部分外,一切正常。

Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveSheet
.Unprotect Password:="somepw"
    If Range("d17").Value = "Yes" Then
        .Range("D22:D78").Locked = False
        .Range("D22:D78").Interior.Color = RGB(115, 246, 42)
        .Range("Inc_06PCTotRev").Formula = "=SUM($D$22:$D$25)"
    ElseIf WorksheetFunction.CountA(Range("d22:D78")) <> 0 Then
        If .Range("D22").Locked = True Then
            With Range("D22:D78")
                .Locked = False
                .ClearContents
                .Interior.Color = RGB(217, 217, 217)
            End With
        Else:  .Range("D22:D78").ClearContents
        End If
    Else: .Range("D22:D78").Interior.Color = RGB(217, 217, 217)
          .Range("D22:D78").Locked = True
    End If
.Protect Password:="somepw"
End With
End Sub

当包括在内时,我收到一条错误消息,指出“对象_工作表的方法范围失败”并且 excel 崩溃。如果我将其注释掉,它就会毫无问题地触发。任何帮助将不胜感激。如果这不够具体或没有意义,请告诉我,我会尽力扩展。

最佳答案

正如我在评论中发布的那样,您处于一个永无止境的循环中,因为您在工作表更改事件中更改了工作表。您需要跟踪更改调用。可以通过创建一个变量来跟踪您何时调用更改来缓解这种情况,这也是假设名称范围是 1 个单元格。

Public bRunning As Boolean 'keeps track of when we are making the change

Private Sub Worksheet_Activate()
    bRunning = False 'set to false when the sheet is activated
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If bRunning = False Then 'check to see if this is the first change
    bRunning = True 'set the variable letting us know we are making the change.
    With ActiveSheet

    .Unprotect Password:="somepw"
        If Range("d17").Value = "Yes" Then
        .Range("D22:D78").Locked = False
        .Range("D22:D78").Interior.Color = RGB(115, 246, 42)
        .Range("Inc_06PCTotRev").Formula = "=SUM($D$22:$D$25)"
        ElseIf WorksheetFunction.CountA(Range("d22:D78")) <> 0 Then
        If .Range("D22").Locked = True Then
            With Range("D22:D78")
            .Locked = False
            .ClearContents
            .Interior.Color = RGB(217, 217, 217)
            End With
        Else:  .Range("D22:D78").ClearContents
        End If
        Else: .Range("D22:D78").Interior.Color = RGB(217, 217, 217)
          .Range("D22:D78").Locked = True
        End If
    .Protect Password:="somepw"
    End With
    Else
    bRunning = False 'reset the variable as we are done making changes
    End If
End Sub

关于vba - Excel VBA设置命名单元格公式使用范围属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34212669/

相关文章:

Excel VBA 宏来抓取网页。无法编码以单击 html 按钮

VBA Excel 使用表名检查特定表是否存在

integer - 操作数的类型无效 "+"Ada 95

ios - 创建具有初始时间和结束时间的时间范围

VBA:基于列标题的偏移量

excel - 范围和变量范围之间的差异

vba - Worksheet.Paste 和 Range.PasteSpecial 之间的区别

excel - 如何检查Excel-VBA中某些工作表是否存在?

python - 使用 xlsxwriter 模块将列表中的数据写入 Excel 工作表中的列

excel - 将每个单元格的名称设置为其内容/值