自动触发公式时,如何更改Worksheet_Change代码以更改单元格的值

时间:2018-07-12 19:20:30

标签: excel vba formula

My Excel Sheet Example

我的工作表的目的是将客户信息输入到所需的单元格中,例如我上面发布的图像。每一天,DateCounter列都会增加一。

DateCounter公式:=IFERROR(IF(ISBLANK(B3),"",TODAY()-B3),"")(今天的日期-B3创建行的日期=自创建行以来已经过了几天。)

在自动将其增加一之后,我希望Interest列自动更新并使其等于自身+该行的Per Diem。 (示例:[{I3利息= I3利息+ H3(每笔交易)。

我有一个完全可以执行此操作的VBA代码,但仅在手动更改DateCounter单元格时有效,而在公式自动触发时无效。

VBA代码:

'*If "day" range is changed, update Interest cell*'

Private Sub Worksheet_Change(ByVal target As Range)

    If Not Intersect(target, Range("N3:N400")) Is Nothing Then

        Range("I" & target.Row).Value = Range("I" & target.Row).Value + Range("H" & target.Row)

        'Change Interest cell to the accounting format
        Range("I" & target.Row).NumberFormat = "_($* #,##0.00_);_($* (#,##0.00);_($* ""-""??_);_(@_)"
    End If
End Sub

我试图将代码更改为Worksheet_Calculate() event,但是它触发了列中的每一行,并且由于无限循环,我的excel工作表崩溃了。我尝试了示例 [here] 。我还尝试了其他示例,但是我对VBA的了解有限,而且似乎无法完成此任务。

1 个答案:

答案 0 :(得分:1)

公式更改不会触发Worksheet_Change。您需要Worksheet_Calculate和一个静态变量。

Option Explicit

Private Sub Worksheet_Calculate()
    Static tday As Long

    If Date <> tday Then
        tday = Date
        'suspend calculation so you don't run on top of yourself
         application.calculation = xlcalculationmanual

        'do all the update work here
        range(cells(2, "H"), cells(rows.count, "H").end(xlup)).copy
        cells(2, "I").pastespecial Paste:=xlPasteValues, Operation:=xlAdd


        'resume automatic calculation
         application.calculation = xlcalculationautomatic
    End If
End Sub