QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:$ J4 [' o  \( x3 d& X
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
4 R0 }- }  Q8 E  p0 [- ` Untitled-1.gif 1 g- s0 ?6 T# B

" H$ C8 N0 \, K5 s- N' W) \' B2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
; B: [9 S8 L5 ^) R3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
/ I! }+ {) t* U% d/ t Untitled-2.gif
0 C+ T* ~7 \8 S8 w0 r/ m, {" H' d9 U3 o* P6 j5 Z2 q
4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码" u0 r  W7 A! _3 {/ d
-------------------------------------------------------------------------$ |6 L, M+ d$ |( N" S
Sub A()
2 Q9 w! h; V6 ?" p# w  S4 _. N    Dim CAD As AcadApplication, DOC As AcadDocument
+ v/ F, x; ]' a' @3 w    Set CAD = New AcadApplication
" I! y7 _, v& E7 C8 d+ ^- D7 s    CAD.Visible = True! p5 S' s; S1 n! |5 G0 E0 d! O
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
, M& {6 \# D  w- B' Z    DOC.SendCommand Sheet1.Cells(1, 2).Value
  j9 y" r5 p' D* j" cEnd Sub
: i( o! z* B9 }- V+ `0 R$ }+ `-------------------------------------------------------------------------, d# u7 \* q8 B* T
见图37 I4 V5 l" P" d7 P, b! D$ w* @
Untitled-3.gif
# n+ D: {3 s$ S; ?1 z) o
8 ]; r5 A* @, w* K7 z" @8 z/ H5、在EXCEL界面运行宏,见图4$ {8 }# ~+ @8 {
Untitled-4.gif 5 R/ q- @5 `  ]

