QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
11天前
查看: 19650|回复: 28
收起左侧

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:' J1 |9 X. }( C3 D
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1# f4 [4 {) I) h' |
Untitled-1.gif 7 `! m: V( g# }3 L( D/ f* K  E
1 b; i0 y6 [2 j% S; w4 U- o
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。0 R+ Q5 f! z; c
3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。1 q% R1 M8 {) M% ^+ ?% r
Untitled-2.gif # P! {3 Q7 [; G. J

& T2 w( e, b5 u" ?% P8 f$ _4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
) i: ~* G8 Z1 q8 W-------------------------------------------------------------------------* g0 r. ?4 R7 Y& @
Sub A()+ z$ _4 |. y  y
    Dim CAD As AcadApplication, DOC As AcadDocument
9 d  F. `+ e# [: e# i    Set CAD = New AcadApplication% w; X' s/ a5 I5 C, L, H: x
    CAD.Visible = True( L; v8 T2 j: V
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value). [& O: l8 M9 F5 A6 E) k
    DOC.SendCommand Sheet1.Cells(1, 2).Value
( i4 P% r+ w# F6 F, V& {+ ~End Sub
* y4 R/ T5 h3 b+ v5 F-------------------------------------------------------------------------( C; L/ |4 |* o4 J# t  [6 D
见图37 y0 @: I! D1 J5 c
Untitled-3.gif
$ E- H) J$ X# z. ^/ p" b
$ z6 y: x, m8 f' N1 u3 N5、在EXCEL界面运行宏,见图4
% L( y7 u% C3 }( I! G2 A Untitled-4.gif ; F; s% k1 V. ^  e: f* a! \6 i

. }- v" w5 K0 V) Y+ Y6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5; q# j" ~& r' b: T7 z7 ?
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# 的帖子

上面的代码改一下
1 h, L- a3 L. P) z---------------------------------------------) j5 g. e2 `. f7 A. L3 S+ K
Sub A()
5 x7 ?+ Y2 `) H: k    Dim CAD As AcadApplication, DOC As AcadDocument
* {7 y( Y; U2 s7 Q9 K. K1 U% p    Set CAD = GetObject(, "Autocad.Application")
) m2 [8 Q! ?0 V! B- r1 p  ^    Set DOC = CAD.ActiveDocument7 b$ O4 e' `  k7 \; |3 _2 C
    DOC.SendCommand Sheet1.Cells(1, 2)
7 K: G4 ~* I  gEnd Sub2 y. L% G# b" i; M
---------------------------------------------+ h. l1 f8 o  \" S! F
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接& S3 J+ h( a# Z. z) u  C- D, l3 w
- U/ u2 q9 ?0 F7 o  z! X
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
* g  s! Y  d! G0 n  j4 Q. j( U; \" q5 `' i" _) t% [2 |, e- y7 D
[ 本帖最后由 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) {+ h. k: |" t! S% A& D  t
不太理解你的意图,能否再说得详细些?
/ C0 J0 U, C& d  p& d
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
) b; X* o$ t/ P7 ?
) Y9 Y: N* E3 _& V[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写+ T( j  Q; b6 ^  H& A+ A
-----------------------------------------------------* [3 t/ l  [+ D
Sub A()
" i6 _4 g! c2 u5 e( L7 ^4 d    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
6 w" G% j4 {& ?. F    Set CAD = New AcadApplication
7 b$ V4 m2 x" y7 j& |& l. v    CAD.Visible = True
, s  w7 a5 Y, I$ W0 N& l. `9 D0 R    I = 1/ R6 k  o: E6 Q! c  n3 x
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "". v* T5 y0 v& H& g& t  C6 D
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
) D- }7 W$ A* x3 d% M        DOC.SendCommand Sheet1.Cells(I, 2).Value; O# T+ O4 h6 D
        DOC.Save
+ S7 _2 _8 f* e8 N        DOC.Close& N3 }4 K( `, q1 l" Z% _$ V
        I = I + 1
$ q! v; i1 y2 i6 X2 v* D  [    Loop: d. P- e% |" K3 ~
    CAD.Quit
9 ^7 W+ y1 g! MEnd Sub: d5 u0 m1 y' O- s0 i
-----------------------------------------------------------------
' H+ ~  D" w- x* S  C0 `+ ]+ V8 y运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
! B  _- t! ^" h) r本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif. [+ c" m& w! o8 l8 |7 o( a6 y+ _3 C
代码可以这样写
3 z* H- Z1 O" F3 a; ?-----------------------------------------------------. a( l2 [% D# `. z4 \  {7 N
Sub A(). G2 n  ~6 X$ H! I, d. X* g
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
, S: d8 |" v4 w# _# b% i+ l- p' Q    Set CAD = New AcadApplication
- g. w2 B+ h8 N# ?2 {    CAD.Visible =  ...

8 n( \, D8 J; n( Z! A7 _2 z7 i- j$ ]/ U- c8 \6 l1 @2 x5 |
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
* Q( I. U5 R( w* N因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
# J8 I  H% d# T1 N2 p* S----------------------------------------------
" K8 S( b1 s1 S4 V- i' }* VSub A(). D; c- {: Y8 o" d/ m* W
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象7 ?$ u: X4 Z! @. Y( U
    Dim DOC As AcadDocument '声明AutoCAD文档对象
/ D4 i& s7 p/ E8 H; m# C8 @    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
7 k" t: s# y+ z. `4 p  b    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
4 a7 ~6 ?0 T" i; M* _' H+ Q    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
& W, g/ X, V; z$ U4 j8 R. a- c    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
1 O: }3 G- o* ?- _5 AEnd Sub% v- w8 d( E7 j
----------------------------------------------
( k6 T9 D) f, T
$ N3 o# x! X2 x3 ~6楼代码注释
* k" i! A6 L+ J% P" O----------------------------------------------
- ]2 A. c! c4 SSub A()
- o: O/ \* f) R  K  t+ ]' I2 {    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象5 V( w, h/ R% I' k$ n8 W9 Y- ]
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)& L% p% b+ k: w9 H
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作0 r( T0 F, h# _( s4 @# A  ]
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令/ A3 @9 E' S* n5 I
End Sub
' `- H5 b$ v5 O( d5 H, ?7 V* {----------------------------------------------
( P; M  A# f: H4 N" F5 F
+ X- O7 y9 ?6 t  f: g8 k10楼代码注释
2 |& @0 a9 M  b/ y$ I----------------------------------------------$ ]6 C: \( t3 X# t9 N% K
Sub A()& A+ }( T4 y* ~: S. @  {0 d% n% }
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
0 Q; N$ {: b+ @0 n7 X( k    Set CAD = New AcadApplication '运行一个新的AutoCAD进程2 L% c0 E1 n' A! X: k; s8 }
    CAD.Visible = True '使运行的AutoCAD程序可见
- |7 I3 m9 w  H' q    I = 1 '从工作表的第一行开始计数0 K. F: t! c/ L, v! |
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空; S1 A, b/ F7 D( N
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件% z" [( X8 l; \# q& {- w: C
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
2 S8 r  R8 h' H+ ^/ n4 n        DOC.Save '保存文件! o) j8 [8 K* C
        DOC.Close '关闭文件! r! L* ]  A# i& Y
        I = I + 1 '计数加1" h+ p( M3 j/ t" ]1 e- N6 |
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。3 R; Q/ G2 j7 F; p3 o2 a' B# t
    '如果检查结果为单元格内容为空,就执行下面的语句& ^8 X' W, z5 i% _+ @( c/ t
    CAD.Quit '退出(关闭)CAD程序/ C5 I. n( c1 S6 j1 c9 V! s7 a
End Sub* E( [3 W' h3 V  a" t$ m+ ?1 }. X
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!6 i& Z, c& @& ?4 ?6 A
版主说说看vba、lisp这两个到底怎么个差别* ?& g" m9 U; j4 d

: o& \. V# t# [1 `( g0 V  @; i[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
& y8 Z4 @$ b7 s- Y  g7 a6 n- n选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif/ @: }1 x. E7 Q1 O
2楼代码注释
. K# P2 L! O% r. u) `6 p----------------------------------------------( f- z  S' e- [
Sub A()! q4 C  q5 }8 d) m' }/ h
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
" I% B+ `9 {  T. L    Dim DOC As AcadDocument '声明AutoCAD文档对象: E* p' s7 n. z
    Set CAD = New A ...

/ H( F5 w( A* M3 p如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。$ c7 |* ~1 ~$ q- s' i8 d  ?6 i) L
实际上字符串中的空格(实际也是回车的意思)也可以这样。
1 O! L* o/ _! o: i6 a4 F另外,按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
4 d4 Z# f* Z2 W/ U9 F' D, M- R; ?$ S  e' w
. @, d5 S1 ~8 Q, G
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
3 S+ F! ]# [2 N0 k* t7 T/ m
$ G1 k0 ]- \3 j; k: [

! j7 d0 W0 `6 B& T, P' G真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作" v( S- S: _  u

3 A1 t4 s3 v# A. r+ {; B( I2 b如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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