找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 566|回复: 2

[VBA程序]:类似录制宏的VBA代码示例。

[复制链接]

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-12-3 22:58:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

  1.   [FONT=courier new]
  2. 第一步,引用:Microsoft Visual Basic for Applications Extensibility 5.3类型库,这是用于扩展VBA功能的组件。
  3. 第二步,在ThisDraiwntg中添加事件的监控,主要有对象的增加、修改、删除操作。以下只检测对象的创建,也只对直张的创建进行监控,当直线创建时,自动往工程中添加一个过程。
  4. Private Sub AcadDocument_ObjectAdded(ByVal Object As Object)
  5.     Select Case Object.ObjectName
  6.         Case "AcDbLine"
  7.             Dim lineObj As AcadLine
  8.             Set lineObj = Object
  9.             Dim ComponentObj As VBComponent
  10.             Set ComponentObj = GetVBComponent(vbext_ct_StdModule)
  11.             If ComponentObj Is Nothing Then
  12.                 Set ComponentObj = Application.VBE.ActiveVBProject.VBComponents.Add(vbext_ct_StdModule)
  13.             End If
  14.             With ComponentObj.CodeModule
  15.                 Dim s As String
  16.                 s = "" & vbCrLf
  17.                 s = "Sub 宏_Line" & GetProcCount(ComponentObj.CodeModule) + 1 & "()" & vbCrLf
  18.                 s = s & "" & vbCrLf
  19.                 s = s & "    ' 宏_Line" & GetProcCount(ComponentObj.CodeModule) + 1 & vbCrLf
  20.                 s = s & "    ' efan2000 记录的宏" & vbCrLf
  21.                 s = s & "" & vbCrLf
  22.                 s = s & "    Dim lineObj As AcadLine" & vbCrLf
  23.                 s = s & "    Dim startPoint(0 To 2) As Double" & vbCrLf
  24.                 s = s & "    Dim endPoint(0 To 2) As Double" & vbCrLf
  25.                 s = s & "" & vbCrLf
  26.                 s = s & "    ' 定义直线的起点和终点" & vbCrLf
  27.                 s = s & "    startPoint(0) = " & lineObj.startPoint(0) & ": startPoint(1) =  " & lineObj.startPoint(1) & ": startPoint(2) = 0" & vbCrLf
  28.                 s = s & "    endPoint(0) = " & lineObj.endPoint(0) & ": endPoint(1) = " & lineObj.endPoint(1) & ": endPoint(2) = 0" & vbCrLf
  29.                 s = s & "" & vbCrLf
  30.                 s = s & "    ' 在模型空间创建直线" & vbCrLf
  31.                 s = s & "    Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint)" & vbCrLf
  32.                 s = s & "    Set lineObj = Nothing" & vbCrLf
  33.                 s = s & "End Sub" & vbCrLf
  34.                 .InsertLines .CountOfLines + 1, s
  35.             End With
  36.     End Select
  37. End Sub

  38. '返回当前工程的第一个模块
  39. Public Function GetVBComponent(ByVal ComponentType As vbext_ComponentType) As VBComponent
  40.     Dim i As Integer
  41.     For i = 1 To Application.VBE.ActiveVBProject.VBComponents.Count
  42.         If Application.VBE.ActiveVBProject.VBComponents(i).Type = ComponentType Then
  43.             Set GetVBComponent = Application.VBE.ActiveVBProject.VBComponents(i)
  44.             Exit For
  45.         End If
  46.     Next
  47. End Function

  48. '返回模块中的过程数目
  49. Public Function GetProcCount(ByVal CMObj As CodeModule) As Integer
  50.     Dim i As Integer
  51.     Dim s  As String
  52.     For i = 1 To CMObj.CountOfLines
  53.         If InStr(1, s, CMObj.ProcOfLine(i, vbext_pk_Proc), vbTextCompare) = 0 Then
  54.             s = s & CMObj.ProcOfLine(i, vbext_pk_Proc) & ";"
  55.         End If
  56.     Next
  57.     If s = "" Then Exit Function
  58.     s = Left(s, Len(s) - 1)
  59.     Dim v As Variant
  60.     v = Split(s, ";")
  61.     If Not IsEmpty(v) Then
  62.         GetProcCount = UBound(v) + 1
  63.     End If
  64. End Function

  65. 第三步,这是在事件中自动创建的代码结果。
  66. Sub 宏_Line1()

  67.     ' 宏_Line1
  68.     ' efan2000 记录的宏

  69.     Dim lineObj As AcadLine
  70.     Dim startPoint(0 To 2) As Double
  71.     Dim endPoint(0 To 2) As Double

  72.     ' 定义直线的起点和终点
  73.     startPoint(0) = 83.7160125997048: startPoint(1) = 206.265137503404: startPoint(2) = 0
  74.     endPoint(0) = 259.874137686561: endPoint(1) = 243.32201842691: endPoint(2) = 0

  75.     ' 在模型空间创建直线
  76.     Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint)
  77.     Set lineObj = Nothing
  78. End Sub

  79. Sub 宏_Line2()

  80.     ' 宏_Line2
  81.     ' efan2000 记录的宏

  82.     Dim lineObj As AcadLine
  83.     Dim startPoint(0 To 2) As Double
  84.     Dim endPoint(0 To 2) As Double

  85.     ' 定义直线的起点和终点
  86.     startPoint(0) = 259.874137686561: startPoint(1) = 243.32201842691: startPoint(2) = 0
  87.     endPoint(0) = 158.433236658299: endPoint(1) = 136.511009275691: endPoint(2) = 0

  88.     ' 在模型空间创建直线
  89.     Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint)
  90.     Set lineObj = Nothing
  91. End Sub

  92. Sub 宏_Line3()

  93.     ' 宏_Line3
  94.     ' efan2000 记录的宏

  95.     Dim lineObj As AcadLine
  96.     Dim startPoint(0 To 2) As Double
  97.     Dim endPoint(0 To 2) As Double

  98.     ' 定义直线的起点和终点
  99.     startPoint(0) = 158.433236658299: startPoint(1) = 136.511009275691: startPoint(2) = 0
  100.     endPoint(0) = 328.59216866062: endPoint(1) = 155.039449391691: endPoint(2) = 0

  101.     ' 在模型空间创建直线
  102.     Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint)
  103.     Set lineObj = Nothing
  104. End Sub

  105. 这仅仅是一个简单的功能,如果能够加以扩充,完全可以实现如在Excel中的录制宏的效果。
  106.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-12-4 09:12:51 | 显示全部楼层
命令和操作很多,要一个个写,工作量很大的。而且有一些CAD的命令用vba写起来蛮费劲的。
autodesk公司应该开发开发。--这样vba for autocad 的函数、属性、方法就多多了,用起来也方便多了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-10 09:38:21 | 显示全部楼层
同意。这个我们用户来实现太费力了。如果碰上PEDIT,TRIM之类的命令,用VBA实现录制会疯掉的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-23 00:24 , Processed in 0.171395 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表