无法使Worksheet_change在VBA中工作

时间:2012-12-10 19:25:32

标签: excel vba

我已经阅读了许多以前类似的问题和答案,仍然无法让我的代码工作。

我想根据其他一些细胞的背景颜色计算一些细胞的总和。特别是,只有当单元格(x,z)的颜色是选定的颜色(RGB(0,176,80))时,才在总和中包含一个单元格(x,y)。

正确计算FIRST总和,但是,当我修改F1:G100范围内的单元格时,我会收到通知(“pd”),但目标单元格上没有发生任何变化。

此代码位于工作表中,我希望更改发生。

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheet.Range("F1:G100")) Is Nothing Then
    Cells(11, 14).Value = Sum1()
    Cells(12, 14).Value = Sum2()
    MsgBox "pd"
End If
End Sub
'-----------------------------------------------------------------------
Public Function Sum1() As Double
Dim N As Long
Sum1 = 0

For N = 4 To 100
    colorBackground = Cells(N, 2).Interior.Color
    If colorBackground = RGB(0, 176, 80) Then
        Sum1= Sum1+ Cells(N, 6).Value
    End If
Next N      
End Function
'-----------------------------------------------------------------------
Public Function Sum2() As Double
Dim N As Long
Sum2 = 0

For N = 4 To 100
    colorBackground = Cells(N, 2).Interior.Color
    If colorBackground = RGB(0, 176, 80) Then
        Sum2= Sum2+ Cells(N, 7).Value
    End If
Next N 
End Function

1 个答案:

答案 0 :(得分:1)

这可能与问题无关,但是,我会告诉你我在上面的代码中不喜欢的是使用Cell的裸(或不合格)。根据Excel对象模型的定义:

  

Cells:返回一个Range对象,表示该对象上的所有单元格    有效工作表 。 (如果活动文档不是工作表,请执行此操作   财产失败。)

因此,可能发生的情况是,当工作表不是活动工作表时发生更改,然后事件处理程序以“单元格”运行,指的是可能不是预期工作表的内容。

虽然很难想象如果用户没有工作表是活动的,如何直接完成更改,当然VBA代码可能会导致非活动工作表发生更改,这确实会触发(非活动工作表的)Worksheet_Change事件处理程序,不改变当前活动工作表的概念。

您可以考虑将这些从Cell(或Application.Cells,在此上下文中同样糟糕)更改为Target.Parent.Cells(在Sum1和Sum2中,您还必须传递它们Target.Parent(或Target) )。

(由于Sum1和Sum2是公共的,所以无法分辨,所以如果你使用Sum1或Sum2作为UDF以及在这里调用,那么我将使UDF成为一个通过Application恢复工作表的包装器.ThisCell或者其他什么,然后调用另一个执行工作的函数(并且是私有的,因此不能被称为UDF)。)