問:?如何在AutoLISP調(diào)用完一個VBA宏后,卸載包含它的VBA工程?我想首先加載這個工程,調(diào)用一個宏,然后卸載它。下面是我使用的代碼,但是VBAUNLOAD在Test宏結(jié)束之前被發(fā)送到命令行。?
(command?"-VBARUN"?"Test")?
(command?"vbaunload")?
答:主要的問題是你的宏當中有要求用戶輸入的語句,這時LISP試圖執(zhí)行下一條命令,即VBAUNLOAD。我們需要等待LISP語句執(zhí)行完畢,或者讓LISP在調(diào)用VBARUN命令后什么也不做,而讓VBA卸載它自己。下面是這兩種方法:?
1)?在LISP中等待。?
(defun?c:RunMacro(?/?oldFileDia?oldCmdEcho)?
(setq?oldFileDia?(getvar?"FILEDIA")?
oldCmdEcho?(getvar?"CMDECHO")?
)?
(setvar?"FILEDIA"?0)?
(setvar?"CMDECHO"?0)?
(command?"_VBALOAD"?"c:\\test.dvb")?
(command?"_-VBARUN"?"Test")?
(while?(=?"-VBARUN"?(getvar?"CMDNAMES"))?
(command?pause)?
)?
(command?"_VBAUNLOAD")?
(setvar?"FILEDIA"?oldFileDia)?
(setvar?"CMDECHO"?oldCmdEcho)?
(princ)?
)?
2)?VBA中自動卸載。?
你可以使VBA代碼強制卸載它自己。在你的宏的最后(例如:UserForm_Terminate()),使用下列代碼可以達到此目的:?
AppActivate?ThisDrawing.Application.Caption?
SendKeys?"_VBAUNLOAD"?+?Chr$(13)?
以上的代碼在AutoCAD?R14.01中工作良好,但是AutoCAD?2000允許加載多個工程。相應(yīng)地,VBAUNLOAD增加了一個額外參數(shù)。有兩個新的函數(shù)可以加載和運行VBA?代碼:(vl-vbaload)和(vl-vbarun)。你可以通過在宏名中指定工程名字把這兩種操作聯(lián)合在一起。?
(defun?c:RunMacro2000(?/?oldFileDia?oldCmdEcho)?
(setq?oldFileDia?(getvar?"FILEDIA")?
oldCmdEcho?(getvar?"CMDECHO")?
)?
(setvar?"FILEDIA"?0)?
(setvar?"CMDECHO"?0)?
(vl-vbarun?"c:\\test.dvb!Test")?
(while?(=?"-VBARUN"?(getvar?"CMDNAMES"))?
(command?pause)?
)?
(command?"VBAUNLOAD"?"c:\\test.dvb")?
(setvar?"FILEDIA"?oldFileDia)?
(setvar?"CMDECHO"?oldCmdEcho)?
(princ)?
)?
第二種方法也需要做一些小的改動。我們可以通過自動接口向AutoCAD發(fā)送命令,并且這比SendKeys更安全:?
ThisDrawing.SendCommand?"_VBAUNLOAD?C:\TEST.DVB"?+?Chr$(13)?
如果我們卸載另一個工程,我們可以使用自動接口?(ThisDrawing.Application.UnloadDVB?"test.dvb"?)。但是在這種情況下我們需要使用SendKeys或SendCommand來卸載其本身。