链接两个单元格,以便反映其中任何一个的编辑

时间:2015-10-23 09:20:48

标签: excel vba excel-vba

我有两个细胞," R3"和#34; S3",在同一个Excel工作表中,"数据",我想要链接,以便手动输入任何一个用一个校正因子反映到另一个。循环引用阻止使用公式。我在这里搜索并找到了这个VBA片段:

Private Sub Worksheet_Change(ByVal target As Range)
    If target.Address = "$R$3" Then
        ActiveWorkbook.Worksheets("Data").Range("$S$3").Value = target.Value*2.55
    End If
End Sub

最初的意思是在不同的纸张上链接两个单元格,在我自己的情况下,单元格在同一张纸上。这非常适合进入一个并且仅在一个方向上看到另一个方向的变化。我还可以使用ElseIf添加其他单元格对。但是,如果我将它扩展为包含双引用,如R3-> S3和S3-> R3,就像这样:

Private Sub Worksheet_Change(ByVal target As Range)
    If target.Address = "$R$3" Then
        ActiveWorkbook.Worksheets("Data").Range("$S$3").Value = target.Value*2.55
    Else If target.Address = "$S$3" Then
        ActiveWorkbook.Worksheets("Data").Range("$R$3").Value = target.Value/2.55
    End If
End Sub

尽管这两个部分看起来是互斥的,并且不能在同一个过程调用中引用,但每次我尝试进行更改时都会崩溃我的电子表格。显然我做错了!我被引导相信原始帖子,这不会导致循环引用。

我的猜测是我应该使用两个单独的程序来处理这个问题,或者基于此代码它是否完全不可能?

2 个答案:

答案 0 :(得分:1)

您正在使用更改模块创建无限循环。通过更新一个,它使用另一个单元格触发事件

将您的更改事件更新为:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Or Target.Address = "$B$1" Then
        Call cellUpdate(Target.Address)
    End If
End Sub

然后在模块放置:

Sub cellUpdate(Target As String)
Application.EnableEvents = False
    With ActiveWorkbook.Worksheets("Data")
        If Target = "$R$3" Then
            .Range("$S$3").Value = .Range(Target) * 2.55
        ElseIf Target = "$S$3" Then
            .Range("$R$3").Value = .Range(Target) / 2.55
        End If
    End With
Application.EnableEvents = True
End Sub

通过将其分解为单独的模块并控制单独模块中的Application.EnableEvents,您可以停止无限循环。

答案 1 :(得分:-1)

您缺少一个End If

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Address = "$R$3" Then
    ActiveWorkbook.Worksheets("Data").Range("$S$3").Value = Target.Value * 2.55
Else
    If Target.Address = "$S$3" Then
    ActiveWorkbook.Worksheets("Data").Range("$R$3").Value = Target.Value / 2.55
    End If
End If
End Sub