( K  D9 @6 d1 ^; v6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5' ?* r6 l" h* |# a. J" o
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 }/ h/ c# }2 g4 z- p---------------------------------------------2 `4 a) T* K" B+ z+ j& W
Sub A(), G: [5 p" m' V. G2 G# q
    Dim CAD As AcadApplication, DOC As AcadDocument
3 ^1 N8 F3 c( C    Set CAD = GetObject(, "Autocad.Application")
* t. g5 Z. {2 d8 A, p5 e) D4 w$ C$ E    Set DOC = CAD.ActiveDocument2 e/ F  r3 s' l% R/ [- p4 |! L
    DOC.SendCommand Sheet1.Cells(1, 2)+ R2 @& P/ e+ x0 {  t$ H2 g
End Sub
$ i, m( M) k6 s8 y$ b---------------------------------------------
7 S3 v6 p% z5 O7 j  w0 e: V; J2 D本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
1 ^/ P( P/ p7 ]( Z( K, f* K6 v( ?8 h, T0 ]1 q. B- R) c
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
; q3 q* O8 ^: i: l* u9 K7 S
# C9 E/ ~: m+ W[ 本帖最后由 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- s9 T8 I9 d$ C7 g! ^, h
不太理解你的意图,能否再说得详细些?

" [: W$ F1 U( M. ~- R* A5 x就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~7 Z6 u& H) m; Y# B" ~; Y/ l3 _$ f7 `
' [7 E; I! w) n/ h% ]
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写) }7 n' [4 S4 \( \+ Q
-----------------------------------------------------0 V7 v4 Q# m% g3 v- D5 g) v6 H; Q
Sub A()- q  E( T. {2 l0 L
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer9 y+ o  W0 [3 e$ W
    Set CAD = New AcadApplication
( z! s2 G3 B% Q% E: o, W2 K    CAD.Visible = True. Q3 g8 y& s# h9 i! N7 s+ u  I
    I = 1: O8 v3 E/ |# ~  M6 W- b+ S3 I
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
4 Z9 E: M1 r! @( n/ C3 a0 l        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)% c' W- j( U/ }/ B
        DOC.SendCommand Sheet1.Cells(I, 2).Value
  P7 \, q- Z7 Y+ @2 O& x9 E) L        DOC.Save" N5 {9 ?$ y6 |" @' j4 {
        DOC.Close
. h+ P4 W/ L7 l        I = I + 1# }8 j. }! n6 @' B
    Loop
/ b0 V: p1 Z8 B1 @    CAD.Quit( @: f* |  P+ T0 S
End Sub7 b1 u: s* f' ?! s# [* h  O
-----------------------------------------------------------------
! x% b/ }8 [) a运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
# w/ v+ _$ f( U) g' ?本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif8 S- Z1 S2 K5 ?( j- o+ f) v5 t
代码可以这样写
$ F; x9 B# t7 }( e6 \% w" ]-----------------------------------------------------3 _( G0 R8 n4 x9 R
Sub A()6 Z5 I: ^. a3 J0 {+ t! e
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer9 T; g5 f0 J( e7 ^# u
    Set CAD = New AcadApplication) A/ \2 L8 w) x$ l4 |1 S: }
    CAD.Visible =  ...
7 x$ F$ i# C4 R- h/ O: q9 K

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

回复 13# 上山蜗牛 的帖子

2楼代码注释
, D+ Q3 a- j& R) v7 U$ Q3 \----------------------------------------------
4 C1 G. |* f1 x7 pSub A()* i* ?0 ^& _. q! a# m" j8 k
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象- \2 `# D' b* j. e% M+ ~
    Dim DOC As AcadDocument '声明AutoCAD文档对象
' R% U( }9 N7 V4 x* t( n5 o! P- i    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
: Z& [4 Y% L7 O" y& M* F    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
& U7 Y# v6 w0 x- I    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件0 d$ R: ]& W0 @
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令$ a9 J: M( D6 X
End Sub
; x7 a, y# J) K% T8 N8 y----------------------------------------------
2 m2 Z* P- B: d2 W) Y2 `8 b. p8 o4 \
6楼代码注释; J( [9 L" \+ Q# E5 Y( W6 d
----------------------------------------------
9 C& }- A3 x4 |Sub A()% A) ?  P4 F. h4 |
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象0 i& z, m1 O! Q  P, t9 w! }
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)1 \; m+ m  z* K6 f
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作1 Q8 k' ~$ E5 {, e0 d$ A9 {+ Y
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令( ~0 T' O/ k! A3 Q+ b
End Sub: ?! z' `( C& i, }3 D/ L* _
----------------------------------------------
( G& a9 ^6 _7 M. ?; K
+ O. X7 g" [5 \4 S7 F! i4 X- k9 ^: t10楼代码注释
3 |  ?7 c# U, N----------------------------------------------
, U2 H, r! ^, B. V) g/ ?; l$ j. QSub A()- _6 N9 V2 ]7 H% W
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
% L& B6 N! c* T2 @9 ?# J3 q2 a% G; ~    Set CAD = New AcadApplication '运行一个新的AutoCAD进程* H' w8 T7 z3 R, J& Z/ T1 b- f* f
    CAD.Visible = True '使运行的AutoCAD程序可见  ?; S; h# g$ i* ^+ v5 l0 M" m
    I = 1 '从工作表的第一行开始计数& p- T5 A2 E9 U% ?% j4 p( V3 D! o9 P
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
1 |( K+ m( F" c; S* S; s        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
* O2 f, u  {5 t3 I% t" C2 `        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
% q  o& [" C8 F. _+ ?: d3 h; S        DOC.Save '保存文件
# V8 Z  @. L5 C. O$ R/ M! {        DOC.Close '关闭文件& X/ c9 W3 {7 z7 u# u: H8 u
        I = I + 1 '计数加1
; D- Y1 v  I# y& V# p3 @' a    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
+ Q1 Z2 n. }0 E& s& z* I7 h    '如果检查结果为单元格内容为空,就执行下面的语句8 o' [( j0 Y0 \) m, h! w
    CAD.Quit '退出(关闭)CAD程序- P7 y6 l3 x# B. B3 q, V( l1 f
End Sub
7 ~: e& ]( d6 f6 q----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
; N. K' W* g6 U8 Q' K% w  B4 d1 h版主说说看vba、lisp这两个到底怎么个差别: e# W' m' o, y1 r
- v. Z3 I: }- ^4 y
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
/ e6 n( M6 G9 S1 U/ M" |# M选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
2 r1 U4 N* W. D( T: C% F2楼代码注释) l* E$ G. }; H5 y
----------------------------------------------, M0 Y& ^$ b. w% }( X* V, o. V
Sub A()" ?( d% w) S0 _% L, _5 q- p
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象8 k: ]  |# Z* g" `
    Dim DOC As AcadDocument '声明AutoCAD文档对象6 K- Y( i$ T& I
    Set CAD = New A ...
; G) l- B' G8 ]) p1 l+ p+ v
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。* W8 E6 e1 i2 i) |% ~" |2 n$ L- p
实际上字符串中的空格(实际也是回车的意思)也可以这样。
( D: V9 R4 q+ l+ D另外,按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.gif9 C+ S) D% p/ l( [

4 j' w  o$ V8 a. L- b; n/ n
, w8 d9 [7 g( c. r学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

4 F. E0 V- R2 V! p9 T7 n2 T# w" ]+ B# S3 F& l
  Y/ N  ]/ ?+ f8 q' V+ Q
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
1 {6 ~/ ]3 {' k& a# n% ?: i- Q* [% ~0 i! d- h
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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