2

我对VBA知之甚少,并试图学习它。我制作了一个类似这样的 VBA 脚本:

Function doIt()
Dim c As int...
.............
.............
.............
c = callFunction
...............
..............
End Function

Function callFunction(byVal num As Int)
..........
..........
..........
End Function

如您所见, callFunction 是一个从主函数 doIt 调用的函数。假设 callFunction 计算一个整数的平方。整个 VBA 脚本保存在 C 驱动器中相应 AddIns 文件夹下的 addIn 模块中。从 Excel 工作表调用时,函数 doIt 运行良好。但问题是如果我从工作表中调用函数 callFunction 它也可以工作。如何将 callFunction 仅限于 addIn 模块,以便只有模块可以使用它,如果有人从工作表调用 callFunction(2) 它不会在工作表中给出 2 的平方?

注意:即使我成功了Private,它仍然可以从工作表中调用。

4

2 回答 2

1

使用Application.Caller属性,您可以确定谁调用了您的函数,如果它是从工作表中调用的,您可以引发错误或返回任何您想要但与您的计算结果不同的东西。

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

于 2013-05-08T09:57:16.127 回答
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

num ^ num如果在任何调用位置(间接使用)的任何 VBA 函数/子例程中使用,这两种解决方案都会给出结果。在 Excel 单元格中调用时会给出Error值(直接使用)。

于 2013-05-08T06:34:14.780 回答