QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
6天前
查看: 19798|回复: 28
收起左侧

[已答复] 请问怎么用EXCEL VBA实现在CAD里面的画线命令

[复制链接]
发表于 2008-9-9 08:40:11 | 显示全部楼层 |阅读模式 来自: 中国江苏常州

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
7 L1 m' v! Z3 O1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1+ `( |1 L1 F9 G: E  n
Untitled-1.gif
1 c. m& f0 c& \' s9 q  z: A, i' |' [4 \$ `+ S% P
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
4 s/ b; H' `- k/ j& h1 b$ z3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
( a, x. ?" n' ~& i Untitled-2.gif 7 n# U9 Y$ F$ h6 l
" ?- y( L* r7 C: a% P5 N" T
4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码* K2 d& J  @; U# q3 {' ?3 E
-------------------------------------------------------------------------
- Y& K0 L$ Y: ?" T# T9 V7 x4 M0 F& jSub A()0 {3 @3 ^+ Y8 @2 g! c
    Dim CAD As AcadApplication, DOC As AcadDocument
/ l/ [, }) Q3 L' p+ y. {! k, Q    Set CAD = New AcadApplication
7 ~2 S. p# C/ j2 N  G/ K  B- f  Y2 H    CAD.Visible = True
% E2 U* d5 h8 l' Q7 N. P    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)) E, F; `9 o9 j: l* _) ^
    DOC.SendCommand Sheet1.Cells(1, 2).Value8 D4 Q: D2 R3 p5 D* v
