我正在尝试创建一个用户定义的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,用户定义公式的最终目的是返回字母表中的下一个字母,而不管公式放置在前一个字母下面多少行。这个原生函数可以工作,但我希望有一个更优雅的解决方案:
=MID("abcdefghijklmnopqrstuvwxyz",COUNTA(A$10:A10)+1,1)
谢谢。
发布于 2018-06-25 06:30:43
您不应该在工作表的udf中使用Selection或Activecell,因为它们是不断变化的。将range引用传递到udf中,或使用application.caller将包含该udf的单元格引用为range对象。
如果您发布了整个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$10)
一样使用
https://stackoverflow.com/questions/51014429
复制相似问题