我很少了解VBA并试图学习它。我制作了一个类似这样的VBA脚本:
Function doIt()
Dim c As int...
.............
.............
.............
c = callFunction
...............
..............
End Function
Function callFunction(byVal num As Int)
..........
..........
..........
End Function
你可以看到callFunction是一个从main函数doIt调用的函数。假设callFunction计算一个整数的平方。整个VBA脚本保存在C驱动器中相应AddIns文件夹下的addIn模块中。从excel工作表调用时,该函数运行良好。但问题是如果我从工作表中调用函数callFunction它也可以工作。如何将callFunction仅限制为addIn模块,以便只有模块可以使用它,如果有人从工作表调用callFunction(2),它将不会在工作表中给出2的平方?
注意:即使我将其设为Private
,仍然可以从工作表中调用它。
答案 0 :(得分:1)
我认为你不能阻止允许在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
如果在任何VBA函数/子例程中使用,无论哪个调用位置(间接使用),两个解决方案都将给出num ^ num
结果。在Excel单元格中调用时,它将给出Error
值(直接使用)。
答案 1 :(得分:1)
使用 Application.Caller 属性,您可以确定谁调用了您的函数,以及是否从工作表调用它可以引发错误或返回您想要的但与您的propper计算结果不同。
Private Function callFunction(ByVal num As Integer) As Variant
If (TypeName(Application.Caller) = "Range") Then
' function was called from worksheet
callFunction = "Invalid procedure call" ' or raise error Err.Raise Number:=5
Exit Function
End If
' continue ...
callFunction = num * num
End Function
关于Application.Caller:http://msdn.microsoft.com/en-us/library/office/ff193687.aspx