QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
' p% g" x6 S1 X# M' P8 i4 z1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1+ @" O3 X4 J1 s9 m( ]8 o: J
Untitled-1.gif ) @, w  L3 l! b& E

* s, G- Y3 d3 p9 U- r: b* P! r2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
( l/ h5 k6 e) K3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
- b! c1 w8 B8 `% S Untitled-2.gif " S% ]% A% }4 v/ l# L
* g" m1 }- I% s6 i! ]
4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
" j3 k- M! w, p5 J4 y-------------------------------------------------------------------------
8 ?; @+ u. c4 B# @( c7 zSub A()8 J( o* J- x" `/ |3 v
    Dim CAD As AcadApplication, DOC As AcadDocument3 z: t& |0 I) J: E" q
    Set CAD = New AcadApplication
9 X+ H& k, i, k4 z) b    CAD.Visible = True: j/ m0 D& p/ O; y/ l: g9 @
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)/ [1 H( l; _' U8 {, I( T* n
    DOC.SendCommand Sheet1.Cells(1, 2).Value% i# h' x. f& N
End Sub+ l+ |  d/ p  b! d( Z( g* Y9 h6 |
-------------------------------------------------------------------------
* D5 x! I6 Z" a1 A3 k见图3) G! C& B# S; B$ i
Untitled-3.gif 4 D$ ]" b5 F, [

- M! H1 l! l& Y: ^: S# ]5、在EXCEL界面运行宏,见图4, Z- U0 U/ W" Y% p4 m8 q3 P6 f) u
Untitled-4.gif
* c1 d/ X& P7 l& O/ E* o8 A5 X! `. y& ?" `# ]0 B3 S' b8 w( w# e
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5! X% W& l) |5 o# j! f$ f5 d
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# 的帖子

上面的代码改一下
9 t/ |6 ]6 x3 z% S: F8 l0 R5 Y---------------------------------------------& [+ a. s+ Y2 U8 z7 F- C
Sub A()' W! w& F5 X, e+ Y9 a
    Dim CAD As AcadApplication, DOC As AcadDocument
6 _1 ]3 u8 C' a0 ?0 l6 [! g6 Q    Set CAD = GetObject(, "Autocad.Application")8 |" }4 e* [  L% _
    Set DOC = CAD.ActiveDocument
3 I+ S; \' S, M( a$ s    DOC.SendCommand Sheet1.Cells(1, 2)
7 Y/ t' J- \8 V" h0 NEnd Sub/ C2 x3 l" @! e
---------------------------------------------
+ ^" M0 Q* m8 q, |本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接2 Q6 k# r! B; y; E% |6 |

" w+ y" Z2 J7 ^9 d[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?) j7 }% B# E) P) @

8 g6 {) V$ K9 G" n3 L7 D) I5 q( g& V[ 本帖最后由 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.gif6 |% E( E- l; a! }
不太理解你的意图,能否再说得详细些?
: d$ T3 H5 X+ t2 \  }& x0 K1 X0 x
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~# U/ j: W+ K8 e, Y  g

5 a4 }3 Z& q3 d  ~[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
* I8 z' L2 r7 ~8 |-----------------------------------------------------
2 A! c2 ]3 ?8 m/ ~' Y6 `. r5 |Sub A()
# u  h* t7 U. l  Y- z  Z5 L( O/ H7 n    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer& k8 w/ r& ^+ @; v) ^
    Set CAD = New AcadApplication
