无法使Worksheet_change在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 

这可能与这个问题没有任何关系,但是,在上面的代码中,我会告诉你,我不喜欢使用Cells的裸体(或非限定性)。 通过定义Excel对象模型:

单元格:返回一个Range对象,表示活动工作表上的所有单元格。 (如果活动文档不是工作表,则此属性失败。)

所以,可能发生的情况是当表单不是活动表单时发生更改,然后事件处理程序以“单元格”引用可能不是目标表单的方式运行。

虽然很难想象如何在用户没有工作表的情况下直接完成更改,但是VBA代码肯定会导致非活动工作表上的更改,而这会触发(非活动工作表的)Worksheet_Change事件处理程序,而不会改变活动工作表的当前概念。

你可能会考虑改变这些从单元格(或Application.Cells,在这种情况下同样不好),而不是Target.Parent.Cells(在Sum1和Sum2也,你必须通过Target.Parent(或目标))。

(不能说,因为Sum1和Sum2是公开的,所以如果你使用Sum1或Sum2作为UDF的,以及在这里被调用,那么我会有UDF是一个包装,恢复工作表,通过Application.ThisCell或然后调用另一个执行这个工作的函数(并且是私有的,所以不能称为UDF)。)