乐筑天下

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

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

[复制链接]

26

主题

589

帖子

10

银币

中流砥柱

Rank: 25

铜币
693
发表于 2003-12-3 23:12:00 | 显示全部楼层 |阅读模式
  1. 第一步,引用:Microsoft Visual Basic for Applications Extensibility 5.3类型库,这是用于扩展VBA功能的组件。
  2. 第二步,在ThisDraiwntg中添加事件的监控,主要有对象的增加、修改、删除操作。以下只检测对象的创建,也只对直张的创建进行监控,当直线创建时,自动往工程中添加一个过程。
  3. Private Sub AcadDocument_ObjectAdded(ByVal Object As Object)
  4.     Select Case Object.ObjectName
  5.         Case "AcDbLine"
  6.             Dim lineObj As AcadLine
  7.             Set lineObj = Object
  8.             Dim ComponentObj As VBComponent
  9.             Set ComponentObj = GetVBComponent(vbext_ct_StdModule)
  10.             If ComponentObj Is Nothing Then
  11.                 Set ComponentObj = Application.VBE.ActiveVBProject.VBComponents.Add(vbext_ct_StdModule)
  12.             End If
  13.             With ComponentObj.CodeModule
  14.                 Dim s As String
  15.                 s = "" & vbCrLf
  16.                 s = "Sub 宏_Line" & GetProcCount(ComponentObj.CodeModule) + 1 & "()" & vbCrLf
  17.                 s = s & "" & vbCrLf
  18.                 s = s & "    ' 宏_Line" & GetProcCount(ComponentObj.CodeModule) + 1 & vbCrLf
  19.                 s = s & "    ' efan2000 记录的宏" & vbCrLf
  20.                 s = s & "" & vbCrLf
  21.                 s = s & "    Dim lineObj As AcadLine" & vbCrLf
  22.                 s = s & "    Dim startPoint(0 To 2) As Double" & vbCrLf
  23.                 s = s & "    Dim endPoint(0 To 2) As Double" & vbCrLf
  24.                 s = s & "" & vbCrLf
  25.                 s = s & "    ' 定义直线的起点和终点" & vbCrLf
  26.                 s = s & "    startPoint(0) = " & lineObj.startPoint(0) & ": startPoint(1) =  " & lineObj.startPoint(1) & ": startPoint(2) = 0" & vbCrLf
  27.                 s = s & "    endPoint(0) = " & lineObj.endPoint(0) & ": endPoint(1) = " & lineObj.endPoint(1) & ": endPoint(2) = 0" & vbCrLf
  28.                 s = s & "" & vbCrLf
  29.                 s = s & "    ' 在模型空间创建直线" & vbCrLf
  30.                 s = s & "    Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint)" & vbCrLf
  31.                 s = s & "    Set lineObj = Nothing" & vbCrLf
  32.                 s = s & "End Sub" & vbCrLf
  33.                 .InsertLines .CountOfLines + 1, s
  34.             End With
  35.     End Select
  36. End Sub
  37. '返回当前工程的第一个模块
  38. Public Function GetVBComponent(ByVal ComponentType As vbext_ComponentType) As VBComponent
  39.     Dim i As Integer
  40.     For i = 1 To Application.VBE.ActiveVBProject.VBComponents.Count
  41.         If Application.VBE.ActiveVBProject.VBComponents(i).Type = ComponentType Then
  42.             Set GetVBComponent = Application.VBE.ActiveVBProject.VBComponents(i)
  43.             Exit For
  44.         End If
  45.     Next
  46. End Function
  47. '返回模块中的过程数目
  48. Public Function GetProcCount(ByVal CMObj As CodeModule) As Integer
  49.     Dim i As Integer
  50.     Dim s  As String
  51.     For i = 1 To CMObj.CountOfLines
  52.         If InStr(1, s, CMObj.ProcOfLine(i, vbext_pk_Proc), vbTextCompare) = 0 Then
  53.             s = s & CMObj.ProcOfLine(i, vbext_pk_Proc) & ";"
  54.         End If
  55.     Next
  56.     If s = "" Then Exit Function
  57.     s = Left(s, Len(s) - 1)
  58.     Dim v As Variant
  59.     v = Split(s, ";")
  60.     If Not IsEmpty(v) Then
  61.         GetProcCount = UBound(v) + 1
  62.     End If
  63. End Function
  64. 第三步,这是在事件中自动创建的代码结果。
  65. Sub 宏_Line1()
  66.     ' 宏_Line1
  67.     ' efan2000 记录的宏
  68.     Dim lineObj As AcadLine
  69.     Dim startPoint(0 To 2) As Double
  70.     Dim endPoint(0 To 2) As Double
  71.     ' 定义直线的起点和终点
  72.     startPoint(0) = 83.7160125997048: startPoint(1) = 206.265137503404: startPoint(2) = 0
  73.     endPoint(0) = 259.874137686561: endPoint(1) = 243.32201842691: endPoint(2) = 0
  74.     ' 在模型空间创建直线
  75.     Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint)
  76.     Set lineObj = Nothing
  77. End Sub
  78. Sub 宏_Line2()
  79.     ' 宏_Line2
  80.     ' efan2000 记录的宏
  81.     Dim lineObj As AcadLine
  82.     Dim startPoint(0 To 2) As Double
  83.     Dim endPoint(0 To 2) As Double
  84.     ' 定义直线的起点和终点
  85.     startPoint(0) = 259.874137686561: startPoint(1) = 243.32201842691: startPoint(2) = 0
  86.     endPoint(0) = 158.433236658299: endPoint(1) = 136.511009275691: endPoint(2) = 0
  87.     ' 在模型空间创建直线
  88.     Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint)
  89.     Set lineObj = Nothing
  90. End Sub
  91. Sub 宏_Line3()
  92.     ' 宏_Line3
  93.     ' efan2000 记录的宏
  94.     Dim lineObj As AcadLine
  95.     Dim startPoint(0 To 2) As Double
  96.     Dim endPoint(0 To 2) As Double
  97.     ' 定义直线的起点和终点
  98.     startPoint(0) = 158.433236658299: startPoint(1) = 136.511009275691: startPoint(2) = 0
  99.     endPoint(0) = 328.59216866062: endPoint(1) = 155.039449391691: endPoint(2) = 0
  100.     ' 在模型空间创建直线
  101.     Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint)
  102.     Set lineObj = Nothing
  103. End Sub
  104. 这仅仅是一个简单的功能,如果能够加以扩充,完全可以实现如在Excel中的录制宏的效果。
