QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
: m  H2 g' K  Y* P1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
) X3 b/ e5 b/ Z) V! \: B Untitled-1.gif * X1 a% a! u) i
/ M. b& ^! {$ }  C
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
- q  K$ U! l1 q! f3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。6 I4 m, V6 S# |' x) J; Q' f
Untitled-2.gif : r9 u+ c0 R4 D+ U' d1 s

* ]& g4 q( V' ]4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
4 r5 W& ~, P/ p: e" f-------------------------------------------------------------------------
2 x% |& e/ C. U! qSub A()
3 X/ N: y% p( X+ ~& Y, C- ~    Dim CAD As AcadApplication, DOC As AcadDocument" c. L0 z# Z7 I
    Set CAD = New AcadApplication
& C- g5 P; R- Y# I; Q( N6 [  J  m& M    CAD.Visible = True
9 {' K+ n+ E- Q' o: Q    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
3 v( O) s, k( a9 h6 E& O    DOC.SendCommand Sheet1.Cells(1, 2).Value
! O, n+ b  y1 u) V/ i! v0 BEnd Sub$ c- X5 W- ]! Z' f+ u( ?
-------------------------------------------------------------------------* a$ j( X# x, n, }# C- }
见图3' N( w8 X$ ]7 w6 v' s% j+ y9 W
Untitled-3.gif
" }2 Z( x2 }. K3 b  O: d4 D9 o0 h
5、在EXCEL界面运行宏,见图4
7 J. G! p. e  B! ]: N) S9 C Untitled-4.gif * W1 F* T5 w$ X% O
7 x, @" G% T9 `+ Z* }, B5 d4 V
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图58 z; ^6 `# ?3 S- v  o7 s. S
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# 的帖子

上面的代码改一下
. N- `' l, J- C---------------------------------------------
, R6 h# p' Q! M. U3 g$ |1 GSub A()/ L; H$ s* h# z0 w
    Dim CAD As AcadApplication, DOC As AcadDocument
& l& d3 \' V, o1 i( e    Set CAD = GetObject(, "Autocad.Application")& T* A0 f4 R2 I2 L) d
    Set DOC = CAD.ActiveDocument: c' {- p7 e1 b* f0 B
    DOC.SendCommand Sheet1.Cells(1, 2)
5 b- u! ]  ?2 }0 g5 [End Sub
6 L+ l! j3 q) d  w* J4 U: e9 N: h---------------------------------------------8 p5 n: _9 G6 u1 ]8 _, O9 G8 Q
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接0 n6 ~- z! x8 ?" y3 \" R
2 S) [# C, O: s+ n/ w" S
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?- m& N4 t4 h. I9 P' c2 G% R6 W3 v
6 {* b! U! y% W% f& i+ i
[ 本帖最后由 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% d8 l+ N2 `$ X. e/ q" v7 I
不太理解你的意图,能否再说得详细些?
2 M* V: H  {9 a) t$ y
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
+ c: f& ]+ V- F9 J' Q0 {' [: B
8 q9 B/ ~7 J0 G[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写: @4 e0 Y3 [$ G' F+ v
-----------------------------------------------------
! T4 i8 ?: K( p) c' C6 U$ CSub A()
4 u# }- F( f) o2 ]    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
' _1 P3 i" F& p$ g    Set CAD = New AcadApplication5 D% R$ ^9 f- l, r' A2 _
    CAD.Visible = True
+ M, m% E7 \  }/ B! S    I = 1- n, n, o  r" U% `) |
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""( k4 D  Y+ M% g' l4 N
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
; p- S# [6 W8 O5 C- ~; P        DOC.SendCommand Sheet1.Cells(I, 2).Value1 ^6 \$ m# _1 u/ {9 [
        DOC.Save
: g: E) y9 C' h" [" t8 K: f+ h        DOC.Close
9 K$ [0 U5 B. L# \/ ]" x! D        I = I + 1; h7 t3 f; r* R* f0 x
    Loop( i1 m3 a$ Q* ?' Y, C) E- N9 W6 N
    CAD.Quit
3 F7 c6 V/ P; f" `/ B- Z% p$ IEnd Sub& K! D" I0 H/ h* D5 g# b* d$ b1 D
-----------------------------------------------------------------! ^; _6 V) x& l
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。& S/ M% Q' F. W* J6 g
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif2 d" t4 u1 T" R! l& ^
代码可以这样写
9 ~+ ~5 I0 p% q# r* p: p9 M6 n-----------------------------------------------------
, g9 @& i" s& @) N3 L, aSub A(). L3 i* s6 V9 ~
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
0 C. n6 T2 f, O& Y) V* a2 ]/ K    Set CAD = New AcadApplication
2 M5 u% I1 P6 P- K' \# V    CAD.Visible =  ...
5 f7 {: k! N: |5 f) z

) F/ {/ k: P& P# e0 j1 R+ f2 e学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
' t( w4 B: P9 U+ t/ |7 u1 ?因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
, {7 c  @4 u4 F# Z5 H, F4 k0 \----------------------------------------------: ^: n+ K( c! ^/ a% Q
Sub A()' t; u1 i( [0 g3 D2 Q4 n  V0 M  R$ D
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象- f! }3 i% e. p. C
    Dim DOC As AcadDocument '声明AutoCAD文档对象
7 t# X$ u7 G! E, q3 q    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
' U( R  }( g4 M" j) F    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
) m$ O$ q$ e2 E$ Z    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件' M/ S8 E9 u' U3 q$ I
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
5 b( L. G# ?2 \: _End Sub2 m# m% }3 _! G
----------------------------------------------
: ^  o: R7 N5 x* k" m9 Q) C7 P3 `* J9 S# b
6楼代码注释7 t# I7 }# s  g1 x
----------------------------------------------2 A4 k8 f- X$ N9 x$ R7 I
Sub A(), E$ E5 Q* c4 O, h/ _
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
! A1 r- t6 x2 d- N0 q    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
" x. m5 M" u9 Y" l# j- Q    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
5 [) T, G/ j* g    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
" |, A, n3 N5 l3 V7 q% `; p; fEnd Sub) [8 R2 T9 ?% e! H- o  x
----------------------------------------------* n: s+ p4 i! C1 [
* \( m/ F$ J# J) i; @) }# m! S
10楼代码注释
, _( T, l( ?! L. u; J----------------------------------------------2 U! f7 V, x5 V  ^+ g
Sub A()- F; b* x  r6 e
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)& _, I" g- w& v/ V: Q2 ^
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
4 ]: |" L1 p$ S" V2 r) h. q    CAD.Visible = True '使运行的AutoCAD程序可见
+ f* F0 }8 w( j! w: F    I = 1 '从工作表的第一行开始计数' R7 o* ~# \* g, g, ?; d/ h
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空9 }$ @9 J; G7 e* y8 P: |+ L
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
8 X, I; \  M* ?& v/ q) i/ S        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令0 Q! L# x4 k$ K
        DOC.Save '保存文件
