QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
$ n( ~- a$ _# G8 L8 q$ N1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
' F- v9 l0 n3 f' w& f* c7 k Untitled-1.gif
* V2 h& Y; E3 ^  w0 w
4 ?$ G4 Y, [. p- g6 r1 r2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
) Z5 G, {+ I# v8 H0 G3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。3 n9 b) e. T. E& O% ?( V% A
Untitled-2.gif
/ i/ Q5 G3 C& h% ^: m) y
! }# J/ ^; E8 ~" s4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码3 A7 J4 J. F# P& a6 Y
-------------------------------------------------------------------------2 ^, u3 C' g/ U9 j# x- O* X
Sub A()+ T( a! p2 z& _  V0 T
    Dim CAD As AcadApplication, DOC As AcadDocument6 m1 c: Q) D* P; J4 [* t: v! ]
    Set CAD = New AcadApplication. Q7 M1 b' E* @- ~
    CAD.Visible = True
$ N4 g4 C8 ?& f0 k- o1 D    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
& k0 J; x, K! M1 n, X" K    DOC.SendCommand Sheet1.Cells(1, 2).Value2 M& `7 M( c- U9 R7 U) h3 ^
End Sub
/ h* n& O3 L* P-------------------------------------------------------------------------
8 `# N, D1 S+ J# Y8 ~5 c5 @见图3
7 w1 z4 o( H( w: w& M. U% b) l Untitled-3.gif
0 Q' r) W5 w! a( N  I. j/ n; A/ C, S3 |8 b9 w% O# y
5、在EXCEL界面运行宏,见图44 Q" s! T: A9 @3 P! {) n" k* s# H
Untitled-4.gif 3 k) f* N& i# `- G0 c  I

9 ~- \+ r: f0 T; [  U0 v$ s6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图52 w6 r: y  I! s& W5 }) e7 x
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# 的帖子

上面的代码改一下5 U2 X! Q$ \7 K+ X  F, n1 p/ r
---------------------------------------------9 _, \* v5 G* Q3 Q
Sub A()
! Q0 i/ |$ g" _6 y    Dim CAD As AcadApplication, DOC As AcadDocument
, E  t0 i6 p7 W0 @- E1 X    Set CAD = GetObject(, "Autocad.Application")0 g* I0 s9 l  ~" E; e
    Set DOC = CAD.ActiveDocument
/ ~. ]/ d9 m* d* }( {- p, ~" I$ M- Q    DOC.SendCommand Sheet1.Cells(1, 2)
" G( W, M  c8 R  DEnd Sub
, F( Y5 m6 d6 K& ?/ J---------------------------------------------
# |' g  e+ Z" n  e' f  F本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接2 c; ~  t( b( W' v2 a* S
7 ]" j! t2 v6 e3 k/ U( }
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
7 `: l* J- [3 N; b: K
* r. o, O" I/ {; |* ^, y- A[ 本帖最后由 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# A; R/ C* ?% L7 @- T1 ?
不太理解你的意图,能否再说得详细些?
; q4 G' ]) M4 O1 [. s: o
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
+ l; C+ S% A7 a# b1 {* E! D. H
7 y. g6 g% o1 n9 z2 o7 g, ?5 F' ?[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写  [  O3 W$ B$ M3 ~* }, U
-----------------------------------------------------; n" O% b# I; o' [8 {
Sub A()
( C( R0 `( K, j8 K9 G1 R    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer' K1 y( n6 A1 }& z7 z
    Set CAD = New AcadApplication$ h- n% N5 w% S& v
    CAD.Visible = True
- ^* K5 p( W/ Z3 `, S    I = 1; e- H0 G' ]$ v+ j! b
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""$ B# ]6 x+ S2 U3 u" _! D, |, w
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
( r6 ^3 l* E2 N2 A        DOC.SendCommand Sheet1.Cells(I, 2).Value
$ P; w. b2 l3 I) V# p        DOC.Save# J$ H- C& `$ Z# C9 H
        DOC.Close% b. B6 e- t% c
        I = I + 1
2 r( y2 I8 V7 i; q    Loop' n6 j( G" S8 X' ]7 u4 }5 _: n* [
    CAD.Quit
2 ~, i3 y, a1 _4 b( n; G$ L9 _0 T5 CEnd Sub3 l6 }' T- m9 y  B. q# p3 |3 L
-----------------------------------------------------------------( z1 E) t" e+ L( {6 P' J- K1 T9 `8 p
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。. p& ^% w8 C9 t/ _1 Y
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif" l0 u! w  z0 U( @# g
代码可以这样写
6 g% j) h) T. O% q, Q  n; d' X-----------------------------------------------------1 M# p$ N' V0 |" v3 b
Sub A()
# _, \* s  \& {2 u9 m    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
5 u1 d4 K" q5 R8 B4 _: ?+ H" z    Set CAD = New AcadApplication
3 m7 J+ |. P( M8 G# K! ]& \    CAD.Visible =  ...

! s, n7 h- b2 V8 _7 x* u  s( b! m+ Y! I
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!' h# r3 n  X7 B3 e" \9 ^7 i
因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释7 L- t2 j) I9 h0 N5 |
----------------------------------------------/ F4 |- ~, M& o0 I
Sub A()% p3 c2 q  e/ l4 I* \
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象7 B! ?6 v+ W- J2 ^/ i2 r+ Y
    Dim DOC As AcadDocument '声明AutoCAD文档对象
1 O; \. M; R8 d! H' c    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
/ e' ?& v" `, P3 Q4 w    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。" }: U; v( f1 j4 c" X) t1 Y
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
% t  ?8 i1 S: x    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令7 Q! g, t) v4 q3 U: Z% P
End Sub
$ ~" `2 \7 I7 N) a9 i----------------------------------------------
  ~1 @4 E5 S3 k; P1 t
- J9 W9 E) F) F% {6楼代码注释# c3 A3 V' t/ B6 D. @- E! Y
----------------------------------------------. Y1 }  Q  B/ ~9 G. ^$ O+ e
Sub A()+ K6 g/ r0 N1 Q+ ^, K0 E
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
! W& p" U; z# ]  k) h& }  B' R& l    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
) X: S. T' N% N; r5 K* T    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
+ V- d5 B! N- X0 D9 H0 X2 ~# t    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令8 Z8 w. t1 C# p
End Sub
0 c" g$ T: ]# @# W# |; l  [----------------------------------------------7 I1 E2 ~2 V& b" w  X1 ?& S  a7 F

