我认为您不能阻止允许在 VBA 和 Excel 单元格中访问它的函数功能。
但是,我有一些解决方法的想法,它允许您创建在 Cell 中调用时给出不同结果的函数,例如可以返回一些信息(或标准错误)而不是计算结果。
这是呈现此功能的代码。我认为这非常清楚易懂,因此您不需要额外的评论。
Function callFunction(ByVal num As Integer)
On Error Resume Next
Dim tmpAdd
tmpAdd = Application.ThisCell.Address
If Err.Number = 0 Then
If Left(Application.ThisCell.Formula, 13) = "=callFunction" Then
'called from excel cell, but this function is called!
'returns any type of standard function error
callFunction = CVErr(XlCVError.xlErrNull)
Exit Function
End If
End If
'called from VBA/IDE environment or from other function
'standard calculation
callFunction = num ^ num
End Function
编辑受@DanielDusek 答案的启发(但有点不完整)我将丹尼尔和我的解决方案混合在一起。因此,新的且相当完整的代码:
Function callFunction(ByVal num As Integer)
If TypeName(Application.Caller) = "Range" Then
If Left(Application.ThisCell.Formula, 13) = "=callFunction" Then
'called from excel cell, but this function is called!
'returns any type of standard function error
callFunction = CVErr(XlCVError.xlErrNull)
Exit Function
End If
End If
'called from VBA/IDE environment or from other function
'standard calculation
callFunction = num ^ num
End Function
num ^ num
如果在任何调用位置(间接使用)的任何 VBA 函数/子例程中使用,这两种解决方案都会给出结果。在 Excel 单元格中调用时会给出Error
值(直接使用)。