QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
9天前
查看: 19642|回复: 28
收起左侧

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:4 i$ M0 H% b, j# F0 |0 o0 ^
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
5 [( S! ~& A: F8 C: {. T/ x  K4 f9 K Untitled-1.gif
- G4 P1 z2 B. G' v3 c+ [% H$ H) L% _1 r6 U% ~& C
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
8 z& P+ s" |5 B# ~9 D& @2 w3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
2 Q3 U& K- e2 N3 h' V) S Untitled-2.gif
- A, l, _2 t- |! e. l7 M
" U# W/ {9 v  a1 V4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
* P1 @7 I; [. D& ]) Q7 ^-------------------------------------------------------------------------
3 d2 C) |; E2 g5 l. U" [4 nSub A()
) B" ]* b7 _8 n- m7 `1 L! z9 [6 `- }    Dim CAD As AcadApplication, DOC As AcadDocument8 w/ n9 h) r! _$ Z
    Set CAD = New AcadApplication
7 s+ a/ g4 D; n" \    CAD.Visible = True) d( h9 ?3 ?+ j2 x7 ?) R/ [
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
7 l1 P0 j- l$ ?- I+ x9 |- ?- o" ~    DOC.SendCommand Sheet1.Cells(1, 2).Value
. Q- `/ [0 |' U! h% I- QEnd Sub
& }  b: k% F/ M* M-------------------------------------------------------------------------
0 {3 Z7 T% n9 x# N( [. S* s1 i; Z见图3' N1 G9 Y+ s2 Y" O4 |& j
Untitled-3.gif + p/ W# K- U0 x$ X

2 M: J; |1 j) y5、在EXCEL界面运行宏,见图4
# d* {2 y# e, }0 M) x8 G Untitled-4.gif # y. j1 i1 P8 N; G, z$ K6 w& g

, h" q9 T! n, a6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图58 p' n) V9 a- q5 z' S( x
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# 的帖子

上面的代码改一下
; M, ?. m# n; \, x' ~* Z---------------------------------------------
  L5 u! x; |" j$ J0 fSub A()
7 `' `) t3 T- Z. g5 p$ m: ?    Dim CAD As AcadApplication, DOC As AcadDocument
' r+ u$ w- Q/ }5 g% @1 l    Set CAD = GetObject(, "Autocad.Application")( E% j: W$ y) i, |; T6 K, }  q
    Set DOC = CAD.ActiveDocument) n) P* {+ C2 c  h8 d6 ]
    DOC.SendCommand Sheet1.Cells(1, 2)& l6 U  i) D2 k- S! n0 B  [
End Sub
6 n3 i- i% s7 Q( i---------------------------------------------4 V' b! L5 x$ m8 x0 ~: A, T+ L
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接" y0 N+ W: m  A  v, ~" O; f
3 k3 t5 h; J5 o5 @4 J
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?! i" a: ^) g% n
) A2 B- J& Q$ `* Y- u8 b
[ 本帖最后由 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
# b) R( m/ Y( O不太理解你的意图,能否再说得详细些?
+ p. b  F, u" p$ W: l
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
8 }3 A/ f3 r/ `/ J3 W* ]. d2 r4 s0 k* X! p; U
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
- v* l! i/ `& U1 A! R-----------------------------------------------------
4 ~; w; L& z. pSub A()
3 n/ A% H) f& Z" t    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer+ j9 A$ W2 U# j1 {- x: A8 s
    Set CAD = New AcadApplication* t0 q, q; y. R. G: `1 M$ P6 t% ?/ q
    CAD.Visible = True7 G+ L" \0 N& u+ M7 @0 X
    I = 1  M- u$ \+ v& {0 |0 ?% F
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
0 ~7 J" N# o) L7 O, [" a' d* D% w        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
/ Y9 V4 r* M( J' U0 ?3 w, D" e        DOC.SendCommand Sheet1.Cells(I, 2).Value
6 U3 P! R7 N) _" X        DOC.Save
2 x8 l5 B; G* m+ B: ^, F        DOC.Close
8 Y( p, ~) L( q/ o& U        I = I + 1: t6 a1 J( j9 B) d# I0 p. r; ~1 U6 S
    Loop0 x7 Y3 ]% |% e4 s3 ?6 N, R
    CAD.Quit0 m. r' \. t; |. R+ a1 h& C' Y" o
End Sub
4 J( _& T) N" o) p-----------------------------------------------------------------8 o0 e/ W# y' f' O
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
+ J6 F9 \' G: y本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif+ I# z( b6 F  V4 c- ]! {1 W4 }
代码可以这样写
1 Y0 R7 i$ _' Z-----------------------------------------------------* \0 R" {$ X' Y$ m7 c# \( c" n
Sub A()
$ k; i& u) \. ^' q2 M    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
/ J* y; U3 Q6 D; v    Set CAD = New AcadApplication
& h6 L8 n7 C+ r- e    CAD.Visible =  ...

