QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:* T( ~, ~: _5 W$ `/ X8 G! p9 R
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
7 p' w; ]" _/ C5 G* P Untitled-1.gif
! O/ k! P5 u3 X- c
5 F- l6 Y, ^. B& A% [2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
4 |) ~; o% ~4 E- q3 V1 \' ^3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
. M0 ?6 t+ O$ J2 }# B Untitled-2.gif
8 a  g  [* Q5 P/ D! q  ]' R! S5 t+ `$ J  ~
4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码) X& E) ?  ^, U. P
-------------------------------------------------------------------------7 c* Y# W  G$ T% J& D+ W
Sub A()
8 E; P9 @* a; {; F% ]2 }, f# u    Dim CAD As AcadApplication, DOC As AcadDocument$ y) c. `* c4 O
    Set CAD = New AcadApplication
+ q) A4 K% W, c    CAD.Visible = True
, [- J6 D) y  {$ Q, X    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)& E; _7 E4 Y; N* p) s/ T  l
    DOC.SendCommand Sheet1.Cells(1, 2).Value
$ p% N) l% H9 hEnd Sub! y% |9 H  u) H# h% b0 x' g
-------------------------------------------------------------------------
0 s2 N- R9 ~, `见图3! v& t! X7 s, Y, ~* v- s
Untitled-3.gif
/ I) M% \# C/ j# Q  w* d$ A1 K2 M$ z7 e) }1 Q& `
5、在EXCEL界面运行宏,见图4
$ j3 q: a3 C. E Untitled-4.gif 7 G% u/ k2 A8 M7 e
( B+ p5 X7 S' B1 z* y/ `6 f9 L
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5) S4 w% n/ v* d
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# 的帖子

上面的代码改一下) e  P4 W0 d. O0 r* p+ j" p% D# z
---------------------------------------------
, s5 x4 C% i) PSub A()! f2 d& ]: [- k+ r( z
    Dim CAD As AcadApplication, DOC As AcadDocument
& O# n1 T5 H4 s9 l, [    Set CAD = GetObject(, "Autocad.Application")& u) L* Y3 x  {
    Set DOC = CAD.ActiveDocument3 ^7 l7 T2 J; S5 U5 T" I
    DOC.SendCommand Sheet1.Cells(1, 2)* d( {% n0 y8 J/ {& E$ m
End Sub
$ j& ?. M; ?. b( q: ^8 c---------------------------------------------  r" `" D+ e  z* k
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接; N; z# b  _' X8 e( b7 X! h
& l" k' R8 P7 G  U( f
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?# M) n6 a6 H. N  h7 F. Y" L% }

, r; D0 [; ^+ h+ d  r" F7 z: v9 j[ 本帖最后由 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
! z  l+ x8 N) S' R不太理解你的意图,能否再说得详细些?

2 q7 Z; |2 ?; B/ y/ A) c! I- N就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~' E3 d; Z+ g3 M& o; |
1 G. C2 v, Z/ R% V& d# s# t# ?
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
  ]4 C* |5 w% |6 E-----------------------------------------------------5 _6 n+ H. T) p( g, i
Sub A()# }7 C1 J- j: U* F, p# }+ E1 `5 I- Y
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer2 F6 J: |$ F  N) r; G4 q
    Set CAD = New AcadApplication
- u: @, |& p3 b9 w    CAD.Visible = True: }! A1 D9 v3 p/ ^& J$ X
    I = 1, ]+ n  b. `0 y/ A" J* M* G
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
0 Z2 K4 A9 o5 u' M6 V; O# G        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)# P% a* I) K' O/ ]# C5 _' a
        DOC.SendCommand Sheet1.Cells(I, 2).Value
7 e! C  r6 f6 A- i" ^" {2 G        DOC.Save" X9 z0 w: G9 ^7 a& J& e% O7 z
        DOC.Close
* Q, r) @! o, E* H/ m9 \( p/ S        I = I + 1! K/ k* _: \* b! q5 z1 f6 H# L
    Loop
2 j- Q- ], X% f; d4 z/ c( r    CAD.Quit* r: w/ `' f3 T1 p# M8 E1 w
End Sub
+ F7 s7 @; H) [-----------------------------------------------------------------
7 _, W& W$ _9 M$ t" S运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
" v6 L. r+ w- {* v本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif$ X3 Q5 j2 a) V* d
代码可以这样写( }$ j0 P$ X2 o, w
-----------------------------------------------------% \  M% O) t2 C3 Q
Sub A()( X# s$ \( ^! A, r) Q* A
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
  V0 U$ ~; \6 V7 W  K  a    Set CAD = New AcadApplication
, k& c8 q' m( W: M  J+ G    CAD.Visible =  ...
5 F8 ?  n  k( Y( z6 w
7 `2 L) q& P; v! ?2 M
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
4 U6 z2 r. x; f; f% z因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释+ |( f( Z9 h% g# ~3 Z
----------------------------------------------
% S) a  z. D5 }8 [; GSub A()
% p& q9 Q% b% @    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象! H; E! B* U1 Z6 b( A  ~
    Dim DOC As AcadDocument '声明AutoCAD文档对象: P! d% v9 b# K) ~0 p4 E" J
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程* N8 r$ g% p/ s, M
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。& n+ K/ y# o! m/ z; i! B; j: n# a, ~
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件; Q7 L) b' N9 u4 w1 ^( z: `2 r: ]
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令1 M' v  D  }. B+ a+ z
End Sub0 b1 n0 m7 h/ j9 s! ^. c: D9 C8 g
----------------------------------------------
6 `5 V9 O+ w4 ]9 g2 C" L7 i$ e7 c% i; I
6楼代码注释
9 j& T8 E5 }: E3 i2 i5 @----------------------------------------------6 }" x0 `) [! U) c1 p
Sub A()3 N! ^0 ~" }& \
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象# X' @7 E+ v6 P: \' j9 z: c  u
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)# Q6 ^/ Q5 u3 N+ l/ P& f
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作2 d* Q1 O) B* Q9 H- r
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令5 \) [+ |7 W; V! v
End Sub
9 G* I8 L- I  i----------------------------------------------/ [% C8 P& d. c8 e. [# k

5 P- \# k/ b" @/ t9 k6 s! r' d2 {: k10楼代码注释
5 O0 T- f% {. {! _8 m7 m9 ?----------------------------------------------; R7 B) W# I! N( _7 r1 ^) z
Sub A()
: U7 J* l: ?9 }    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
9 P- _8 h) e9 r2 Z, O- e    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
. b7 F0 A) K) C4 p% U    CAD.Visible = True '使运行的AutoCAD程序可见
/ ~/ b8 j& f4 a* t    I = 1 '从工作表的第一行开始计数/ }4 F) Q% o4 O" g  D
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
' L% A' v4 {) T5 T6 V8 I, Q: f) X        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
" U# I  P, g$ h1 e, `        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
$ ?9 z( U- j, V5 B) x- e        DOC.Save '保存文件& o+ C$ X' c/ ^1 A
        DOC.Close '关闭文件