回复

使用道具 举报

6

主题

60

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
84
发表于 2003-12-4 11:15:00 | 显示全部楼层
厉害厉害~~~~~~
回复

使用道具 举报

11

主题

41

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2005-10-23 17:17:00 | 显示全部楼层
这真是个绝好的贴字
如果能够实现录制宏的功能
我们就不用花很多时间了
只要对宏进行修改就可以了
希望大家都来顶一下!
回复

使用道具 举报

9

主题

21

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
57
发表于 2005-10-23 22:11:00 | 显示全部楼层
鼓掌中!!!
回复

使用道具 举报

20

主题

115

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
195
发表于 2005-10-24 12:09:00 | 显示全部楼层
不错!
回复

使用道具 举报

gyl

15

主题

127

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
187
发表于 2005-10-24 14:12:00 | 显示全部楼层
不明白ACAD中为什么不提供这样的功能.
回复

使用道具 举报

wmz

50

主题

247

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
447
发表于 2005-10-24 18:46:00 | 显示全部楼层
不知具体怎样实现(我没有看懂)?
回复

使用道具 举报

1

主题

4

帖子

2

银币

初来乍到

Rank: 1

铜币
8
发表于 2005-10-26 11:57:00 | 显示全部楼层
没看懂,希望楼主讲明具体怎么实现.前面几个鼓掌的看懂了?厉害!比楼主还厉害!
回复

使用道具 举报

20

主题

73

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
153
发表于 2005-10-30 22:23:00 | 显示全部楼层
这可是个好贴子哦
回复

使用道具 举报

13

主题

107

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
159
发表于 2005-10-31 17:02:00 | 显示全部楼层
看了这个帖子,知道什么是差距了.
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-5 18:13 , Processed in 0.874335 second(s), 72 queries .

© 2020-2025 乐筑天下

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