End Sub. Z9 b+ F. \! ^  m9 [
-------------------------------------------------------------------------& I# }# K3 W) _; {% M
见图3
5 N0 c/ T0 @+ L Untitled-3.gif
5 _# v; g# n; k( {1 C& h+ r& R' f( w) u+ V$ S
5、在EXCEL界面运行宏,见图4# K7 W; V: Y$ S) C- P& i0 p
Untitled-4.gif
, H4 J6 J( o1 s5 D5 v
4 \, B- X0 m: T+ O* }6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图58 I1 ^7 Z8 \# [, B
Untitled-5.gif

评分

参与人数 1三维币 +10 收起 理由
唐昕晨 + 10 应助

查看全部评分

发表于 2008-9-9 10:51:10 | 显示全部楼层 来自: 中国宁夏银川
高人.............
 楼主| 发表于 2008-9-9 14:09:54 | 显示全部楼层 来自: 中国江苏常州
非常感谢版主的答复,假如我的文件已经找开,想指明这个画线命令是在当前文件上的操作,该怎么操作,也就是说,我想在已经打开的文件中画线,同样在EXCEL VBA中实现,怎么弄?先谢谢
 楼主| 发表于 2008-9-9 14:12:07 | 显示全部楼层 来自: 中国江苏常州
顺便问一下,有没有相关资料可以提供一下,或介绍一下吗,主要是在EXCEL VBA 中控制CAD的命令操作,非常感受谢,huaxiao2005@tom.com
发表于 2008-9-9 15:51:25 | 显示全部楼层 来自: 中国辽宁营口

回复 4# 的帖子

上面的代码改一下. T: |) i' ^% Y! n
---------------------------------------------
9 Y1 K$ ]: B) |8 A4 \' E& SSub A()
" \, ^! J# H3 o& K& T" |  Z    Dim CAD As AcadApplication, DOC As AcadDocument/ x# g- }. B+ c3 p( [. y! }# p
    Set CAD = GetObject(, "Autocad.Application")* f% W, |% w! n* r8 S0 x
    Set DOC = CAD.ActiveDocument+ }: N; t) S* `- K
    DOC.SendCommand Sheet1.Cells(1, 2)
) Y9 K4 Y" u: yEnd Sub4 T+ ~# X$ e; _. X: L1 j3 T9 n
---------------------------------------------! |1 B8 G) ]' S3 T2 G* p
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
$ a7 P, M* N9 }
4 Q; Y1 U8 F0 W( E$ K4 e% R[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?9 j* m, I: V/ U/ H+ P1 |

& m' I* W1 S) U( T: H5 h[ 本帖最后由 www1974 于 2008-9-16 00:05 编辑 ]
发表于 2008-9-16 06:04:41 | 显示全部楼层 来自: 中国
不太理解你的意图,能否再说得详细些?
发表于 2008-9-16 10:54:16 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 06:04 发表 http://www.3dportal.cn/discuz/images/common/back.gif
5 j5 D7 D$ Z) S9 \不太理解你的意图,能否再说得详细些?
  s% x7 y7 U1 L% f/ R+ i; v1 E
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~+ B* M$ S# r0 h5 {9 ?

- W, _# T+ F% t, Y7 e- W4 b+ P[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
6 T& p- H# Q+ X  `4 d# W8 \' c# x-----------------------------------------------------
0 x* {* M/ g) E6 _0 b- [Sub A()
$ F( O' }, w. h    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer( q: f* X# S0 O+ W( ~+ n- b
    Set CAD = New AcadApplication; a5 R1 q( y  \& p( c/ e" G# u
    CAD.Visible = True; x0 ]' |+ ^/ ?: K' E: e; ]2 F/ a
    I = 1
4 u8 i' p/ {5 J$ g  a    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""! ]  |( I0 b, Y+ I0 D" r' Z& E
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
. e( l9 i) O1 o1 Z( j, q) i, t        DOC.SendCommand Sheet1.Cells(I, 2).Value
' s( ?5 w) p7 n! B: q' i/ P        DOC.Save
$ _* o( E, _( Z) O% Y- G        DOC.Close1 ~) X. i7 c) n! N  I
        I = I + 1; T, m4 T' S! q0 Q4 y
    Loop
( N, w# t/ A% r* R9 \! R3 Z    CAD.Quit4 n2 |& u  y/ l' ?
End Sub9 @) D/ ~: J! R
-----------------------------------------------------------------0 s1 N4 ?  w8 m8 Z8 X3 [: Z4 I8 Z" l
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。$ l) k' V$ ]. t+ z
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif
9 F, W  G1 X: u4 o代码可以这样写7 @7 \& [- q* v9 [/ U+ x
-----------------------------------------------------
- i& o& Y' D. T$ s  U' vSub A()
+ E( ]" k: L4 }6 e/ ?    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
- o% q5 t9 }! H5 M" f! \. t" [3 Y    Set CAD = New AcadApplication
! b7 j/ q3 y) ]' e/ M" P    CAD.Visible =  ...
* r4 {  h4 }$ S

' R" I& |1 d; J/ J2 B; b学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!; h9 l# U2 S- i/ u: c1 W
因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释6 \: E" \& ?' l) Y. ^% S' b
----------------------------------------------
( z0 U/ J# q7 B  WSub A(): _9 [! S0 I5 m  M( y
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
* `* ^. l8 ~3 n, l7 M! E0 A8 x% J! b5 j    Dim DOC As AcadDocument '声明AutoCAD文档对象
2 F! B3 w" C; N) A2 u( B- A3 s5 {- c    Set CAD = New AcadApplication '运行一个新的AutoCAD进程1 X$ G7 F6 N' x
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。% M! D5 T. c" q- x, ]( B0 Y
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
) G; g& p. }+ T9 C+ u    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令: ^. D  J. j3 a* b" q8 ?
End Sub% ^: r2 m5 r- q- m& S
----------------------------------------------8 e, e* H+ f2 N/ E( D

  x1 g9 R: m" J, @* c; |! s6楼代码注释# O7 C0 g1 L+ a$ Z7 O
----------------------------------------------# }/ I5 C+ g& h6 P  @4 m7 L
Sub A()2 j; h, v1 x+ ?3 N2 U& g2 [
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象- f0 \- ~, Q% v
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
- p4 ~( r& V3 {" b9 Q$ i    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
3 B: n8 g8 o- P' C% R. v    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
8 P; p; S( D$ |" P: a: `# _, V9 V) `End Sub6 |8 C; x% A- v& j0 {3 o
----------------------------------------------# f+ b9 t8 p; ^4 x

7 v6 m4 Q- t) [! `7 M) W9 C10楼代码注释
1 S3 X; V$ v% T7 B5 i----------------------------------------------9 N  |% M3 _) u( A" g  j
Sub A()
2 n" ~1 Y3 _5 `+ E    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的), O, Q9 i( I2 c% R$ W' `6 e
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程9 g6 }' B  a# H, t
    CAD.Visible = True '使运行的AutoCAD程序可见
& h8 C. C; I8 X: U/ J9 C7 s    I = 1 '从工作表的第一行开始计数
1 w: @, w+ o) C0 T$ y) n8 h9 h2 P    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空. x+ R+ W" v6 r6 y( w
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
& [. C- R/ \  e- P        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
6 R% _4 r4 d5 T" }+ H        DOC.Save '保存文件
* F) X, T3 N5 q7 _        DOC.Close '关闭文件
/ o: l: u+ v+ v/ b3 ~        I = I + 1 '计数加1. Y; b( [5 ^8 @! D
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。, R  P5 C6 P0 u' a! o
    '如果检查结果为单元格内容为空,就执行下面的语句% ~& N& S' D! b8 b0 p
    CAD.Quit '退出(关闭)CAD程序8 L) J# b0 C7 q5 i- e" c' {7 m
End Sub
# w; E% z) ^& x& k8 u4 p1 v----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!/ c1 M8 ~8 b+ l1 d+ s. @
版主说说看vba、lisp这两个到底怎么个差别
* d0 }: [5 R* Z1 K0 u
, \/ n7 \  }8 p7 r& w1 \# M2 B[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子! Z# z( \( @- K
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
; m( H& J: _3 Q  {4 g# o2楼代码注释8 c; C; K2 l& Z% S" q) C
----------------------------------------------
, C) h% j$ \& |4 W( E* }$ PSub A()
8 ]1 F& I9 R. |8 \  M    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
% s) G2 `; U! R& i9 d- d    Dim DOC As AcadDocument '声明AutoCAD文档对象4 |8 ?& H; @' O1 q/ G7 |2 a
    Set CAD = New A ...

* H2 c( ?1 W3 Y7 P如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

text 0,0 2.5 30 你好!. P' K4 P, }6 u% c+ J
我在Excel VBA 中用以上命令建立一个单行文字,可以生成文字,但是无法自动结束这个命令,必须要到CAD窗口按两次回车才能结束,请问这是为什么,有什么办法可以解决。
发表于 2008-11-14 10:44:53 | 显示全部楼层 来自: 中国辽宁营口

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。( {: D& ?. T% t4 i8 o3 U
实际上字符串中的空格(实际也是回车的意思)也可以这样。6 \8 O! ~/ o. v2 x6 C9 D
另外,按EXCEL的规矩,单元格内容的前面有“-”号时,还要加一个单引号,见图
Untitled-1.gif
Untitled-2.gif
发表于 2008-11-14 11:17:35 | 显示全部楼层 来自: 中国江苏苏州
原帖由 www1974 于 2008-9-16 12:50 发表 http://www.3dportal.cn/discuz/images/common/back.gif2 {+ K( s( q$ g% }; ~

& e5 w( n' D7 J. m6 o; c: m4 L: t$ p! ^
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
6 o1 D$ Z% ~& C
; N' b0 C) t$ [- X4 }* I2 g
* ^; U+ f( d- O( e7 t" o. z1 g
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 2008-11-14 11:40:16 | 显示全部楼层 来自: 中国云南昆明

回复 19# woaishuijia 的帖子

真是谢谢了!受誉非浅啊!不断的向你学习!
发表于 2009-12-15 17:54:05 | 显示全部楼层 来自: 中国湖南长沙
真强!!真是牛人呢!
发表于 2009-12-15 20:48:18 | 显示全部楼层 来自: 中国湖南长沙

高手!帮我看看这个怎么编写VBA程序!

我要将I3,J3,K3.....录完,然后录I4,J4,K4......直到把本页面的单行文字全部录入到CAD,我已编好EXCEL程序,但不能多个复制到CAD中,因CAD中不持连续单行文字的输入,必须一个个的复制,粘贴进CAD中才有效,其中原因是每复制一个后要按回车,若在EXCEL表中用ALT+回车,占据一格,也不能连续复制粘贴,所以只能用VBA,重复这个工作。请问这个怎么编?
110.jpg
发表于 2010-1-5 09:04:16 | 显示全部楼层 来自: 中国湖北武汉
真是太激动了,真好,谢谢啦。
发表于 2010-1-22 23:20:10 | 显示全部楼层 来自: 中国江苏徐州
Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作! p7 p/ Y( S* @& H2 T" ~1 d

) f. R5 X# W0 s& b8 Y" o0 ?0 U如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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