两个模块单独使用效果很好,但不能同时使用
我有一个两阶段的计划。Can#039;由于保密协议,我无法详细说明,因此我';我试着解释一下这里有AutoCAD 2005和AutoCAD 2009机器。Excel VBA程序I';ve WRITE启动AutoCAD并运行编辑图形的VLISP文件。在我的机器上效果很好
现在,将该过程移动到具有不同版本AutoCAD的用户。这取决于Excel程序启用的正确引用类型。适用于AutoCAD 2005 don#039;t与2009年合作,反之亦然。我想出了一种方法来确定机器上有哪个版本的AutoCAD,并加载正确的参考
所以我试着把这两部分放在一起,作为一个过程。设置参考,然后运行AutoCAD…不那么容易。我将代码的部分分为两个不同的模块。我可以运行设置引用的第一部分。然后我可以运行第二个部分,它完成AutoCAD的工作。所以我觉得很好,我将在第一个模块的末尾放置一个call语句,以调用第二个模块中的主函数。但是当我这样做的时候';就像第一部分中的所有代码一样,get#039;s跳过了。当我单步执行(F8)程序时,它直接跳转到第二部分中的Dim语句,因为引用不是';t启用后,它就在那里崩溃了  
好的,我拿出了任何能让我进入荷兰语的东西,这是我';我正在努力完成------- BEGIN MODULE 1------------------------------------------------------------------
Sub AddReference()
Dim strGUID1 As String, strGUID2 As String, theRef As Variant, i As Long
Dim ACADVersion As String
'************************************************************************
' OPEN TEXT FILE ON USERS' HOME DRIVE AND GET ACAD VERSION NUMBER
'************************************************************************
Open "H:\ACADVersion.txt" For Input As #1
Input #1, ACADVersion
Close #1
If ACADVersion = 2009 Then
strGUID1 = "{851A4561-F4EC-4631-9B0C-E7DC407512C9}" ' ACAD 2009
Else
strGUID1 = "{1EFD8E85-7F3B-48E6-9341-3C8B2F60136B}" ' ACAD 2005
End If
strGUID2 = "{FC0C6DFB-96E9-4520-B0D2-993650F89DD4}" ' COMMON
' 'Set to continue in case of error
On Error Resume Next
'Remove any missing references
For i = ThisWorkbook.VBProject.References.Count To 1 Step -1
Set theRef = ThisWorkbook.VBProject.References.Item(i)
If theRef.isbroken = True Then
ThisWorkbook.VBProject.References.Remove theRef
End If
Next i
'Clear any errors so that error trapping for GUID additions can be evaluated
Err.Clear
'Add the reference
ThisWorkbook.VBProject.References.AddFromGuid _
GUID:=strGUID1, Major:=1, Minor:=0
ThisWorkbook.VBProject.References.AddFromGuid _
GUID:=strGUID2, Major:=1, Minor:=0
'If an error was encountered, inform the user
Select Case Err.Number
Case Is = 32813
'Reference already in use.No action necessary
Case Is = vbNullString
'Reference added without issue
Case Else
'An unknown error was encountered, so alert the user
MsgBox "A problem was encountered trying to" & vbNewLine _
& "add or remove a reference in this file" & vbNewLine & "Please check the " _
& "references in your VBA project!", vbCritical + vbOKOnly, "Error!"
End Select
On Error GoTo 0
'Main
End Sub
------- END OF MODULE 1 ------------------------------------------------------------------
------- BEGIN MODULE 2------------------------------------------------------------------
Option Explicit
'' Require Reference to:
'' Tools--> References --> AutoCAD 2XXX Type Library
'' Tools--> References --> AutoCAD Focus Control for VBA Type Library
'' and also set options here:
'' Tools--> Options --> General --> Error Trapping -> check 'Break on Unhahdled Errors' button
Dim acApp As AcadApplication
Dim AcDocs As AcadDocuments
Dim acDoc As AcadDocument
Dim acSpace As AcadBlock
Dim acdCap As String, ExcCap As String, copyStr As String
Private Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long
Sub Main()
'************************************************************************
'* WRITE THE TEXT FILE IN THE USERS' HOME FOLDER
'************************************************************************
Dim ce As Range
Open "H:\tf.txt" For Output As #1
For Each ce In Worksheets("Sheet1").Range("D5:D6,K6,M6,D8,F12:F19,F21,F23:F27,F29:F30,F32:F33,F35,F38:F39,I17")
Write #1, ce.Value
Next ce
Close #1
'************************************************************************
'* OPEN AUTOCAD THEN OPEN THE DRAWING FILE, LOAD THE VLISP AND EXECUTE IT
'************************************************************************
Dim strDrawing As String
On Error Resume Next
Set acApp = GetObject(, "AutoCAD.Application")
If Err.Number0 Then
Err.Clear
Set acApp = CreateObject("AutoCAD.Application")
End If
On Error GoTo Err_Control
acApp.Visible = True
SetFocus acApp.hwnd
Application.WindowState = xlMinimized
acApp.WindowState = acMax
strDrawing = "C:\Path_to_Dwg.dwg"
Set acDoc = acApp.Documents.Open(strDrawing)
acDoc.Activate
Set acDoc = acApp.ActiveDocument
acDoc.SendCommand ("(load ""MyLisp.lsp"" ""The load failed"") doit" & Chr(13))
Err_Control:
End Sub
------- END OF MODULE 2 ------------------------------------------------------------------更新:;我现在明白了……我把模块2顶部的四个Dim语句移到了子主线的正下方,它';现在正在工作。如果任何人对此I 35; 039;我很感激。
快速回答但不是最佳解决方案,制作两个版本,一个引用2009 LIB,另一个引用2005 LIB ;装上正确的机器,然后从那里开始 ;使用VLisp确定您正在运行的Acad版本,然后加载正确的dvb文件 ;两个dvb文件中的宏名称可以相同 ;HTH公司 您可以在vlax产品密钥上使用vl字符串搜索来测试哪个版本,然后有条件地加载/运行正确的VBA模块
伪码:
(vl-load-com)
((lambda ( key )
(cond
((vl-string-search "R17.2" key)
;; (atof (getvar 'ACADVER)) 或(atoi (substr (ver) 13))
谢谢比尔-这里发布的任何方法都应该适合你
我不擅长VBA编码,因为我选择了学习Visual LISP,现在正在跳转到.NET开发。然而,如果我有限的理解是正确的,你实际上会产生两个独立的模块(不同的VBA项目?);每个AutoCAD版本一个。LISP将有条件地调用适当的模块版本;示例:
**这类似于我们对一些遗留VBA例程所做的操作,因为我们使用多个版本(VBA最初为2006年、2009年在内部编写)。LISP包含在菜单、工具栏和功能区CUI组件中,也可以通过命令行调用
不用担心;我们都从某个地方开始;
页:
[1]