$ n# v. b0 f( O3 O* c7 Z; R) |: w+ R5 _5 G& j
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
3 K1 i, Z8 K+ O% y7 y& Z因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
' A, P1 U9 _* [, t----------------------------------------------& F: q7 S2 M9 I2 R' w* e+ ~. Y5 p
Sub A()
% D. C2 u" Z; M% q+ x! L- \7 L    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象- D- u2 C1 ~4 G4 y5 D& W8 K  s
    Dim DOC As AcadDocument '声明AutoCAD文档对象3 N7 z4 C3 E: r- s
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程, E( K# E% \' J/ d& f# V# |4 }! c
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。, b2 @6 m( o; e& K* a
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
+ F% b# d% F& x# p+ X    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
4 _* E2 F2 f$ jEnd Sub
5 A4 N% ?) Q* O" M) g1 O) D----------------------------------------------+ g4 ~( p& r" y1 \1 N2 q; F/ b

& J) V2 L- B+ M) e! a* _( Y6楼代码注释% x; I3 }. H8 e
----------------------------------------------) J+ f' `8 `7 x  P- A+ q0 j
Sub A(). o# }& `  z# s2 N4 Z6 S3 w4 k8 o
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
# |. _% r2 c( [+ s) z% N1 R    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)% t9 N* @5 Q  p6 `  F. y  h
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
' ^% p  A* h7 f, X. t+ j( o2 c    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令, O# \  ]/ o8 K3 V
End Sub
( ~2 }# M# |' C* h0 C/ W3 c$ z0 v+ x----------------------------------------------
6 i) w, e5 @% K) V5 Q7 p( I6 M8 O' P) v: L
10楼代码注释& F5 s# X7 L& v7 O! K
----------------------------------------------8 X, F% |; l! C6 n! t7 [
Sub A()- b; R* [7 e& v: B% Q
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
( {7 L* Y! k; P6 D  `4 S    Set CAD = New AcadApplication '运行一个新的AutoCAD进程8 k3 Q4 b2 \& ]9 N
    CAD.Visible = True '使运行的AutoCAD程序可见: M3 l! h) W# J# n' S& J8 d
    I = 1 '从工作表的第一行开始计数
& }0 q6 H: n3 v0 d4 _" ^    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空' r( o7 L: ^5 A- U3 C
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件  |" ~, W: O& e7 ]% f) _5 O
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
2 J! y! M, Q; o- D9 N/ d        DOC.Save '保存文件8 b& a; Y+ `  b  h( _, ?; d
        DOC.Close '关闭文件1 |7 ~8 W  q  s% \) i
        I = I + 1 '计数加1/ _* v/ |$ Y# u  S& r+ l0 W
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
) d7 N1 b8 t8 @- [$ |3 d    '如果检查结果为单元格内容为空,就执行下面的语句
2 u: L* c/ l7 w7 O& T    CAD.Quit '退出(关闭)CAD程序
% n( e$ j! u* P$ d4 ], B8 v6 w& qEnd Sub
5 g% }/ e) a6 `9 u----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
9 g+ W. e7 i/ {7 c版主说说看vba、lisp这两个到底怎么个差别
# o- ]0 }# c! q! E/ l0 c; V& k& \' V; l5 j: r) I
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
% i  A- Q( Q+ S选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
4 D% Q8 U+ G- o9 H- a2楼代码注释. z7 `: |' A! p& x9 u1 l# C
----------------------------------------------& D. b  Y- }. b" G# o( Q/ b
Sub A()% H" y% B* B! i
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
' [8 z0 ~. G2 u8 ^5 ?9 P    Dim DOC As AcadDocument '声明AutoCAD文档对象2 c) T4 e5 _- o3 K$ [4 a4 r
    Set CAD = New A ...
$ a& k, K2 `5 H# x- y; @
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

text 0,0 2.5 30 你好!) J* W# u8 `& j4 }: Y8 G: c0 W% x' h5 x
我在Excel VBA 中用以上命令建立一个单行文字,可以生成文字,但是无法自动结束这个命令,必须要到CAD窗口按两次回车才能结束,请问这是为什么,有什么办法可以解决。
发表于 2008-11-14 10:44:53 | 显示全部楼层 来自: 中国辽宁营口

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。9 l/ |6 W2 V2 r+ T# T! A7 L
实际上字符串中的空格(实际也是回车的意思)也可以这样。
. i/ x9 E- p* t另外,按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
/ T- ^& c5 S# G% I( E  r) W' T4 O; ?3 L5 J' N# B  @

' t7 M* p3 b' O+ [7 @学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

+ i! F2 _3 J/ j. ~  ~  B' |
$ P3 Y5 k) \( @# R3 a
* C; W; ~% z' s真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作; z. f) e1 E2 p$ U7 S" U

' x. _! f+ ]6 P3 r% U  N  Q, d. v如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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