・ VBA から LISP アプリケーションを実行する
VBA から LISP
アプリケーションを実行するには、SendCommand
メソッドを使います
但し、ActiveX
メソッドが使用可能なコマンドは発行してはいけません (forEX:
SendCommand "VBALOAD")
この場合は、代わりに LoadDVB メソッドを使用します
例1)
'***********************************************************************************************
'VBA から LISP アプリケーションを実行する
'(load "Jo_lay_off") (Jo_Lay_off) を実行
'Jo_lay_off.lsp
をサポートディレクトリにおいておく必要があります
'***********************************************************************************************
Sub Jo_cal_lisp()
ThisDrawing.SendCommand "(" & "load" & """Jo_lay_off""" & ")" & vbCr
ThisDrawing.SendCommand "(" & "Jo_lay_off" & ")" & vbCr
End Sub
例1の場合は、LISP
アプリケーションの実行はできますが、終了したかどうかはわかりません。
SendCommand で LISP
アプリケーションを実行した場合、通常、同期をとりますが、LISP
アプリケーションがユーザー入力を求めたりした場合、入力を始めると直ちに復帰し、非同期処理を続行します。
そこで、LISP
アプリケーションの終了を知るためには、例2のように、EndLISP
イベントを使用します。
例2)
'一般モジュールへの記述
'***********************************************************************************************
'VBA から LISP アプリケーションを実行する
'(load "Jo_lay_off") (Jo_Lay_off) を実行
'Jo_lay_off.lsp
をサポートディレクトリにおいておく必要があります
'***********************************************************************************************
Sub Jo_cal_lisp()
ThisDrawing.SendCommand "(" & "load" & """Jo_lay_off""" & ")" & vbCr
ThisDrawing.SendCommand "(" & "Jo_lay_off" & ")" & vbCr
End Sub
'ThisDrawing への記述
'***********************************************************************************************
'Document レベルでの EndLISP イベントハンドラ
'***********************************************************************************************
Private Sub AcadDocument_EndLISP()
MsgBox "LISP による処理完了!"
End Sub
しかし、例2では、メッセージが2回出てしまいます。それに、一回、図面に埋め込んでしまうと、別のLISPを動かしても、メッセージが表示されてしまいます。Document
レベルのイベントは、VBAプロジェクトのロードとともに、有効になってしまうためです。
そこで、例3のように、Application
レベルのイベントを利用して、必要なときだけ、イベントを有効にすることができます。
そのためには、クラスモジュールを作成して、AcadApplication
タイプのオブジェクトをイベントに宣言しなくてはなりません。
例3)
'一般モジュールへの記述
'***********************************************************************************************
'VBA から LISP アプリケーションを実行する
'(load "Jo_lay_off") (Jo_Lay_off) を実行
'Jo_lay_off.lsp
をサポートディレクトリにおいておく必要があります
'***********************************************************************************************
Dim X As New EventClassModule 'グローバルな変数としてクラスモジュールを宣言(ローカル変数だと、イベントハンドラから無効にできない)
Sub Jo_cal_lisp()
ThisDrawing.SendCommand "(" & "load" & """Jo_lay_off""" & ")" & vbCr
Set X.App = ThisDrawing.Application 'Application
レベルのイベントを有効
ThisDrawing.SendCommand "(" & "Jo_lay_off" & ")" & vbCr
End Sub
Sub unInitializeEvents() 'イベントハンドラから呼び出す
Set X.App = Nothing 'Application
レベルのイベントを無効
End Sub
'クラスモジュール(EventClassModule) への記述
'***********************************************************************************************
'Application レベルでの EndLISP イベントハンドラ
'***********************************************************************************************
Private
Sub App_EndLISP()
MsgBox "LISP による処理完了!"
Call unInitializeEvents 'Application
レベルのイベントを無効にするプロシージャーの呼び出し
End Sub
これを応用すれば、LISPの連続実行や、ファイルを開いて繰り返し実行することも可能になります