如何摆脱 VBA 动态范围内的循环引用?
How do I get rid of a circular reference in a VBA dynamic range?
我正在尝试创建一个用户定义的 Excel 函数,该函数部分地计算放置公式的单元格上方的所有非空白单元格(技术上来自定义第一个单元格的特定单元格范围内的单元格)。我遇到的麻烦是向下复制公式会导致循环引用。我不希望其他用户遇到这个问题。如何避免循环引用?
我一直在尝试解决问题:
Set CellOne = Range(“A10”)
Set CellTwo = Range(Selection.Address).Offset(-1, 0)
Set MyRange = Application.Range(Cell1:=CellOne.Address, Cell2:=CellTwo.Address)
CountNonBlanks = Application.WorksheetFunction.CountA(MyRange)
这段代码也造成了向下复制时的循环引用:
Set CellTwo = Range(ActiveCell.Address).Offset(-1, 0)
问题似乎是由引用相对于选定或活动的单元格引起的。我只希望 MyRange 在放置公式的上方结束一个单元格,而不管哪个单元格处于活动状态或被选中。
FWIW,用户定义公式的最终目的是 return 字母表中的下一个字母,无论公式放置在前一个字母下方多少行。这个本机函数有效,但我希望有一个更优雅的 appearing 解决方案:
=MID("abcdefghijklmnopqrstuvwxyz",COUNTA(A:A10)+1,1)
谢谢。
您不应该在工作表的 udf 中使用 Selection 或 Activecell,因为它们在不断变化。将范围引用传递到 udf 或使用 application.caller 将包含 udf 的单元格引用为范围对象。
如果您发布了整个 udf 或至少是声明,我可以编辑此回复以提供更具体的帮助。这是一个例子。
Public Function nextLetter()
'since no reference is passed in, you might want to make this volatile
Application.Volatile
With Application.Caller.Parent
nextLetter = Chr(97 + Application.CountA(.Range(.Cells(10, "A"), _
.Cells(Application.Caller.Row - 1, "A"))))
End With
End Function
传入起始单元格的替代方法。
Public Function nextLetter2(startRng As Range)
'since only a single cell reference is passed in, you might want to make this volatile
Application.Volatile
With Application.Caller.Parent
nextLetter2 = Chr(97 + Application.CountA(.Range(startRng, _
.Cells(Application.Caller.Row-1, startRng.Column))))
End With
End Function
像=nextLetter2(A)
一样使用
我正在尝试创建一个用户定义的 Excel 函数,该函数部分地计算放置公式的单元格上方的所有非空白单元格(技术上来自定义第一个单元格的特定单元格范围内的单元格)。我遇到的麻烦是向下复制公式会导致循环引用。我不希望其他用户遇到这个问题。如何避免循环引用?
我一直在尝试解决问题:
Set CellOne = Range(“A10”)
Set CellTwo = Range(Selection.Address).Offset(-1, 0)
Set MyRange = Application.Range(Cell1:=CellOne.Address, Cell2:=CellTwo.Address)
CountNonBlanks = Application.WorksheetFunction.CountA(MyRange)
这段代码也造成了向下复制时的循环引用:
Set CellTwo = Range(ActiveCell.Address).Offset(-1, 0)
问题似乎是由引用相对于选定或活动的单元格引起的。我只希望 MyRange 在放置公式的上方结束一个单元格,而不管哪个单元格处于活动状态或被选中。
FWIW,用户定义公式的最终目的是 return 字母表中的下一个字母,无论公式放置在前一个字母下方多少行。这个本机函数有效,但我希望有一个更优雅的 appearing 解决方案:
=MID("abcdefghijklmnopqrstuvwxyz",COUNTA(A:A10)+1,1)
谢谢。
您不应该在工作表的 udf 中使用 Selection 或 Activecell,因为它们在不断变化。将范围引用传递到 udf 或使用 application.caller 将包含 udf 的单元格引用为范围对象。
如果您发布了整个 udf 或至少是声明,我可以编辑此回复以提供更具体的帮助。这是一个例子。
Public Function nextLetter()
'since no reference is passed in, you might want to make this volatile
Application.Volatile
With Application.Caller.Parent
nextLetter = Chr(97 + Application.CountA(.Range(.Cells(10, "A"), _
.Cells(Application.Caller.Row - 1, "A"))))
End With
End Function
传入起始单元格的替代方法。
Public Function nextLetter2(startRng As Range)
'since only a single cell reference is passed in, you might want to make this volatile
Application.Volatile
With Application.Caller.Parent
nextLetter2 = Chr(97 + Application.CountA(.Range(startRng, _
.Cells(Application.Caller.Row-1, startRng.Column))))
End With
End Function
像=nextLetter2(A)