找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8594|回复: 7

[教学]:VBA新手入门学堂:从头开始学习VBA

  [复制链接]
发表于 2004-6-9 22:50:24 | 显示全部楼层 |阅读模式

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

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

×
如果您对VBA完全是外行,来这吧,你不会失望的!


我觉得学VBA(或其他程序),“任务驱动法”是最有效的!写出一个程序就能进一步。

第一课:用VBA画圆。

[swf w=800 h=660]http://www.xdcad.net/bbstech/develop/vba/ahlzl/vba1.swf[/swf]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2004-6-9 23:11:44 | 显示全部楼层

代码

  1. Sub vba1()
  2. '我的第一个VBA程序——画一个圆。

  3. '先定圆心坐标
  4. Dim cen(2) As Double
  5. cen(0) = 100: cen(1) = 200: cen(2) = 0            '这就是圆心的坐标

  6. '再定半径
  7. Dim R As Double
  8. R = 300                                           '这就是半径

  9. '有了圆心和半径就可以画圆了!
  10. Dim C As AcadCircle
  11. Set C = ThisDrawing.ModelSpace.AddCircle(cen, R) '在“当前文档”的“模型空间”里“画圆”

  12. ZoomExtents
  13. End Sub


从代码中可以看出,VBA中是通过“圆心cen(2)”和“半径R”来画圆的。因此,要先给圆心、半径“赋值”,而“赋值”前,要先对相应的变量进行“声明”。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2004-6-11 22:11:14 | 显示全部楼层
如果能看懂上述代码,那下面的代码都不难理解了。

  1. Sub vba2()

  2. '画一个蓝色的圆。
  3. Dim cen(2) As Double
  4. cen(0) = 100: cen(1) = 200: cen(2) = 0
  5. Dim R As Double
  6. R = 300
  7. Dim C As AcadCircle
  8. Set C = ThisDrawing.ModelSpace.AddCircle(cen, R) '在“当前文档”的“模型空间”里“画圆”
  9. C.color = acBlue                                 '将圆的颜色设为蓝色

  10. '画一条红色的直线
  11. Dim sp(2) As Double, ep(2) As Double
  12. sp(0) = 0: sp(1) = 0: sp(2) = 0
  13. ep(0) = 300: ep(1) = 400: ep(2) = 0
  14. Dim L As AcadLine
  15. Set L = ThisDrawing.ModelSpace.AddLine(sp, ep)    '根据“起点”和“终点”画直线
  16. L.color = acRed                                   '将直线的颜色设为红色


  17. '画一圆弧,用现成的变量
  18. pi = 3.1415926535
  19. Dim A As AcadArc
  20. Set A = ThisDrawing.ModelSpace.AddArc _
  21. (sp, R, 30 * pi / 180, 150 * pi / 180)           '根据圆心、半径、起始角、终止角画圆弧
  22. A.Lineweight = acLnWt030                         '将圆弧的线宽设为0.3mm
  23. A.Update                                         '刷新,显示线宽

  24. '过点(800,150),(120,240),(320,600),(350,720)画一二维多段线,并闭合。
  25. Dim po(9) As Double
  26. po(0) = 800: po(1) = 150: po(2) = 120: po(3) = 240
  27. po(4) = 320: po(5) = 600: po(6) = 350: po(7) = 720
  28. Dim PL As AcadLWPolyline
  29. Set PL = ThisDrawing.ModelSpace.AddLightWeightPolyline(po)
  30. PL.Closed = True                                 '使多段线闭合

  31. ZoomExtents                                      '范围缩放
  32. End Sub


说明:画圆弧时,起始角和终止角分别为30度和150度,但VBA中的角度变量应为弧度,故应进行转化,把度化为弧度。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-11 22:21:45 | 显示全部楼层
在更多的情况下,点的坐标和距离值要由用户输入。
下面我们来画一直线,两端点坐标由用户输入,再画一个圆,圆心在所画直线的起点,半径也由用户来输入。

  1. Sub vba3()

  2. '画直线
  3. Dim sp As Variant, ep As Variant
  4. sp = ThisDrawing.Utility.GetPoint(, "请输入直线的起点:")
  5. ep = ThisDrawing.Utility.GetPoint(sp, "请输入直线的终点:")
  6. Dim L As AcadLine
  7. Set L = ThisDrawing.ModelSpace.AddLine(sp, ep)    '根据“起点”和“终点”画直线

  8. '画一圆
  9. Dim r  As Double
  10. r = ThisDrawing.Utility.GetDistance(sp, "请输入半径")
  11. Dim C As AcadCircle
  12. Set C = ThisDrawing.ModelSpace.AddCircle(sp, r)

  13. ZoomExtents                                      '范围缩放
  14. End Sub
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-11 22:44:17 | 显示全部楼层
VBA是通过ActiveX方法和CAD交互。此外,还可使用SendCommand方法,和AutoLisp中的command函数很相似。

  1. Sub vba4()
  2. 'VBA代码
  3. '以(100,200)为圆心,500为半径画圆。
  4. ThisDrawing.SendCommand ("circle" + vbCr + "100,200" + vbCr + "500" + vbCr)
  5. End Sub

  1. (defun c:cc()
  2. ;AutoLisp代码
  3. (command "circle" "100,200" "" "500" "")
  4. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-11 23:23:21 | 显示全部楼层
一想到赋值,长不大的斑竹就觉得VBA代码的可读性要优于LISP。
如x=(a+b)/2,
  1. ;LISP代码
  2. (setq x (/ (+ a b) 2))

  1. 'VBA代码
  2. x = (a + b) / 2
复制代码

越是复杂的赋值语句,VBA代码可读性好的优点就越突出。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-12 13:06:39 | 显示全部楼层
第3贴中的二维多段线,在VBA中有两种:AcadLWPolyline和AcadPolyline,分别用AddLightweightPolyline方法和AddPolyline方法创建。
  1. Sub Example_AddPolyline()
  2.    
  3.     Dim plineObj As AcadPolyline
  4.     Dim points(0 To 14) As Double
  5.    
  6.     points(0) = 1: points(1) = 1: points(2) = 0
  7.     points(3) = 1: points(4) = 2: points(5) = 0
  8.     points(6) = 2: points(7) = 2: points(8) = 0
  9.     points(9) = 3: points(10) = 2: points(11) = 0
  10.     points(12) = 4: points(13) = 4: points(14) = 0
  11.         
  12.     Set plineObj = ThisDrawing.ModelSpace.AddPolyline(points)
  13.       
  14. End Sub
  1. Sub Example_AddLightWeightPolyline()

  2.     Dim plineObj As AcadLWPolyline
  3.     Dim points(0 To 9) As Double
  4.    
  5.     points(0) = 1: points(1) = 1
  6.     points(2) = 1: points(3) = 2
  7.     points(4) = 2: points(5) = 2
  8.     points(6) = 3: points(7) = 2
  9.     points(8) = 4: points(9) = 4
  10.         
  11.     Set plineObj = ThisDrawing.ModelSpace.AddLightWeightPolyline(points)

  12. End Sub
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-17 22:48:37 | 显示全部楼层
学了一段时间,要测验一下……

出个题目:画一个三角形和它的三条中线,要求三角形的三个角点由用户输入,三角形和其中线由程序自动生成。

哦,还有一难点的附加题:画一个三角形和它的三条角平分线,要求三角形的三个角点由用户输入,三角形和其角平分线由程序自动生成。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 20:59 , Processed in 0.443477 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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