我正在编写一个VBA函数,希望它可以在同一文档中的其他VBA模块中公开使用,但我不希望它作为用户定义函数(UDF)的形式出现。
如果我使用公共访问修饰符,则我的函数也会作为可以从工作簿中的单元格调用的UDF公式提供。我不想让它这样。
是否有访问修饰符或其他方式可以帮助我实现这种“仅限VBA”的行为呢?
此致敬礼
如果我使用公共访问修饰符,则我的函数也会作为可以从工作簿中的单元格调用的UDF公式提供。我不想让它这样。
是否有访问修饰符或其他方式可以帮助我实现这种“仅限VBA”的行为呢?
此致敬礼
如果你在该函数所在的模块中使用了 Option Private Module
,则该函数可以被声明为 Public
并可以在VBA项目中的任何其他模块中使用,但无法被其他应用程序或项目访问,包括Excel本身。
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
有些答案存在一些混淆,因此这里提供一个更全面的解释:
从技术上讲... 如果输入确切的公式,可以调用标准VBA模块中的所有函数。甚至是私有模块内的私有函数
的公式也是如此。
例如
Option Private Module
Private Function hiddenEverythingExample() As String
hiddenEverythingExample= "NOPE!!!"
End Function
如果单元格具有=hiddenEverythingExample()
,仍将返回一个值。
Option Private Module
放在模块定义(函数上方的区域)中。
这样可以确保此模块中的所有函数不会出现在 IntelliSense 中,但仍可与其他模块一起访问。Private Function
也可以实现此目的,但是该函数仅适用于该模块,具体情况可能有所不同。Private Function
和Option Private Module
,但只需其中之一即可消除 IntelliSense。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
如下所示:
Sub DemoAddInvisible()
Dim Num1 As Double
Dim Num2 As Double
Dim Result As Double 'Result initialises to 0
Num1 = 1
Num2 = 2
AddInvisible Result, Num1, Num2
MsgBox Result ' See that Result has become 3
End Sub
Result
,你如何调用 AddInVisible 宏? 可以展示一个完整的例子吗? - pgSystemTester传递一个参数,只允许函数在给定一个特定的“魔法”值时运行。
例如 - 除非你知道这个“键”的内容,否则将会出现错误#名称!
:
Function VBAOnly(key As Long)
If key <> 12345 Then
VBAOnly = CVErr(xlErrName)
Exit Function
End If
VBAOnly = True
End Function
使用Private
修饰符应该只允许在函数所在的模块中执行。