Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 无法使工作表更改在VBA中工作_Excel_Vba - Fatal编程技术网

Excel 无法使工作表更改在VBA中工作

Excel 无法使工作表更改在VBA中工作,excel,vba,Excel,Vba,我已经阅读了许多以前类似的问题和答案,但仍然无法让我的代码正常工作 我想根据其他单元格的背景色计算一些单元格的和。特别地,仅当单元(x,z)的颜色是所选择的颜色(RGB(0,176,80))时,我才在和中包括单元(x,y) 第一个和是正确计算的,但是,当我修改F1:G100范围内的单元格时,会收到通知(“pd”),但目标单元格上不会发生任何更改 此代码位于我希望发生更改的工作表中 Private Sub Worksheet_Change(ByVal Target As Range) If Not

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

我想根据其他单元格的背景色计算一些单元格的和。特别地,仅当单元(x,z)的颜色是所选择的颜色(RGB(0,176,80))时,我才在和中包括单元(x,y)

第一个和是正确计算的,但是,当我修改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

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

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

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

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

您可以考虑将这些从单元格(或应用程序。在这种情况下同样坏的)更改为Target。Parth.Cype(在SUM1和SUM2中,也必须传递Target。父(或目标))。


(由于Sum1和Sum2是公共的,所以无法判断,因此如果您使用Sum1或Sum2作为UDF并在此处被调用,那么我会让UDF作为包装器,通过Application.ThisCell或其他方式恢复工作表,然后调用另一个执行该工作的函数(并且是私有的,因此不能被称为UDF)。)

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

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

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

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

您可以考虑将这些从单元格(或应用程序。在这种情况下同样坏的)更改为Target。Parth.Cype(在SUM1和SUM2中,也必须传递Target。父(或目标))。


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

对我有效,我想不出有什么理由不适合你。你试过单步检查你的代码吗?是的,谢谢,我仔细检查了一下,错误在其他地方,代码实际上是有效的。对我有效,我想没有理由它对你无效。你试过单步检查你的代码吗?是的,谢谢,我仔细检查了一下,错误在其他地方,代码实际上是有效的。