乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 55|回复: 3

两个模块单独工作很好,但不能一起工作

[复制链接]

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2012-1-19 16:04:49 | 显示全部楼层 |阅读模式
我有一个两阶段程序在工作。由于保密协议,无法详细说明,因此我将尝试解释breifly。
这个地方有AutoCAD 2005和AutoCAD 2009机器。我编写的Excel VBA程序启动AutoCAD并运行一个编辑绘图的VLISP文件。在我的机器上工作得很好。
现在将该过程移动到具有不同AutoCAD验证的用户。这取决于Excel程序启用的正确参考类型。AutoCAD 2005的那些不适用于2009,反之亦然。我想出了一种方法来确定机器上有哪个版本的AutoCAD并加载正确的引用。
所以我尝试将这两个部分放在一起作为一个进程工作。设置引用,然后运行AutoCAD...不太容易。我将代码部分拆分为两个不同的模块。我可以运行设置引用的第一部分。然后我可以运行执行AutoCAD工作的第二部分。所以我认为很棒,我会在第一个模块的末尾放置一个调用语句来调用第二个模块中的main函数。但是当我这样做的时候,就像第一部分中的所有代码都被跳过了。当我一步通过(F8)程序时,它会直接跳转到第二部分中的Dim语句,由于没有启用引用,它就在那里崩溃了。
好的,我取出了任何可以让我进入荷兰语的东西,这是我试图完成的内容的组合
  1. ------- BEGIN MODULE 1  ------------------------------------------------------------------
  2. Sub AddReference()
  3.     Dim strGUID1 As String, strGUID2 As String, theRef As Variant, i As Long
  4.     Dim ACADVersion As String
  5.    
  6. '************************************************************************
  7. ' OPEN TEXT FILE ON USERS' HOME DRIVE AND GET ACAD VERSION NUMBER
  8. '************************************************************************
  9. Open "H:\ACADVersion.txt" For Input As #1
  10. Input #1, ACADVersion
  11. Close #1
  12. If ACADVersion = 2009 Then
  13.    strGUID1 = "{851A4561-F4EC-4631-9B0C-E7DC407512C9}" ' ACAD 2009
  14.    Else
  15.    strGUID1 = "{1EFD8E85-7F3B-48E6-9341-3C8B2F60136B}" ' ACAD 2005
  16. End If
  17.    strGUID2 = "{FC0C6DFB-96E9-4520-B0D2-993650F89DD4}" ' COMMON
  18.      
  19. '    'Set to continue in case of error
  20.     On Error Resume Next
  21.      
  22.      'Remove any missing references
  23.     For i = ThisWorkbook.VBProject.References.Count To 1 Step -1
  24.         Set theRef = ThisWorkbook.VBProject.References.Item(i)
  25.         If theRef.isbroken = True Then
  26.             ThisWorkbook.VBProject.References.Remove theRef
  27.         End If
  28.     Next i
  29.      
  30.      'Clear any errors so that error trapping for GUID additions can be evaluated
  31.     Err.Clear
  32.      
  33.      'Add the reference
  34.     ThisWorkbook.VBProject.References.AddFromGuid _
  35.     GUID:=strGUID1, Major:=1, Minor:=0
  36.    
  37.     ThisWorkbook.VBProject.References.AddFromGuid _
  38.     GUID:=strGUID2, Major:=1, Minor:=0
  39.      
  40.      'If an error was encountered, inform the user
  41.     Select Case Err.Number
  42.     Case Is = 32813
  43.          'Reference already in use.  No action necessary
  44.     Case Is = vbNullString
  45.          'Reference added without issue
  46.     Case Else
  47.          'An unknown error was encountered, so alert the user
  48.         MsgBox "A problem was encountered trying to" & vbNewLine _
  49.         & "add or remove a reference in this file" & vbNewLine & "Please check the " _
  50.         & "references in your VBA project!", vbCritical + vbOKOnly, "Error!"
  51.     End Select
  52.     On Error GoTo 0
  53. 'Main
  54. End Sub
  55. ------- END OF MODULE 1 ------------------------------------------------------------------
  56. ------- BEGIN MODULE 2  ------------------------------------------------------------------
  57. Option Explicit
  58. '' Require Reference to:
  59. '' Tools--> References --> AutoCAD 2XXX Type Library
  60. '' Tools--> References --> AutoCAD Focus Control for VBA Type Library
  61. '' and also set options here:
  62. '' Tools--> Options --> General --> Error Trapping -> check 'Break on Unhahdled Errors' button
  63. Dim acApp As AcadApplication
  64. Dim AcDocs As AcadDocuments
  65. Dim acDoc As AcadDocument
  66. Dim acSpace As AcadBlock
  67. Dim acdCap As String, ExcCap As String, copyStr As String
  68. Private Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long
  69. Sub Main()
  70. '************************************************************************
  71. '*   WRITE THE TEXT FILE IN THE USERS' HOME FOLDER
  72. '************************************************************************
  73. Dim ce As Range
  74. Open "H:\tf.txt" For Output As #1
  75. 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")
  76.     Write #1, ce.Value
  77. Next ce
  78. Close #1
  79. '************************************************************************
  80. '* OPEN AUTOCAD THEN OPEN THE DRAWING FILE, LOAD THE VLISP AND EXECUTE IT
  81. '************************************************************************
  82. Dim strDrawing As String
  83.     On Error Resume Next
  84.     Set acApp = GetObject(, "AutoCAD.Application")
  85.     If Err.Number  0 Then
  86.         Err.Clear
  87.         Set acApp = CreateObject("AutoCAD.Application")
  88.     End If
  89.     On Error GoTo Err_Control
  90.     acApp.Visible = True
  91. SetFocus acApp.hwnd
  92. Application.WindowState = xlMinimized
  93. acApp.WindowState = acMax
  94. strDrawing = "C:\Path_to_Dwg.dwg"
  95. Set acDoc = acApp.Documents.Open(strDrawing)
  96. acDoc.Activate
  97. Set acDoc = acApp.ActiveDocument
  98. acDoc.SendCommand ("(load ""MyLisp.lsp"" ""The load failed"") doit" & Chr(13))
  99. Err_Control:
  100. End Sub
  101. ------- END OF MODULE 2 ------------------------------------------------------------------

