当Microsoft更改单元格时,Excel Worksheet_Change不起作用

时间:2012-10-05 22:37:48

标签: excel vba ms-office

我正在尝试完成我的一个项目,我现在有一个Form Control,当按下时会增加一个数字的值,另一个按钮会减去该值。

另一个值有两个不同的按钮用于相同的事情,但该值也取决于第一个值,而不仅仅是按钮修改该值。我尝试实现此代码进行验证

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheet.Range("F19")) Is Nothing Then
 If Range("E19") = 2 And Range("F19") < 12 Then
  Range("E20") = 1
 End If
End If
End Sub

但Excel显然无法识别当按钮引起更改时单元格F19已更改,仅当它是由用户输入引起时。所以,这就是说,如果F19更新且19为2且F19小于12(E12为2的先决条件为F19为12或更大),则将E20设置为1(E20是E19的修饰符,也是进入它的其他修饰符)。此方法适用于非按钮控制的其他值,但是如何在“表单控件”按钮更改值时(或者至少在按下表单控件时监视),可以获得excel。

编辑:如果单元格按公式更改,则宏实际上不起作用。我认为我不能使用Worksheet_Calculate监视特定单元格中的更改。

2 个答案:

答案 0 :(得分:1)

为什么要用代码执行此操作?你可以让Cell E20有一个类似于=IF(AND(E19=2,F19<12),1,"")的公式,除非符合条件,否则会使单元格为空。

如果你真的想用代码来做,你应该考虑到这一点:Worksheet_Change event“当用户或外部链接更改工作表上的单元格时发生。”

我会建议而不是

If Range("E19") = 2 And Range("F19") < 12 Then
    Range("E20") = 1
End If

在Worksheet_Change事件中,您将其作为单独的子项添加,您可以从Worksheet_Change调用它。在执行按钮执行的任何操作后,您还可以从按钮的代码中调用sub。这样,你就可以保证支票运行,不要试图依赖事件。

答案 1 :(得分:0)

Daniel是正确的,Worksheet_Change“当用户或外部链接更改工作表上的单元格时发生。”但是此包含由VBA引起的更改,并且通过公式排除更改。

您的问题可能由您的范围的唯一部分资格造成(或至少加剧):

Range("E19")会引用活动表单上的“E19” ,这可能是也可能不是Target张。你用Target.Worksheet.Range("F19")

做对了

尝试(请注意.

With Target.Worksheet
    If Not Intersect(Target, .Range("F19")) Is Nothing Then
        If .Range("E19") = 2 And .Range("F19") < 12 Then
            .Range("E20") = 1
        End If
    End If
End With

顺便说一句。我和丹尼尔在一起,你的整个解决方案似乎有些偏离,但我们可能无法全面了解......