1

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

我想根据其他一些单元格的背景颜色计算一些单元格的总和。特别是,仅当单元格 (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
4

1 回答 1

1

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

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

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

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

您可能会考虑将这些从 Cells(或 Application.Cells,在这种情况下同样糟糕)改为 Target.Parent.Cells(在 Sum1 和 Sum2 中,您必须将它们传递给 Target.Parent(或 Target))。

(由于 Sum1 和 Sum2 是公开的,因此无法判断,因此如果您使用 Sum1 或 Sum2 作为 UDF 并在此处被调用,那么我会让 UDF 成为通过 Application.ThisCell 恢复工作表的包装器或一些东西,然后调用另一个完成工作的函数(并且是私有的,因此不能称为 UDF)。)

于 2012-12-10T23:06:21.107 回答