更新:我现在明白了......我将模块2顶部的四个Dim语句移动到Sub Main行的正下方,它现在正在工作。如果有人对此有其他建议,我将不胜感激。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2012-1-19 17:58:24 | 显示全部楼层
快速回答但不是最佳解决方案,制作2个版本,一个引用2009 LIB,另一个引用2005年。 穿上正确的机器,然后从那里开始。 使用 VLisp 确定您正在运行的 Acad 版本,然后加载正确的 dvb 文件。 两个 dvb 文件中的宏名称可以相同。 呵呵
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2012-1-19 23:56:54 | 显示全部楼层
您可以在
vlax-product-key
上使用
vl-string-search
来测试哪个版本,然后有条件地加载/运行正确的VBA模块。
伪代码:
  1. (vl-load-com)
  2. ((lambda ( key )
  3.   (cond
  4.     ((vl-string-search "R17.2" key)
  5.       ;; (atof (getvar 'ACADVER))


  1. (atoi (substr (ver) 13))
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2012-1-20 05:15:24 | 显示全部楼层

感谢比尔 - 这里发布的任何方法都应该适合您。
我不擅长用 VBA 编码,因为我选择学习 Visual LISP,现在正在跳转到 .NET 开发。但是,如果我有限的理解是正确的,您
实际上
可以
生成两个单独的模块(不同的VBA项目?每个 AutoCAD 版本对应一个。LISP将有条件地调用适当的模块版本;示例:

** 这类似于我们对某些旧版 VBA 例程所做的工作,因为我们处理多个版本(VBA 最初是为 2006、2009 年在内部编写的)。LISP 已合并到菜单、工具栏和功能区 CUI 组件中,并且还可以通过命令行进行调用。
不用担心;我们都从某个地方开始。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-6-30 10:49 , Processed in 1.505552 second(s), 60 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表