fc2ブログ

(元)社内SEの徒然なる日記

ExcelVBAで関数の戻値がDLLエラーになって受取れない

■ DLL呼出しエラー

Excelに入力したデータを使ってOracleのデータを登録 or 更新 するためのツールを作っていました。ツールって言っても、わざわざ外だしする理由もないので入力用のExcelVBAで処理を書いただけですけどね。

ところが、デバッグをしていると関数の値を受取る部分で「実行時エラー '49': DLL が正しく呼び出せません。」と謎のエラーが発生します。
VBA関数戻値のDLLエラー - 1

最初は、ロジックが悪いのかと試行錯誤したのですが、最小構成にまで削ってもエラーを突破できません。

呼出し元のソース
'処理対象範囲参照
Dim myRange As Range

'メーカコード(正数、必須、5BYTE固定)
Dim a As Integer
a = errorCheckFormat()


呼び出した関数(抜粋)
' 機能      : 書式エラーチェック共通処理
'
' 戻り値 : Integer型 エラーコード、0が正常
'
' 引き数 :
'
' 機能説明 : 指定された情報に基づいてエラーチェックを行う。
'

Public Function errorCheckFormat() As Integer

'--------------
' 終了処理
'--------------

normalEnd:
errorCheckFormat = 0
Exit Function
End Function


■ 対応

そもそも、今回は処理でDLLの呼出しなんて使っていません。それが何でDLLエラーなんて発生するのかと。

・・・これは、アレか。いつものアレか?

色々と実験して、動いたり、動かなかったりしたのですが、一番安定したのは対象のモジュールを解放(エクスポート)して、インポートする方法でした。

プロジェクトエクスプローラから問題の関数があるモジュールを右クリックして、表示されたメニューから「 *** の解放」をクリック。
VBA関数戻値のDLLエラー - 2

エクスポート確認に「はい」をクリック。
VBA関数戻値のDLLエラー - 3

保存(保存先は適当)。
VBA関数戻値のDLLエラー - 4

これでモジュールがエクスポートされた上で解放(削除)されました。続けて、エクスポートしたモジュールをインポートします。

「ファイル」メニューから「ファイルのインポート」をクリック。
VBA関数戻値のDLLエラー - 5

エクスポートしたファイルを選択して「開く」。
VBA関数戻値のDLLエラー - 6

■ 後書き

これで解決するって事は、VBAの関数の呼び出しと、DLLの呼出しは内部的には同じものって扱いなのかもしれません。ま、他の処理を呼び出すという意味では同じものですし、わからなくもないですね。

なお、解決後も何度か発生して、そのたびに同じ方法で復旧させていました。

・・・もしかして、私の作りが何か不味いんですかね。

投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end ---
スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する