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

希望你能帮上忙。 在这一点上,我的头靠在墙上。 写VBA相当新颖。 我有一些下面列出的VBA代码。 本质上,我想要做的是locking/解锁,更改填充颜色,并设置基于从下拉菜单使用工作表更改事件和ActiveSheet的input的单元格范围的公式。 代码位于工作表本身上。 一切工作正常,除了公式设置片。

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崩溃。 如果我把它评论出来,它会毫无问题地发生。 任何帮助将不胜感激。 请让我知道,如果这不够具体或没有意义,我会尽我所能扩大。

正如我张贴在我的评论中,你是在一个永无止境的循环,因为你在工作表更改事件中更改您的工作表。 您需要跟踪更改电话。 可以通过创build一个variables来缓解这种情况,以便跟踪您何时调用这个变化,这也是假设名称范围是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 

如果您只需在调用例程时执行SUM,则可以使用Worksheet.Sum function

 Application.WorksheetFunction.Sum(Range("$D$22:$D$25")) 

如果您确实需要该单元格中的公式,请考虑使用FormulaR1C1 function

 .Range("Inc_06PCTotRev").FormulaR1C1 = "=SUM(...)" 

在Excel下查找FormulaR1C1有助于更好地理解R1C1引用语法。 如果要插入公式的单元格为$D$26 ,则应将“…”replace为“R [-4] C:R [-1] C”。 如果公式应该在单元格$ E $ 20中,则可以用“R [2] C [-1]:R [5] C [-1]”replace上面的“…”。

R [#]引用目标范围/单元的行数,C [#]引用目标范围/单元的#列。