今回は、Accessのクエリ等を実行した際に、
「式に未定義関数 ‘xxx’ があります。」とエラーメッセージが出て処理できない場合があります。
このエラーには原因が複数パターン想定されるため、それぞれの対処方法を紹介します。
エラー原因
原因は複数パターンありますが、ざっくり言うと
システムがモジュール内に関数内で使用していないのに使っていると判断しているためです。
以下の通り、うっかりミスからややこしいものもあるため
対処するには一つ一つ順に見ていきましょう。
(上から順に可能性の高いパターンです)
- 関数を定義していない、又は誤った関数名を使用している場合
- 関数名とモジュール名が同じ場合
- ライブラリが参照不可になっている場合
- 関数の宣言でPrivateを使っている場合
- 関数名に2バイト文字が使用されている場合
- モジュールが破損している場合
対処方法
以下の正常な状態を一部変更し、エラーパターンを作成していきます。
クエリでの関数呼び出し:「挨拶: CallHello()」
モジュール名:「こんにちは」
関数名:「CallHello()」
Function CallHello() As String
CallHello = "Hello World"
End Function
関数を定義していない、又は誤った関数名を使用している場合
勘違いで呼び出す関数を定義していない、又は誤った関数名を使用している場合、
呼び出すことができずエラーになります。
例えば、
Function CallHello() As String と宣言しているのに、
CallHallo()で呼び出している場合等
調べるには、一度クエリから呼び出している関数名で、Visual Basic画面にて
プロジェクト内のコード内を検索(ショートカットキー:「Ctrl+F」)してみましょう。
もしなければ、誤っていますのでクエリを変更してください。
関数名とモジュール名が同じ場合
関数名とモジュール名が同じ場合、システム上名称が被ってしまいエラーとなります。
例えば、
Function CallHello() As String と宣言しており、
モジュール名もCallHelloになっている場合等
この場合、関数名又はモジュール名を変更してください。
ライブラリが参照不可になっている場合
ライブラリが参照不可になっており、
ライブラリ内の関数を使用していた場合、エラーとなります。
パソコンの交換やOS・Officeのバージョンアップでエラーが上がるようになった場合は、
このケースの可能性があります。
この場合、Visual Basic画面にてツールタブから参照設定を開き、参照不可がある場合は、
参照をあらためて追加するか、関数を自前で作成する等やり方を変える必要があります。
関数の宣言でPrivateを使っている場合
関数の宣言でPrivateを使っている場合、
モジュール内からしか呼び出すことができないため、エラーとなります。
Privateはアクセス修飾子と呼ばれ、他にPublic等があります。
以下の通りアクセス修飾子によって参照できる範囲(スコープ)が限られており、
・Private Function:モジュール内のみ参照可
・Public Function:モジュール外から参照可
・Function:暗黙的にPublicとなるため、モジュール外から参照可
となります。
なので、例えば、
Private Function CallHello() As String と宣言している場合は、
Function CallHello() As String 又は
Public Function CallHello() As String
に変更する必要があります。
関数名に2バイト文字が使用されている場合
関数名に日本語等の2バイト文字が使用されている場合、
VBA上はコンパイルできても対応してはいないので、クエリから呼び出すとエラーとなります。
なので、例えば、
Function 挨拶する() As String と宣言している場合は、
Function CallHello() As String
に変更する必要があります。
(クエリからの呼び出し側も同様に、CallHello()へ変更)
モジュールが破損している場合
モジュールが破損している場合、呼び出せずエラーとなります。
この場合は、新しくモジュールを作成し、ソースコードをコピーして作り直す必要があります。