创建一个在单元格值更改时执行的宏(不是由用户执行)

时间:2013-08-20 01:51:58

标签: excel excel-vba excel-2007 vba

好的我有一个工作表“目标0”,有一些范围,做一些计算,如......

(在A1中)

=SUM(G2:G68)*I17

然后,如果我添加/修改62-G68中的任何值,则会自动计算单元格(数字主要为负数且有些可能)。

目标是:根据范围的总和,找到I17的值,其中A1的结果等于或大于0.(从0开始,将其递增1,不需要小数)

手动我可以添加更改i17直到达到目标。我怎么想自动制作它,所以如果G2到G68范围内的值改变它重新计算I17的值,直到(A1计算得到的值等于或大于0)但如果已经高或等于0那么什么都不做。

希望我能解释清楚

编辑:现在我创建了这段代码......

Function IncreaseTheValue()
    If Range("A1") < 0 Then
        Range("I17").Value = 0

        Do While Range("A1").Value < 0
            Range("I17").Value = Range("I17").Value + 1
        Loop
    End If
End Function

并且工作完美,当我做出一个chage时它怎么也不会开火。我该怎么做......

我尝试在A2细胞中添加它,但没有效果......

=IF(A1 < 0, IncreaseTheValue(), "")

此致

1 个答案:

答案 0 :(得分:1)

你不应该真的这样做Function;如你所知,它是不充分的,但也不适当使用Function,其中Sub或事件处理程序更合适。

根据您的要求,将代码放在Worksheet_Change事件处理程序中。您需要对其进行微调,以便仅在G2:G68范围内进行更改时才会触发。

试试这个(未经测试):

Private Sub Worksheet_Change(ByVal Target as Range)
Application.EnableEvents = False
If Not Intersect(Target, Range("G2:G68")) Is Nothing Then
    If Range("A1") < 0 Then
        Range("I17").Value = 0
        Do While Range("A1").Value < 0
            Range("I17").Value = Range("I17").Value + 1
        Loop
    End If
End If
Application.EnableEvents = True
End Sub
每个核桃评论

更新。以下此方法将在任何单元格更改时触发宏 - 这可能是过度的,或者如果G2:G68是基于对其他单元格的更改而更改的公式,则可能是必要的。这两种方法都可以进行微调,以更好地满足您的确切需求。

Private Sub Worksheet_Change(ByVal Target as Range)
Application.EnableEvents = False
    If Range("A1") < 0 Then
        Range("I17").Value = 0
        Do While Range("A1").Value < 0
            Range("I17").Value = Range("I17").Value + 1
        Loop
    End If
Application.EnableEvents = True
End Sub