/ R; e: r8 R4 g7 d" q% K        I = I + 1 '计数加1
* n+ C8 ?5 d3 u5 G    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。& U' F+ E/ T7 T; a- J: d' o
    '如果检查结果为单元格内容为空,就执行下面的语句
8 `4 h1 Q6 V, X, d$ e; w    CAD.Quit '退出(关闭)CAD程序5 U& w7 X0 {8 T
End Sub9 F% W5 u& ~3 h3 Q& @1 ?- v6 K
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
8 c) q4 m1 g- ^3 w; M1 s. O版主说说看vba、lisp这两个到底怎么个差别/ k8 e* u- ~: L, N5 x- v

4 o0 a. w# H9 e. X6 U7 Q" F( x[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子# `; w6 Z1 `2 H# R! t4 X
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
) t) L% E5 E0 t- v; i$ v2楼代码注释' n5 M5 V( J, R0 j
----------------------------------------------" l# t/ _* w9 V6 y+ f
Sub A()
( l( |3 s' q( ^7 I$ T. g    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象: `* S' T  `2 i
    Dim DOC As AcadDocument '声明AutoCAD文档对象( f  B  O2 }# \8 o( ^. |# ?  j
    Set CAD = New A ...
9 V  v; B6 X; g/ E* E- p6 u# q$ ^  ~
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。" P! }1 `$ n/ c6 i% ]* p3 m- u
实际上字符串中的空格(实际也是回车的意思)也可以这样。  Z/ L" N3 P( l4 ]$ P1 s
另外,按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& E, M4 F$ ]; G/ A: z

4 a( i- V+ ~5 s1 [, p
* ?8 M7 K2 O: U9 m* `学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
* k! N! i7 g( I6 Z6 d' w

0 h/ U; ~8 A4 {; P* j# \
, Y. u) t( r9 _1 j真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
3 e6 Y) `0 p# [5 n0 N' Y+ N+ G, N0 d; |/ H* ~
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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