2015-12-10 82 views
2

希望你能帮上忙。在这一点上,我的头靠在墙上。写VBA相当新颖。我有一些下面列出的VBA代码。基本上,我试图做的是锁定/解锁,更改填充颜色,并根据使用工作表更改事件和ActiveSheet的下拉菜单中的输入设置一组单元格的公式。代码位于工作表本身。一切工作正常,除了公式设置片。Excel VBA设置使用范围属性命名单元格公式

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 

当被包括我收到错误消息“的方法对象的_Worksheet范围失败”和excel崩溃。如果我将它评论出来,它会毫无问题地发生。任何帮助将不胜感激。请让我知道,如果这不够具体或没有意义,我会尽我所能扩大。

+2

是命名范围工作簿或工作表名为范围? –

+1

每次添加该公式时,都会再次调用工作表更改事件。我猜你是在一个永恒的循环中结束 – Sorceri

+0

名称范围代表什么,IE什么是实际范围? – Sorceri

回答

1

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

走开了一段时间,但该死的。非常感谢。感觉有点愚蠢。完全理解此时的碰撞部分。之前更新了代码中的单元属性,完全错过了那些没有生成永久循环的单元,因为它们没有改变单元内容。真的很感激它。 – Kbrodie

+0

说得过早。这实际上并没有最终为我工作,因为公式部分实际上是为多个单元设置的,而不仅仅是一个。然而,最终得到的代码工作。将Application.EnableEvents = False添加到开头,将Application.EnableEvents = True添加到结尾以及将错误值设置为true时的错误处理程序。现在完美运作。 – Kbrodie

0

如果你只需要执行SUM当你的程序被调用,您可以使用Worksheet.Sum function

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

如果你确实需要在该单元格的公式,可以考虑使用FormulaR1C1 function

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

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

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

相关问题