QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
+ S; Q: }, F8 S/ [, q1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
% N; q6 ^* C: B5 |" J Untitled-1.gif 5 X. Z# B: g! S# A
8 x# E: `! c( n# ?
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
$ n- i8 w. }' N% J) ?3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
9 h! p. d) O& L+ q. C; f# m Untitled-2.gif
6 M0 H/ y5 {& }( V  b1 E7 o
* |& B3 B% O5 Z; \* ?, X4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
% W; K8 t6 Q4 k3 A. s/ ?-------------------------------------------------------------------------8 g* e# b( K$ H' n1 l/ i+ y0 ~
Sub A()
( H- j9 q* @+ x- s: B! u7 z( C/ [    Dim CAD As AcadApplication, DOC As AcadDocument
9 I2 W) x3 f7 C+ J% W6 j    Set CAD = New AcadApplication* T( T4 `. j) V/ [4 Z
    CAD.Visible = True
6 d3 n% n& C: c" U- I6 q2 H  r    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
. H- I5 f7 a% e0 w    DOC.SendCommand Sheet1.Cells(1, 2).Value
" m1 Z, N: e6 x+ ?% jEnd Sub
+ _8 {% x# o4 j3 E) @2 ]+ F-------------------------------------------------------------------------
0 Z7 g9 ?1 |7 c  e; [见图3
- _% k+ V" X# m* w- ^$ P6 e( { Untitled-3.gif ; ^: g7 `8 {# D% v  g+ {1 y

4 C( F# o* m+ d/ W7 c5、在EXCEL界面运行宏,见图4
) x7 A! v; \% Y; t( J8 j Untitled-4.gif
: f5 S& b1 t- v& I/ \
1 B$ z& j/ Z" }# k- J6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5) j' f+ F" H; Q9 u* u0 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# 的帖子

上面的代码改一下
" `  P, \8 M$ L. N3 h2 T+ K---------------------------------------------
8 j  P2 ?( u% E9 k2 P! \# PSub A()
, z& m4 j- z9 h  i# h& Q9 z; G! U    Dim CAD As AcadApplication, DOC As AcadDocument
) B; K3 U3 b/ f    Set CAD = GetObject(, "Autocad.Application")
. M# u: P, x( [$ x0 g$ B3 D    Set DOC = CAD.ActiveDocument# q( g" P) R4 x$ n" o' ~5 f& U
    DOC.SendCommand Sheet1.Cells(1, 2), h# M6 f- O5 e( w, R$ }' d
End Sub" z- Q+ H" w+ v# m: k! g0 u% W3 B
---------------------------------------------2 c  q9 q/ }- U5 A' }7 h3 w
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接; ]/ n* ]3 d" F' O7 r  W

% k! u% X1 @' `3 P, w  {[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?9 l  a, h; e. x- l% G( g" V

% W9 Z: ]' X. G( R' i) q[ 本帖最后由 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
* T$ @! f& z' g# y不太理解你的意图,能否再说得详细些?
( M- B4 L% n% i4 j7 D
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~. i2 _6 Y: u9 l" t( A6 c

, ^# Z, X6 s7 O$ I2 v; ^[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写6 w( W9 c1 Q7 m& F
-----------------------------------------------------
5 X( o! R2 F2 G2 E* gSub A()7 \6 Z& R! `$ N  I5 ]
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer2 f1 J" I$ j1 S; G, z
    Set CAD = New AcadApplication
5 e) R; e# y" O) c; ?    CAD.Visible = True4 E, w8 t# R" v7 Q, |4 e+ U
    I = 1
3 [. X& ]7 c. K$ t$ Z* Q    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""3 R: E" [% L6 J9 @: w% X) u
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
/ ?' {3 |7 X2 P0 o3 p2 F        DOC.SendCommand Sheet1.Cells(I, 2).Value6 f' m0 F% l* V
        DOC.Save
' N( J4 i9 Q' L* N" H; s* P2 Q  c% q        DOC.Close% c4 p  L0 S. J1 o
        I = I + 1
$ K7 z) Q$ Z/ H1 x    Loop1 f7 m3 A5 w5 |
    CAD.Quit2 E" K' }: @8 h( t+ J+ s8 h0 n
End Sub" N: Y+ ~% n8 G+ B$ r/ _8 z
-----------------------------------------------------------------( Y( M& _  J4 e" O* C& X/ c
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
) o4 N6 g4 |) g9 [9 ]) m' c本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif
, K" h; D4 @7 Y5 n& X3 O代码可以这样写
+ g( k' R# w/ I) I-----------------------------------------------------& F5 S, i; K( W1 u1 c' _+ [+ C3 r
Sub A()5 j' D' r! q5 u$ B3 h0 `5 C
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
: \, z9 F, L# n5 @2 X1 s    Set CAD = New AcadApplication
( r9 L% F$ ]9 l1 w) t" u    CAD.Visible =  ...
. \1 T$ ?! G1 m

& L  X- P3 ]2 Q3 D学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!2 s1 Q+ J$ G7 [! J
因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释( }" I& `! @9 J0 S. N
----------------------------------------------1 B4 C, w% }3 K6 B9 `! h3 L
Sub A()- t1 z+ J# y; F1 G% V3 J- u  f
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象2 \: `% B. @) |& j* E. G0 d
    Dim DOC As AcadDocument '声明AutoCAD文档对象% l5 u- N& o# B+ k' l5 g: T7 F: @
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
# j  Q! l% z5 e, Q, U" e  T' u    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。# R' b0 ~: i; B# ~
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件% D# f) x/ z; s! k, B0 P+ ]
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
, C' A! G- M9 Q0 `. YEnd Sub
  n1 m. v( Y+ S/ Q$ G8 x----------------------------------------------% I0 s& n2 ^$ A$ k- K8 n

( @# n" L3 _( c" f5 R; w4 v6楼代码注释/ q. X3 H7 d" }2 G
----------------------------------------------
8 }& \+ i2 J5 q' W. @; m, dSub A()
" F: T; q$ `' n! _3 k) m    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象# G3 t3 A9 H& w; I+ y6 L) F) K- r
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)+ M3 u2 Y, L0 w7 F
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作4 E# {- m0 i. y
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令7 N  f7 j! \/ v  ^- t5 T
End Sub
5 s& z! [: s% A" Q/ ]----------------------------------------------6 c5 O7 S0 O) p: i5 Z% u* W
3 a- b  ?, T3 ^% T6 j$ l. I( c
10楼代码注释
4 _# o3 T' W; h6 j; F----------------------------------------------
. T. ]# P4 u8 }+ X0 O( |: ^8 OSub A()& g2 ^3 x3 b& S( L2 M  ?
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
# g* i/ ]! N7 k4 W    Set CAD = New AcadApplication '运行一个新的AutoCAD进程; k( ?# x3 S& H0 R$ b
    CAD.Visible = True '使运行的AutoCAD程序可见
/ x0 w4 ~. |, I6 n* M    I = 1 '从工作表的第一行开始计数4 G4 O% [8 r2 o4 E6 O
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空/ _+ }. T1 g0 O/ P% u' I
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
* r* W+ a$ @9 e. D3 d        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
2 Y4 g1 U5 s5 i  {        DOC.Save '保存文件9 V" A  E' y( @0 f" s% h0 M
        DOC.Close '关闭文件
  Z# ?# j. \, [6 G  K" f0 b7 Y        I = I + 1 '计数加1
) W& z+ M0 ~( G# L0 Z+ x* N* v    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
1 T% b" t9 o2 I    '如果检查结果为单元格内容为空,就执行下面的语句
2 v8 n0 m. J$ v  ?    CAD.Quit '退出(关闭)CAD程序
$ g$ W8 S( p" _! ~% b6 u0 UEnd Sub9 M6 \! Z3 g. N9 @1 v
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
5 j  n# J% G7 X6 l& ^& g版主说说看vba、lisp这两个到底怎么个差别4 G* w3 x! M' @, |4 v8 o
  Z; ~( w# i2 y9 v) U
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
7 V. r9 T& f: G. o) F, X  C  r7 x选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
1 S' ?, J. D1 y2楼代码注释
" V# r: s" f8 B: v7 k----------------------------------------------5 B* K8 s$ m" A& M" m# X  w2 S
Sub A()
: K2 |: S1 F1 ^! }/ T$ ?8 D    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象7 x$ V) O8 z' }8 x, _
    Dim DOC As AcadDocument '声明AutoCAD文档对象
. X6 {3 b* |6 o3 ^/ H- c0 @    Set CAD = New A ...
8 |( A9 N: l! v. D8 S; {, N, T
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。: i" t+ h$ @3 ~+ ~0 {- ?4 a1 t6 V& \
实际上字符串中的空格(实际也是回车的意思)也可以这样。
! |( }' p% m% c5 ^& {8 B另外,按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: @( N6 |4 E9 i: B
- R8 s! ?/ z; _. ^2 O3 n; D# e1 g
4 {4 N. k% G) m( B
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
- l' ]# I, p2 p: Y+ O9 Q
3 t: i- ]( p# M0 H/ D

) y' S" k7 W# q- m, R真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
- G3 L2 l7 E* i' D  Q0 K; k1 }+ w
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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