我正在编写一个VBA函数,我想在同一文档中的其他VBA模块中公开使用,但是我不希望它作为UDF(用户定义的函数)提供。
如果我使用公共访问修饰符,但我的函数也可以作为UDF公式提供,可以从工作簿中的单元格调用。我不想要这个。
是否有访问修饰符或其他方式可以帮助我获得此“仅限VBA”的行为?
亲切的问候
答案 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
注意
ByRef
并不是绝对必要的(因为默认情况下VBA中通过引用提供了参数),但是它可以提醒我们Result
带有返回值。您将需要对代码进行必要的更改,例如:
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()
但是,我认为OP的目标是避免在Excel公式栏中填充itellisense。
完成此操作的最常用方法是为所有仅VBA的功能创建一个特定的模块,并将Option Private Module
放入模块定义(功能上方的区域)。
这可确保该模块中的所有功能不会出现在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
修饰符应该只允许在模块中执行该函数。