我有一个两阶段程序在工作。由于保密协议,无法详细说明,因此我将尝试解释breifly。
这个地方有AutoCAD 2005和AutoCAD 2009机器。我编写的Excel VBA程序启动AutoCAD并运行一个编辑绘图的VLISP文件。在我的机器上工作得很好。
现在将该过程移动到具有不同AutoCAD验证的用户。这取决于Excel程序启用的正确参考类型。AutoCAD 2005的那些不适用于2009,反之亦然。我想出了一种方法来确定机器上有哪个版本的AutoCAD并加载正确的引用。
所以我尝试将这两个部分放在一起作为一个进程工作。设置引用,然后运行AutoCAD...不太容易。我将代码部分拆分为两个不同的模块。我可以运行设置引用的第一部分。然后我可以运行执行AutoCAD工作的第二部分。所以我认为很棒,我会在第一个模块的末尾放置一个调用语句来调用第二个模块中的main函数。但是当我这样做的时候,就像第一部分中的所有代码都被跳过了。当我一步通过(F8)程序时,它会直接跳转到第二部分中的Dim语句,由于没有启用引用,它就在那里崩溃了。
好的,我取出了任何可以让我进入荷兰语的东西,这是我试图完成的内容的组合
- ------- 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.Number 0 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语句移动到Sub Main行的正下方,它现在正在工作。如果有人对此有其他建议,我将不胜感激。
本帖以下内容被隐藏保护;需要你回复后,才能看到! 游客,如果您要查看本帖隐藏内容请 回复 |