Target.Address循环引用

时间:2015-11-16 04:46:36

标签: excel vba excel-vba

我正在尝试设置一个输入表,用户可以输入每平方英尺的租金或年租金,当输入一个时,另一个解决了。下面是我创建的宏。它不起作用(我理解为什么它不是)因为它导致循环引用。我也尝试了两个单独的if语句(没有OR),而不是嵌套if / OR和if else。所以,基本上,如果触发了一个目标地址,我不希望宏在另一个上运行(并创建循环引用)。任何建议将不胜感激。

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = Range("Current_Rent").Address Or Target.Address = Range("CurrentRentperSqFt").Address Then
        If Target.Address = Range("Current_Rent").Address Then
            Range("CurrentRentperSqFt").Value = "=IF(ISERROR(Current_Rent/SqFt),"""",Current_Rent/SqFt)"
        Else
            Range("Current_Rent").Value = "=IF(ISERROR(CurrentRentperSqFt*SqFt),"""",CurrentRentperSqFt*SqFt)"
        End If

    End If

End Sub

1 个答案:

答案 0 :(得分:0)

您正在使用Worksheet_Change事件宏更改其中一个单元格。这会触发另一个事件,并且Worksheet_Change尝试使用新的Target在其自身上运行。您需要禁用事件,以便您可以在不触发其他事件的情况下进行更改。

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = Range("Current_Rent").Address Or Target.Address = Range("CurrentRentperSqFt").Address Then
        On Error GoTo bm_Safe_Exit
        Application.EnableEvents = False
        If Target.Address = Range("Current_Rent").Address Then
            Target.Formula = "=IFERROR(CurrentRentperSqFt*SqFt,"""")"
        Else
            Target.Formula = "=IFERROR(Current_Rent/SqFt,"""")"
        End If

    End If
bm_Safe_Exit:
    Application.EnableEvents = True
End Sub

我还修改了你的公式以使用较新的IFERROR¹ function,避免重复运行等式以检查错误,然后再次运行它以产生结果。

¹ {2007}引入了IFERROR¹ function。它在早期版本中不可用。