我有两个细胞," 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
尽管这两个部分看起来是互斥的,并且不能在同一个过程调用中引用,但每次我尝试进行更改时都会崩溃我的电子表格。显然我做错了!我被引导相信原始帖子,这不会导致循环引用。
我的猜测是我应该使用两个单独的程序来处理这个问题,或者基于此代码它是否完全不可能?
答案 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