1 `$ M7 @8 ^, F# `9 ~; J( |10楼代码注释
, J9 B& s4 |! Y6 t" g( N----------------------------------------------2 d! ~( f4 `/ _" b/ N7 Y5 K; J& J
Sub A()
6 b. u9 h+ P  j- k0 f$ I# D; |    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的). L) |. ~- A' p
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
* |9 }) O, l7 o7 [$ D    CAD.Visible = True '使运行的AutoCAD程序可见
3 `  }, z& F4 x# x, @9 o  @5 c    I = 1 '从工作表的第一行开始计数
& x* S' A) M; S    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空% M+ r5 K# [2 h, E0 j1 B
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
, `% Q% t1 ]( B. E, d        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令7 @) h1 h0 `$ _" r8 Y2 B
        DOC.Save '保存文件
/ D. A; }' I0 Q* w        DOC.Close '关闭文件5 q! Z) `) W, J- |6 F2 S) _
        I = I + 1 '计数加1% i) `/ F4 e$ N
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
8 d9 |0 d7 `/ O7 I, b    '如果检查结果为单元格内容为空,就执行下面的语句! G/ [% ]2 j; p, c0 c
    CAD.Quit '退出(关闭)CAD程序2 D2 j5 ]$ [2 Q
End Sub
( _1 |, B( D- u----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
% P2 g! i! {% B9 ?版主说说看vba、lisp这两个到底怎么个差别) i+ s- I0 P! F+ {$ ^

6 m, _% K3 w: B; Y- O: h[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子4 }) [4 d; B7 S5 q. r+ g' g; D
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
. |2 p( Q" U" n+ a2楼代码注释
* \# C% [4 T' P  U" ^9 u6 J----------------------------------------------
. z$ b" g  s" K% JSub A()5 u; Y) W; q5 Z) ?# A$ B0 S) T
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
! T  z+ N0 i0 q; y! y+ R    Dim DOC As AcadDocument '声明AutoCAD文档对象. {0 P7 z. T8 l" p) A0 r# ?4 ]
    Set CAD = New A ...
5 ~6 S8 g# p+ b, \# a0 w* j5 @3 G: p
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
, L* `2 L* |# [/ m" p实际上字符串中的空格(实际也是回车的意思)也可以这样。: D2 C/ L" G1 |
另外,按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.gif0 q8 p. z5 t, ~5 i3 [
6 N: x" J9 `2 i$ h9 g. d

7 B4 c) \$ ]/ \% `学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
: a  l0 B3 U0 F) a0 A5 X% M

% q0 y1 ]5 X* j+ @
8 g. ]1 O* U( v  M真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
& ?# U+ Z! {7 w6 @2 C/ a) B
, h5 @! @  i- _, X" a如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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