QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
; u# t- i% ]( k9 p$ M1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
1 M( o- \, P% y Untitled-1.gif 4 R8 ^% K8 w8 T/ I( C. T& Z9 r3 j4 N) B3 M

0 n6 H" i& E- z& S6 _! N/ z1 Y2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
2 N8 [1 ?$ |3 n: }' Y: l( \8 e+ `: d3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。6 Z8 w9 R' K9 [0 {
Untitled-2.gif . p. X3 h) i1 `2 V% S0 L3 _

2 |6 I6 f- P$ f0 T4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
- x& ~1 j3 B: u9 m-------------------------------------------------------------------------
; ^+ h; r& `+ v2 ^( o  G1 t8 |Sub A()) O- ~) G8 d+ ^1 ?, h6 l
    Dim CAD As AcadApplication, DOC As AcadDocument5 @- D& Q$ V- y! C0 F
    Set CAD = New AcadApplication, y( z* J4 K4 W  f
    CAD.Visible = True
# G5 t  `; [  [: d* `    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
6 y- B  O* u' Z- w' F; m    DOC.SendCommand Sheet1.Cells(1, 2).Value& U; J# N% `' z/ g* |9 x+ b
End Sub7 a( A  h& z/ g/ a$ e# b/ ]
-------------------------------------------------------------------------% O* p& f+ q# K7 x& f6 @5 c
见图3
$ |: s* a) @7 w Untitled-3.gif
- z4 x1 y, S+ K+ Q1 V" ]
* A$ \. a# ~( g5、在EXCEL界面运行宏,见图4
5 W1 O# K. H& @2 W( W Untitled-4.gif 9 _& \. l# W7 m% S
+ z+ f. e' r. L: `
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图55 Y! A6 ?4 m; T/ `9 r2 X5 k
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# 的帖子

上面的代码改一下
. ]  `4 I* B! D/ e  M---------------------------------------------
! u, {  X6 |5 ]Sub A()
9 g( T- D6 e( \" ?) H! _% Q    Dim CAD As AcadApplication, DOC As AcadDocument
$ _1 G- C1 e( W" W- U- E. r, g    Set CAD = GetObject(, "Autocad.Application")% w9 D/ s* B% I7 W6 ]4 }
    Set DOC = CAD.ActiveDocument
7 ^1 T8 l. @: e& h. C    DOC.SendCommand Sheet1.Cells(1, 2)
- `. b; u( l1 c6 S8 zEnd Sub
/ v; L+ z2 E1 B---------------------------------------------5 m( {8 w, O; V3 a6 j2 G
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
6 U' o% m  ~, E; c+ V- J/ v2 X
+ e+ V+ j8 r3 R) L" |[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
+ v* M3 {$ x3 ~
- I  O2 [. l  ~8 ~  d( s% M/ }[ 本帖最后由 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- H9 |5 M; o" K& e/ M7 B: R
不太理解你的意图,能否再说得详细些?
0 ~5 c& O) l4 [( _! N8 A9 f4 R
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~: X- _$ z1 t! ^$ s% L
& o; a7 e7 {" d+ |; C" k$ c
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写+ A, G7 a" B# t" m" l# |- K0 p
------------------------------------------------------ m  R" {! G1 b5 v6 j
Sub A()
2 V: o+ v! L1 X+ A& H    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
# i: t2 S- e& J. `! q4 w1 @  Y    Set CAD = New AcadApplication* e/ @1 X8 t% X' Z; i; n7 E+ ^9 [
    CAD.Visible = True4 O! J% U. \) W# C( u- P
    I = 1( k3 P. U) y& d7 Q" u
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""% P. g/ v& i( w. R7 b
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)3 \7 x/ F0 @' L0 [
        DOC.SendCommand Sheet1.Cells(I, 2).Value; J5 y! b( g- A& u( Y1 g7 Q5 |3 A  ~, q
        DOC.Save5 J& v! j; a' X1 J- x. }- i
        DOC.Close
( ~! b4 O# b7 s- d6 ~        I = I + 1
* J" z) |; C/ l: @( C3 p  v, E    Loop" l1 l3 b& r7 ?  r# N
    CAD.Quit
$ p4 `! ?" q3 `7 nEnd Sub, w/ D6 e3 t" `% _6 ~
-----------------------------------------------------------------  ?6 ~1 `5 I, @" L' e8 ~+ a
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。, p4 j0 k2 o6 D
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif
' R% J8 E! o* {代码可以这样写; r" z& y- F9 `# B3 h
-----------------------------------------------------
* ~0 |$ R+ I( QSub A()
. K  A; k0 G) @6 n    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer$ t+ y& a9 s0 L6 V8 _1 ^' m
    Set CAD = New AcadApplication/ E( k& r, Z# K3 k8 m: e/ q
    CAD.Visible =  ...
- o9 ]$ Y3 ~( c- H( N- w' q

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

回复 13# 上山蜗牛 的帖子

2楼代码注释" `) l/ X2 i1 ^" g1 u
----------------------------------------------
5 V' a. i6 \& c- N6 }: p6 f( FSub A()
5 g2 y' S/ f4 Z0 q8 s    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象% G* J& f: n- z! T- V5 \
    Dim DOC As AcadDocument '声明AutoCAD文档对象
2 |: F5 T; @3 n; e/ N; N4 {$ x  Y    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
( Z. g" n7 c( X, F; Z    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
, t9 q4 K; g% j. N- F& w    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
: ~% f6 I( ]9 p" V# R6 `  B4 b2 `    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
9 V1 T. O& p2 S/ cEnd Sub
' U0 L1 N  h( b' y' {$ ~----------------------------------------------+ v0 e# g. j, z1 `$ q  F

( \. ]9 O( S6 Y5 ]' l6楼代码注释5 S4 S, L& H% f
----------------------------------------------
9 P" ?$ v; |+ X/ U' l5 rSub A()
8 {$ V& a0 l2 e9 E! |5 Z    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
* L* P$ r) \! y6 e2 ^6 Q    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)0 D1 g2 b7 R* q8 S; n' D
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
5 J$ \; P2 j& I. e8 O8 M* {( @1 i    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
' `; Z4 Q, h; @, ^+ @  L- S* t2 TEnd Sub
& f. L% z1 }2 _5 B----------------------------------------------( r8 {9 B: z: A+ `8 g! K
! |' ~5 s" N; |; J, M8 ^3 i
10楼代码注释3 z& v# N1 a4 @4 l+ H% c
----------------------------------------------1 G: O' M! `$ b7 \7 U. ^% A* o" z
Sub A()8 \. z- P. O- S% z# x
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
) ]5 o5 U# j: n    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
/ I6 \5 d* s9 G" G9 f& @, N    CAD.Visible = True '使运行的AutoCAD程序可见
1 [" P+ [  O6 F+ z    I = 1 '从工作表的第一行开始计数
- A1 g/ C- Y, _- E" m9 a    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
) J) e# n# j1 s, K" c        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件  J0 M" ^, q3 N( x' e5 ~
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令  H3 s. l% k) @0 W$ z9 H' X' C3 D
        DOC.Save '保存文件
& T3 ?6 H1 ]; @0 _        DOC.Close '关闭文件
- }# {/ _% U8 {3 Y& d& Q        I = I + 1 '计数加1# Q: S" i9 }$ o- P
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。, K# [1 e3 N( i* @6 o& H# d5 @
    '如果检查结果为单元格内容为空,就执行下面的语句% ^, p, D6 E, Y2 P5 O
    CAD.Quit '退出(关闭)CAD程序7 B; H  t& h8 k+ h5 ~
End Sub! [0 f- c. x% ~# N/ m2 P/ t0 B
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!# l9 \. u7 `5 |. {" x
版主说说看vba、lisp这两个到底怎么个差别
- H5 ^3 h+ v" H4 W, k% }1 {5 x7 c! m! y  _% z
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
3 g% x" w/ g  s* L- r( F选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif2 v' w; Z; N% N2 r
2楼代码注释
" }4 Q+ F/ R$ ^/ E----------------------------------------------( B% {7 I( Z! l7 u
Sub A()1 I, t* @, K5 Y1 `6 N; n1 K( d
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象# C& B0 \. _; c7 Q
    Dim DOC As AcadDocument '声明AutoCAD文档对象
8 J) }5 ?' ]0 \3 Y    Set CAD = New A ...

+ K4 G# E( J, l如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。* C% {0 m3 Z6 M5 Z- Y+ `
实际上字符串中的空格(实际也是回车的意思)也可以这样。- j3 U6 T. Y5 Z. L
另外,按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
3 N9 P+ I" F3 U
" q1 L" |" _; a- p5 v1 z6 R3 e% h$ `4 {# j
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

0 O4 s2 e, z9 N+ A
8 G5 Q; }5 G3 _4 c" K* m4 [& h, ^1 Y  f* N9 @
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
8 W# C- N& \+ |, n8 }3 g5 Q  J$ J
" _7 ?% m7 {7 c/ q& J( P如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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