* q  W) s; e& O0 u3 W        DOC.Close '关闭文件% ?, Y  a2 b' b+ Y
        I = I + 1 '计数加1
; B% q3 ~5 L* C$ T* j    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
! H& _% k$ `5 S' \7 `; M0 a    '如果检查结果为单元格内容为空,就执行下面的语句/ J) a0 @  h" ]8 N1 q. t
    CAD.Quit '退出(关闭)CAD程序
# F1 N1 v, I: Z) @: U3 x' yEnd Sub4 m* w9 Q: O. h- A( Y" n
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
. \3 i( h' G$ Z9 E" z% s版主说说看vba、lisp这两个到底怎么个差别
2 U# o+ \2 f6 f* e+ v* B" D% v+ c
" N& l% X1 O% l4 `[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
# q* B0 L- Z4 g& Q2 ]选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
0 @8 v; N$ |5 |9 `2楼代码注释
9 D/ O$ y9 `8 L) H' k6 t, y----------------------------------------------
6 }3 k& z. {0 i3 W+ x" d  tSub A()3 E% D' v/ C, _! Z& c
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
. F0 l$ q( x  X$ t; q3 I    Dim DOC As AcadDocument '声明AutoCAD文档对象
6 c  I6 }- Q7 }/ `' {5 U7 u5 G! \3 h    Set CAD = New A ...
% Z$ F+ T1 Z  b0 o. U1 q
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。8 H( _0 N1 m1 Q: \2 L1 g
实际上字符串中的空格(实际也是回车的意思)也可以这样。6 d. C; u( f) G1 V5 s4 N$ K
另外,按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
/ i# x" w2 b! v. A
) w, I4 M+ b* w" f* R2 ?
8 Q$ w' y+ @, K: O3 b1 A$ O学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
9 z% W0 x6 t  j, M1 e+ |
" Y! r2 \8 |- G6 i1 s0 N; C

6 d4 y9 q: _8 ]0 D8 G5 X3 V! |真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
9 A5 _$ n/ W) {, @, U) O/ P8 @! {0 F! L6 k
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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