如何使VBA功能“仅限VBA”并将其禁用为UDF

时间:2012-06-22 12:11:53

标签: vba excel-vba excel-2007 user-defined-functions excel

我正在编写一个VBA函数,我想在同一文档中的其他VBA模块中公开使用,但是我不希望它作为UDF(用户定义的函数)提供。

如果我使用公共访问修饰符,但我的函数也可以作为UDF公式提供,可以从工作簿中的单元格调用。我不想要这个。

是否有访问修饰符或其他方式可以帮助我获得此“仅限VBA”的行为?

亲切的问候

6 个答案:

答案 0 :(得分:5)

如果在Excel中使用,将返回#VALUE错误。

Function VBAOnly() As Variant

    If TypeName(Application.Caller) <> "Range" Then
        VBAOnly = 1 'or some other return value
    Else
        VBAOnly = CVErr(xlErrValue)
    End If

End Function

答案 1 :(得分:4)

如果在出现该功能的模块中使用Option Private Module,该功能可以声明为Public并在VBA项目中的任何其他模块中使用,但不会被使用可由其他应用程序或项目访问,包括Excel本身。

答案 2 :(得分:0)

编写Function并通过Sub参数设置返回值,而不是编写ByRef。这样,您的函数将对Excel不可见(通过Alt F8或“开发人员”选项卡>宏除外),并且不会出现在Excel的智能中。

代替

Function Add(Num1 As Double, Num2 As Double)
    Add = Num1 + Num2
End Function

使用

Sub AddInvisible(ByRef Result As Double, Num1 As Double, Num2 As Double)
    Result = Num1 + Num2
End Sub

注意

  1. ByRef并不是绝对必要的(因为默认情况下VBA中通过引用提供了参数),但是它可以提醒我们Result带有返回值。
  2. 您将需要对代码进行必要的更改,例如:

    z = Add(x,y)

将成为

AddInvisible z,x,y

所有这些缺点的一面是,新代码很难理解。

答案 3 :(得分:0)

答案之间有些混乱,所以这里有一个更全面的解释:

从技术上... 如果输入精确的公式,则可以调用标准VBA模块中的所有功能。甚至Private Functions内的Private Modules中的公式

示例

Option Private Module
Private Function hiddenEverythingExample() As String
    hiddenEverythingExample= "NOPE!!!"
End Function

如果单元格中有=hiddenEverythingExample()

,仍会返回一个值

enter image description here

但是,我认为OP的目标是避免在Excel公式栏中填充itellisense。

完成此操作的最常用方法是为所有仅VBA的功能创建一个特定的模块,并将Option Private Module放入模块定义(功能上方的区域)。

enter image description here

这可确保该模块中的所有功能不会出现在itellisense中,但其他模块仍可与itellisense一起使用。

定义为Private Function也可以完成此操作,但是此功能仅适用于该模块,这可能是也可能不是要求。

请注意,YowE3K推断一个函数必须同时为Private Function AND Option Private Module,但是只有一个 OR 才有必要消除Itellisense。

答案 4 :(得分:-1)

传递一个参数,该参数只允许函数在给出“magic *值”时运行。

示例 - 除非您知道是什么,否则会出现错误#NAME!

Function VBAOnly(key As Long)

If key <> 12345 Then
    VBAOnly = CVErr(xlErrName)
    Exit Function
End If

VBAOnly = True

End Function

答案 5 :(得分:-1)

使用Private修饰符应该只允许在模块中执行该函数。