QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 19871|回复: 28
收起左侧

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:/ e1 y* R- Q7 \
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
0 P3 {& e; z2 l  k, G9 q Untitled-1.gif
+ [. w- i! O* G+ ~+ R4 v/ ~* k  V+ n) @$ n* G
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
" o  W& H' r, Z( {% t3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
) k+ T! Q8 U# ]5 R Untitled-2.gif
) Z* d4 I* Z/ S3 `& U
+ i, |+ \* b' Y" ?0 e/ v) x/ N4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码6 }0 w% U9 q6 s) s4 S) Y9 g6 J
-------------------------------------------------------------------------
9 ]8 N$ n2 L5 ?' A' y' Q; h( XSub A()7 y7 k9 v) X! L; ]$ u  @7 t/ i: ^
    Dim CAD As AcadApplication, DOC As AcadDocument" Q3 E$ y' ^3 Q  U, K- F4 p0 ~0 I
    Set CAD = New AcadApplication6 P; Q) i/ c$ r7 H. Q6 x% m' a: Y
    CAD.Visible = True
" a/ M) a' h* \6 {* m& \4 y7 z/ ^; G    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)* A) r+ ~) B( Z6 v0 G! M
    DOC.SendCommand Sheet1.Cells(1, 2).Value) U  h" V7 C9 T# @& m7 L3 z1 V
End Sub
7 `& y8 r& D4 ^- o-------------------------------------------------------------------------6 [4 y/ N: O& Y
见图36 v* o: ^# Z% L
Untitled-3.gif
$ U- e! `8 _) ]! [& ^. U7 p7 y. P5 m# y  N& Y- Z$ |7 M
5、在EXCEL界面运行宏,见图4
& a( v) C0 d" Q1 E$ K Untitled-4.gif # {4 J- M% |! r/ c9 W3 M; ]7 |
$ K" N/ X* q/ W6 f1 A  P! n4 L
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
( I' ]4 j% [0 Q% r4 h$ U) {: ]: ] 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# 的帖子

上面的代码改一下
' C* G; e7 v: }7 g---------------------------------------------
! l+ a% e1 M- Z: l4 w: s; k/ cSub A()' E' x7 O0 D" `$ b
    Dim CAD As AcadApplication, DOC As AcadDocument1 a$ ^8 f% i* r- f. S9 R, ^
    Set CAD = GetObject(, "Autocad.Application")
* p8 k: h1 F2 e6 j    Set DOC = CAD.ActiveDocument/ X: B. U4 y8 H" U. p7 t) a4 x- u
    DOC.SendCommand Sheet1.Cells(1, 2); ]% z+ n( m0 a4 X" v3 t
End Sub
2 J2 j/ G7 H, D4 I9 Q, e---------------------------------------------
4 Z: ~) n+ k" L: S' Y5 A0 s( N本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接! ?$ o2 ?& r2 Q2 J
: r( u, X/ z5 k: K1 p, ?  v
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
  h1 N7 ]) {) k* i- ~
" t- l5 Q1 F6 l. m8 E; K[ 本帖最后由 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
+ u8 B% I4 X; l" o不太理解你的意图,能否再说得详细些?

, I* }: {  x& Y8 q* z8 y) f( M就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
9 H" t. D% x" i
. |$ U; g' o. A) U6 i# }[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
/ {* S0 o3 Y' S  Y3 n. n) ~$ ?" a8 J-----------------------------------------------------
# Y9 d, O; {" j+ H  R, GSub A()/ [/ c; v+ d4 S+ W4 x
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
* D. ]  W5 F" N/ P1 ]& i" k" C% t    Set CAD = New AcadApplication( M9 _  ^8 D2 P" F
    CAD.Visible = True  Q. d+ w# e: p2 i& N
    I = 1
, ^& C# [. }% }/ Y4 d3 s; k5 o- ]9 l    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""& h/ e  S  Y. e5 d9 o
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
' L9 P2 [( Q, Y2 }8 H- t        DOC.SendCommand Sheet1.Cells(I, 2).Value$ J7 O$ H3 S% r) ]1 O
        DOC.Save
4 H. `7 h) w6 D) c1 |! m, g        DOC.Close
4 a! j8 g* U& l) M6 I5 Q8 ?        I = I + 1+ d% H+ A5 _6 Y  H6 U
    Loop
3 n( r4 a+ F  e& G" h    CAD.Quit" H6 e! [1 i) z7 Q' P) |
End Sub9 d( o5 a0 h- d! A
-----------------------------------------------------------------
" n' G0 \" f& a% V* T: D4 M! p9 B运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
6 G9 K- _* Y6 A; ?( {本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif
& i+ M1 S; e  I# a6 o- T3 l代码可以这样写' o, G7 Y7 J" D6 S+ D. W
-----------------------------------------------------
6 o+ P4 f& W! \$ e& D1 w; y9 MSub A()
, H5 e2 D! p3 Z/ x# @; d    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer* c: f- L7 g" w: }5 n% [
    Set CAD = New AcadApplication2 _: H, `* ]/ p* W5 W2 U
    CAD.Visible =  ...

