QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
, y& X  @! G( |. v3 Z" K1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
  Z9 p! d0 ~2 S* E. x9 F& c Untitled-1.gif " U3 H  F7 Z& R. z8 [" J
* E" N" a3 _, G
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。6 d" ], g6 {7 e+ B; f, Q
3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。1 f, z4 n% z: M- T5 o
Untitled-2.gif
& y, U* P- {4 @/ d2 L0 k: ?" b( Q' _* i. k8 Q5 ?2 ]9 H
4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
5 S! o1 B4 K1 F" H3 g-------------------------------------------------------------------------
- q# _5 i. D8 _+ a3 LSub A()
1 W: C# q0 D& @- Q: \    Dim CAD As AcadApplication, DOC As AcadDocument
6 S: k0 S$ F& Y) C$ i- o    Set CAD = New AcadApplication
* c" R+ i, Y# S    CAD.Visible = True
7 ]0 |: E# j- b: g    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)- k* `4 x. j0 U% y
    DOC.SendCommand Sheet1.Cells(1, 2).Value, ^: U  ]- H$ c4 _0 Q4 o6 ?
End Sub
. A1 ^+ b; s* M9 M* l8 M-------------------------------------------------------------------------0 m' o6 V: N* w) K0 l6 ?; m
见图3* y% y7 h' M+ T( ^0 e- Y5 ^4 v% r
Untitled-3.gif
4 {, [# J# H( D- F3 j6 {! A1 D+ X7 ]
5、在EXCEL界面运行宏,见图4
3 s$ D( f1 s' B1 j+ `9 A( _  h Untitled-4.gif 2 N; b# J# c1 N2 a6 f8 I5 X
0 @0 R9 c& a# @5 n/ F
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5. |" u2 w  {4 b
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* f  I( M; Z2 ]( |: x' E- v---------------------------------------------
4 `( |3 g/ m  P9 m/ [* g- YSub A()
4 [" n+ U/ t* W. `* e, h1 u    Dim CAD As AcadApplication, DOC As AcadDocument9 ?" s8 Y* B, {% I8 I, Q
    Set CAD = GetObject(, "Autocad.Application")
; ]: u' A1 }( q    Set DOC = CAD.ActiveDocument  W: L) D. C; z% j0 [9 Q# ]7 h
    DOC.SendCommand Sheet1.Cells(1, 2). B4 _1 r9 X& g5 N8 M# B+ G
End Sub" Q7 ?* S0 \6 L& S! Y# k% a+ d
---------------------------------------------
6 P% _: ?! G6 o% W% j5 \本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
( m' {/ H+ A/ _0 r7 F/ _2 N$ [' Z9 m1 a+ E
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
# {& N/ S1 p$ b% O, F8 _( I6 b8 U" K& ]1 g0 @8 ^! O+ K3 S5 o
[ 本帖最后由 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.gif7 x2 D; A2 }" Y7 j* s
不太理解你的意图,能否再说得详细些?

4 Z" ?0 M6 d9 {就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~$ `, ]* q: V7 {

) |2 W( R1 N$ y$ v$ ]* s: h[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
$ W7 k' y# f6 [$ g. W* _0 L2 u: e1 h-----------------------------------------------------" a; w& i* Y2 n3 w8 x% N& W
Sub A()
8 E2 K1 C8 q8 D- f1 M& E% @    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
! J; w# ]; Y; X  c    Set CAD = New AcadApplication
0 c7 F1 {7 f! E2 D2 c    CAD.Visible = True) [6 [0 x1 {1 [# h: b) a  P
    I = 1
. U- S1 V) |) o    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""0 \! o: N. H+ `& S( V5 Z, C& [
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)" E- n5 G  ^# `" P& W: m" L9 s
        DOC.SendCommand Sheet1.Cells(I, 2).Value" V7 y9 a: m& Z& l6 z" N
        DOC.Save4 v3 D2 J7 [3 P
        DOC.Close
  j9 Y. v" r( x9 H8 ~, q$ X/ o        I = I + 1
% v: k& x; a2 `* Q0 j    Loop
% ~( i1 J/ d3 r8 a2 f8 I    CAD.Quit: `% J. N( e- Z2 L
End Sub4 ?( p3 V3 m0 Y1 h; ]
-----------------------------------------------------------------
  }5 v- z& L6 V4 C7 P/ n  Y运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
- R! n, h+ D2 p1 l5 b' f本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif4 ~, L4 r, M. Z
代码可以这样写: i, n) f4 E9 |+ x5 R$ k$ `' D
-----------------------------------------------------% @  }# u1 P8 T7 j
Sub A()
/ x* Z; r$ W1 X& u0 d8 S+ g- @    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer  i$ N  y6 A/ J. Z' n* \" ?+ K
    Set CAD = New AcadApplication
- y7 c/ N/ V9 z7 D. r    CAD.Visible =  ...
8 Q: g3 z2 A; ^% s8 y

" T/ P8 g/ V& h& Y2 y" |! f* t9 y学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
* u% U) e2 C) g因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释- @) P- v) p) ?7 z/ M5 a; J8 T
----------------------------------------------7 v+ i0 U" O" {7 I9 R% c
Sub A()$ y+ m! M9 B8 K. L8 Z6 Y# {
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象* t8 B1 P, P, k3 K! H$ V& D7 J: o
    Dim DOC As AcadDocument '声明AutoCAD文档对象0 x3 U0 f3 p. z$ k/ z
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
: U, g/ ^; ~9 [. k$ _1 ^9 L0 e    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
. \5 L( Q: ?. ~5 D    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
) I8 r* q  C0 t0 M4 Z    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令9 R- I$ h+ [: E4 _; c- q, Y7 s
End Sub5 P( V+ ^& A3 d5 G+ \
----------------------------------------------0 K/ o" H9 g$ H' X9 W
# X) d1 y* N; p
6楼代码注释
$ A0 G3 I  T5 G8 p9 w----------------------------------------------% O$ K: N* p3 A$ u
Sub A()
5 ~+ @* l4 e- q) L. S. ]6 ]3 v. Q" P    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
, B! i3 _  i# s    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
( u3 Q' X! W% N    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作9 A' M9 Y7 J& Q% |' g* n! Z' x9 t
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令) t+ h! x( Q& K. ?8 `
End Sub. G9 r) T$ o, k( W) y) Z$ a
----------------------------------------------
9 o. H! m1 q. o6 O# i# q! w1 Y8 [9 w$ i& k5 P- E+ L: [, M
10楼代码注释% t, g6 T, @/ A; s) r5 u: u! f; R
----------------------------------------------* u" K, \" k6 @3 R
Sub A(). K% u7 d/ r& j" B9 U5 u/ a
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)- I4 @4 q: O* Z- n" t5 F$ ^
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
/ b: w8 c9 \* }! O% n    CAD.Visible = True '使运行的AutoCAD程序可见
5 g: L! o2 e& l3 [    I = 1 '从工作表的第一行开始计数4 T5 @" _& z" ]; i# H8 L
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
* L) Q+ n) E" @        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件1 E' |! b4 X$ w3 ^% \
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令1 k7 c# v+ h$ J# ~( z8 |: f
        DOC.Save '保存文件
