同じドキュメント内の他のVBAモジュールで公開したいVBA関数を作成していますが、UDF(ユーザー定義関数)として使用したくありません。
ただし、パブリックアクセス修飾子を使用すると、ワークブック内のセルから呼び出すことができるUDF数式として関数を使用することもできます。これは欲しくない。
この「VBAのみ」の動作を取得するのに役立つアクセス修飾子またはその他の方法はありますか?
敬具
同じドキュメント内の他のVBAモジュールで公開したいVBA関数を作成していますが、UDF(ユーザー定義関数)として使用したくありません。
ただし、パブリックアクセス修飾子を使用すると、ワークブック内のセルから呼び出すことができるUDF数式として関数を使用することもできます。これは欲しくない。
この「VBAのみ」の動作を取得するのに役立つアクセス修飾子またはその他の方法はありますか?
敬具
これを 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
Function
aを書く代わりに、aを書き、引数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
これらすべての欠点は、新しいコードがやや理解しにくいことです。
修飾子を使用するPrivate
と、関数が存在するモジュールでのみ実行を許可する必要があります。
"magic* 値が指定された場合にのみ関数の実行を許可するパラメーターを渡します。
例 -キーが#NAME!
何であるかがわからない場合、次のエラーが発生します。
Function VBAOnly(key As Long)
If key <> 12345 Then
VBAOnly = CVErr(xlErrName)
Exit Function
End If
VBAOnly = True
End Function