6 W/ M* x4 Z' {9 D3 N; e8 j% @" A$ \7 P% u5 N
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
7 c  m% C) U$ j2 O: h因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释/ V8 h5 E! M, [* ?7 N3 o$ J
----------------------------------------------
9 d& C4 ]& R/ F4 kSub A()! u' M" E0 U# P7 Q
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象3 v' w( p6 ?7 @; [9 ]$ Y1 w
    Dim DOC As AcadDocument '声明AutoCAD文档对象0 S% m4 A: P8 K& u' a, x5 J, R
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程, l; P# E$ i& d# W+ e7 W& o
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
4 {- w; [4 v' t% L) N    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件, |5 X/ q9 b9 V7 X- o, o; i# {
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令" u$ U2 ~+ |) X6 c
End Sub2 n8 |# ~- C2 {5 ?$ E
----------------------------------------------
  {2 o# a" x$ Q4 U/ V, ?% x" d8 N6 y( D3 B# o
6楼代码注释0 \: Y" \6 A+ C! s. P
----------------------------------------------
4 q0 A! k! v4 F# E( pSub A()
" R0 b- y* \+ j& i; W    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
7 N& r6 N& m# W; V1 Y/ M3 T6 T) Q    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
1 X$ j+ e. t' I    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作- X- D" m0 @% G
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
; o) i3 \0 |0 w4 J$ j! xEnd Sub; O/ A8 f1 s3 M$ W8 T, [
----------------------------------------------
9 ~4 |# w) [, |% l9 C
9 F" W! a6 L! G9 B/ X9 e$ Q8 t10楼代码注释9 v9 E! e( j2 M- X; N$ f- _
----------------------------------------------
8 e  ?/ z1 F$ _# _Sub A()
4 c( G% N% U0 A& a8 u  `( ?( W    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)! i- e/ W& k# G5 n
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程( N9 h! O( E2 E/ K9 N) |
    CAD.Visible = True '使运行的AutoCAD程序可见6 T1 x$ ]4 ^# a# Z0 h0 V2 Q% U# f
    I = 1 '从工作表的第一行开始计数
; b! d- ~# c4 S  U    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
! }9 J7 f* f* D- I# J$ |2 z        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
2 z& [: k$ K! i/ `& Q2 e        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令' {! `* J8 w2 g& [5 p
        DOC.Save '保存文件& y- c% K2 l3 l
        DOC.Close '关闭文件; X' a. [9 c4 l; ]( O; C
        I = I + 1 '计数加1
) r0 l3 y' x/ u8 {    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。# w1 P. Z# y4 ~3 N, L9 E1 x
    '如果检查结果为单元格内容为空,就执行下面的语句
6 V. Y: G; Y; Y9 t/ y% M, r  R    CAD.Quit '退出(关闭)CAD程序+ v1 Z4 A; T: \3 x* e' u' W7 u0 d% q# k
End Sub
( n0 Y& `, [6 ?: K: L, _0 l8 D----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
# p, G' B, ^& v0 y: L4 Y9 W% j版主说说看vba、lisp这两个到底怎么个差别3 q9 i9 y) v; G" ^! r
+ q4 t, z/ Q  [5 ?) H
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子* k( I" L' W! z' ]. f" V
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif8 L6 F9 P1 j6 L7 X- |# p
2楼代码注释1 q, w( [4 M3 F8 a
----------------------------------------------
" t2 S! A3 N' L7 K- ?Sub A()4 F- e( Q" R7 j9 _  P* R6 K2 g. a
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象! m9 l7 y( Y5 r  E5 c. }- ?
    Dim DOC As AcadDocument '声明AutoCAD文档对象: v1 o: G( f& m% R7 G
    Set CAD = New A ...
# _0 a8 }0 L7 c' ?% l2 i2 u
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。% J& }( d4 O& m* y
实际上字符串中的空格(实际也是回车的意思)也可以这样。' _' \% a8 {: s7 h8 P* B$ T' H
另外,按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.gif( c0 R; B2 q% ^7 i- e
: p* V% t4 m  f7 S2 R* H

+ k+ P0 K  m0 h9 f学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

8 U! E  |8 c: X
) Z$ n2 T/ p" W0 ]7 h+ `7 P! ~/ I
6 f! p- c3 r& w" X( o- {+ k真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作6 g' j* L9 d" b9 s, q# d# q8 ^  J$ n
1 E' h. E. W( _
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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