* e) y" u  D: l6 b% g    CAD.Visible = True
$ ]3 }: K) w) P; P! U. A    I = 1  y3 l, G) c7 {" m
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""4 q- Y8 I5 \  N7 G
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
9 b# }3 r- h. t" g        DOC.SendCommand Sheet1.Cells(I, 2).Value
2 B5 [. B, E7 g1 L2 ~        DOC.Save
' e7 @6 T5 G' r$ G/ a" c6 O* F' \2 l% E        DOC.Close) l" }6 M1 ?! v0 a0 c6 Q6 [
        I = I + 1
, Z; o  ^! v9 o" U    Loop
. E1 N: t+ |5 D0 e  o$ h5 |. A8 g4 l) Y    CAD.Quit( e) Q  K- K4 H7 ^
End Sub
3 o9 L5 \7 K, d; O-----------------------------------------------------------------
2 u4 y( D( h3 C3 G. p运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
  u0 A1 m9 |, X0 N本程序仅供参考,其运行的前提条件是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 W5 L. T" [4 W7 q% r4 O# S代码可以这样写
3 _1 ^% ?' [5 ?8 W6 v; V( o7 X-----------------------------------------------------: W( B1 C$ `2 w9 c
Sub A()4 H8 G& ]7 R; q9 ]$ k1 f+ C8 m5 x
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
! D: T7 G8 Y4 k, r' M) S    Set CAD = New AcadApplication
6 }* E" |2 ], ~. b2 k1 M    CAD.Visible =  ...
0 u% G, Y- G% |4 b- I( l6 v

9 C( F0 X* }( e9 u2 o学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
9 z$ R: u1 E% B8 I( |5 Y" R8 E5 J因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
6 E$ N# o8 E/ T4 j6 s2 _* {, z----------------------------------------------
6 f3 ?0 f! G. p5 C1 MSub A()
$ G9 p) O6 k; K) c/ ~    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
/ \  x# X# x2 I5 R! @% t    Dim DOC As AcadDocument '声明AutoCAD文档对象
6 h/ U) U7 r7 Y1 t- w    Set CAD = New AcadApplication '运行一个新的AutoCAD进程- u4 m9 @# \, h6 X$ C
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
' O9 Q+ r6 H! W9 K% |! H    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件" }/ X6 d- }  Q' k1 @3 j% q
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
" r3 T) \7 V  Z. {. o$ k0 _( KEnd Sub
3 a% G) R, _; n/ K" L; l7 {: h----------------------------------------------% D/ i: d$ w4 ?7 c5 T
3 l8 }6 l# _* A, ~' Y: z, k
6楼代码注释2 y+ h+ b2 Z$ E
----------------------------------------------/ Y, @8 e+ f6 i  e
Sub A()2 \6 I5 I" `# Y3 P
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
. G% o' x6 ^! l, ]  N    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)8 J- ]/ v2 x2 W
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
, {: S) @; q/ s& T    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
5 P, P, w; ]: G! Q' {End Sub
( y' E; B& y. y. A----------------------------------------------9 r- H% {. L% f
% M- o, c! E! S5 F6 W
10楼代码注释3 T- C* g8 ~( ~8 b
----------------------------------------------
; n2 o/ v7 c: ~Sub A()
5 o+ K7 u, K+ M* t3 T/ h    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)2 }2 y0 u/ ~6 H: O6 c
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程! {9 P7 N* Q* A
    CAD.Visible = True '使运行的AutoCAD程序可见
0 d5 W7 V% t  P- f: h3 P( \- t/ I    I = 1 '从工作表的第一行开始计数
- m! ?' g( W0 W! d# u' s    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
/ Z- Q, `/ Y' T0 f        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件1 Y3 _5 a) N4 i7 w& D# a  s
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令8 q9 d( E: t# f. v+ _7 Y- h& l
        DOC.Save '保存文件
7 i/ K4 J( Y& I% T. n        DOC.Close '关闭文件7 f: }! X, c' q0 W5 r7 e) n
        I = I + 1 '计数加1, g; A  f. ]0 f7 }# H5 r- N: M8 |2 V
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
4 b& \0 U4 I, E4 F  X$ g    '如果检查结果为单元格内容为空,就执行下面的语句5 Z2 L( B! }6 K% E, W& b
    CAD.Quit '退出(关闭)CAD程序% s( G7 C' P; d3 ]
End Sub
5 u6 R( S6 f: `! m. Q----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!& D2 ~+ H' i: U* }) j
版主说说看vba、lisp这两个到底怎么个差别
# ?& R( {7 ~( y2 P
$ v3 l1 @2 w; S# O9 V[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子& I8 |; T. |. o7 v4 j& H7 Y. z! r
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif( n" U6 T: ?6 a& x6 Z, L) d
2楼代码注释
) r0 n& R% M/ ^. u----------------------------------------------
4 G0 r# ]0 n( j& `* ?Sub A()6 C6 u4 q4 J7 E3 ~1 A  u) D
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象* d6 H: I0 |1 v2 Q3 Y1 G7 A
    Dim DOC As AcadDocument '声明AutoCAD文档对象
7 x+ S2 s" \8 p% q: I6 T' J    Set CAD = New A ...

, J/ z( V$ W$ ~: }% ^  Z. Y, L如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。0 i& V" b3 U$ O' H
实际上字符串中的空格(实际也是回车的意思)也可以这样。
( |0 V5 S8 n; S: [- q- A1 V另外,按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.gif4 i- u/ M8 ^  Q) b6 h) H6 Y6 ]

4 E' ~0 p  |( w2 D% e
, |2 b0 B3 K$ c' s+ h# R0 p学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

, V4 J. A% C* g/ ]3 F! x" O. i" V& w$ D3 L9 u; {
8 l: f6 l# D) c1 N
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作" i1 _. H2 f& \, `/ L$ j
$ }4 U4 Y. D6 G0 h7 e$ G
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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