1 n% k: J/ b7 g( ~6 n        DOC.Close '关闭文件5 D- ^! I6 {6 X6 W% p+ K/ P. e
        I = I + 1 '计数加1  q( E  w* ~. }$ k3 D, n
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
4 L- D4 L' @' q, F  t    '如果检查结果为单元格内容为空,就执行下面的语句* o& K: x( ]: l2 d0 L; P6 C
    CAD.Quit '退出(关闭)CAD程序( e, \0 q5 @8 g) |; @, i2 [! Y' A% G
End Sub5 |# T+ y. E( g, U
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
$ `# s1 B% [6 l版主说说看vba、lisp这两个到底怎么个差别6 P2 Q: J, P4 b

5 O" }" K: f  e: H4 E4 U, C[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
8 r% \" V- G8 c. f, z& n" r; d. k选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
& U' Z# Q" x6 `1 V  Y2楼代码注释
& V+ y3 u7 M5 u- y0 Q----------------------------------------------
8 W  w  E5 I# gSub A()
, B3 E0 N7 n( p  f  b    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
6 k- S/ M+ R: j  |    Dim DOC As AcadDocument '声明AutoCAD文档对象, a+ H2 a) l1 [  s4 ^+ G) K$ X
    Set CAD = New A ...

5 l1 j( `8 u$ ]3 d6 {. i! x如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
, s% H+ X5 `4 m8 C# {3 w实际上字符串中的空格(实际也是回车的意思)也可以这样。" R0 y+ C1 G- R9 Z3 P
另外,按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.gif1 X' ~3 {1 B- [8 w4 |( N7 ~
2 J+ n( S, Z7 _2 V6 [
" t5 y7 r% D  |
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
: E3 F- ]) N3 H* @8 Y. S& [

3 ~' z" G0 w8 T7 v" ]4 _! ~
: R8 U* B0 b5 b8 t5 M6 l) O真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
. V9 ]0 W1 z" h; T: i! `, m) D- K; Q/ s( G; N( g. b9 `( U
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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