如何摆脱 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)

一样使用