QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
) e! m$ f$ N/ l: o; F1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
+ \4 W" b3 Z: x& n) x Untitled-1.gif
( w/ ?) M0 P( G. Y  X3 b3 p" L. h5 }5 Y( K+ p" t( B! x- R; w) ]% z
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
8 h! ]: i( J, S8 P& k: G4 j3 U3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。* p! n7 G# j  K% D# O7 V. L; g! [4 H
Untitled-2.gif / B( _2 y/ ]6 r1 W, I
; v1 j* u1 g  H6 T' Y, a' \: i7 @& k8 H
4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
; G1 C3 C# T/ U% D9 T! p: t-------------------------------------------------------------------------
/ P% H; i  C8 B% g, a, x+ _4 RSub A()) c+ \7 l1 ?: i: x
    Dim CAD As AcadApplication, DOC As AcadDocument
9 c0 J( k8 V! _7 T5 L    Set CAD = New AcadApplication
* `( r& u3 m& c( Z/ W6 T    CAD.Visible = True6 p* r4 G' N4 k4 F
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value). p" q4 f, W3 k) H# B
    DOC.SendCommand Sheet1.Cells(1, 2).Value
6 ^$ R6 l' ?7 K& M0 qEnd Sub/ i  P  x4 w2 V, ^0 E5 q6 S
-------------------------------------------------------------------------
, q% i5 ?+ p8 I7 m8 W0 f见图3
0 I: T  f3 Z% [. _" r2 h; Z  N Untitled-3.gif
8 `- U: E  N- P! K& d( T7 k* V
9 K9 G( T- F3 V5、在EXCEL界面运行宏,见图4# c; k# F# z) D" J2 i$ u
Untitled-4.gif
* A, G2 D1 }$ R, a8 a/ Y1 w4 L4 }: z) r( K; D
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图53 Y1 N) ?2 z- ]$ \3 R9 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# 的帖子

上面的代码改一下
& @* S% J4 c- b. ?6 {! ?/ d$ x---------------------------------------------
6 S" j, y$ b0 N5 p3 fSub A()
/ L: p5 N/ Y' L1 V    Dim CAD As AcadApplication, DOC As AcadDocument! o, ~$ z) ^3 t* R
    Set CAD = GetObject(, "Autocad.Application"). l9 c% I' G7 p; U& ]/ {) K
    Set DOC = CAD.ActiveDocument; Z6 f$ z7 m8 R& D
    DOC.SendCommand Sheet1.Cells(1, 2)" r9 i. O: u  [$ _8 z
End Sub. O" d2 J2 D* _' @0 E0 }, A( W
---------------------------------------------
! M8 ^; v( l' z本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
" {, {$ Q; y- {5 ?" v5 w' j0 m
9 O9 `1 [) ~# |9 u2 k: m- T6 @" Y! U[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?9 N4 y+ x4 l9 ?4 ~
+ x9 p  U2 j; C, N0 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
, h5 E( E# g, i8 r不太理解你的意图,能否再说得详细些?
* j: C6 x  l. Q% d2 I: I
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
5 R* B6 T0 l+ v% Q6 v3 @2 j# h9 t' j5 l7 R* J, p
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写2 R& W2 E: A/ Q* Q# l2 {! J
-----------------------------------------------------' ?; f; S% U) X' L/ q
Sub A()& X1 g! m: m' I" [! a3 q
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer1 s+ _9 m& b; ?9 C9 d/ n) |4 w6 E
    Set CAD = New AcadApplication" y; F1 d* t4 r1 _3 z, E
    CAD.Visible = True
! R3 i6 C3 }! |; `3 Y, a    I = 12 i( z# X: U: ]6 K8 w' m) P
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
( `9 W" D+ g2 e4 T4 N" t        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
8 z3 [5 a2 J% [3 n! K        DOC.SendCommand Sheet1.Cells(I, 2).Value
/ u# O8 Y" U% X+ w        DOC.Save, {2 y4 x! d2 l5 g
        DOC.Close
/ q) r! \+ K: I        I = I + 1" t0 o3 C" S7 ^9 K, I6 u# l
    Loop" _- ~; @0 C! k2 n
    CAD.Quit
( {6 Q0 r$ F! T" m  _2 SEnd Sub! K4 S4 ~' b& I. x! Z
-----------------------------------------------------------------$ C+ S$ E$ z. U  J0 w
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
' Q5 r4 F2 v" n% C, Z! L" m8 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
# i, L1 U6 U) e0 Y8 S代码可以这样写' i% Q1 \- x: B+ ^$ V1 o( A
-----------------------------------------------------
: U8 d8 I& u  ?3 S" w, R; CSub A()
6 m; ?- t6 O& I/ y3 O# {: }4 ?+ k  n    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer- L! ^6 ~9 Z& w( n$ w) I. l
    Set CAD = New AcadApplication! g8 S% K' d) z3 L  J3 O  X
    CAD.Visible =  ...
: H' I- v9 U0 t" D( X7 F' x" I" p
! V( ^3 A) C. Y5 i
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
. o4 h1 ^+ H! Y因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
. y6 u. q. ~& e, \7 _: O4 W- c7 g----------------------------------------------8 N, i3 \' l+ N4 U& s; c, u& l8 u+ S
Sub A()
9 T/ w0 z- H, f    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象" h! {* v" C' J, I
    Dim DOC As AcadDocument '声明AutoCAD文档对象1 t" t  u; I+ Z
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程+ ~  ^! v0 v8 u: ~
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
, l* l! z3 C  |# X    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
, I. _* A7 B: P! F: v" C    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
- S% h: g7 `. XEnd Sub
# Y. {& Q; R* @+ [# n----------------------------------------------
* i4 r! m0 T$ c1 e
0 E: _! K4 x, Z1 j; N6楼代码注释
8 S. N4 @8 J$ U* A+ P: Y& u& X----------------------------------------------; ?0 w8 z% |& V/ _
Sub A()5 T! h, l2 h$ o, S; I) f% }; o
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
8 I* }6 P9 T9 A1 ]    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)* u; o; Q& l1 }$ m( g
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
8 m, v  ]3 W7 O' ~- B  Q    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令0 R- J9 q6 F2 f/ d5 f) s7 u" Q
End Sub% p& R1 h& [/ ]) O* V# @3 \
----------------------------------------------: b' X; U+ E( [4 g$ h7 L$ K

6 U. x$ z" {: r3 S% d: W& p$ t10楼代码注释
4 Q: U+ k+ u, t----------------------------------------------8 m: w3 c5 G8 [  h( C9 W  L
Sub A()
# A; h+ S. e: T4 R& w    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)+ [  D1 ^( J. R/ a  N
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
! k1 C& n# t/ I; W& c/ H: n2 e1 I    CAD.Visible = True '使运行的AutoCAD程序可见+ e- A+ F/ J/ h5 [) Q& G. g1 M
    I = 1 '从工作表的第一行开始计数
3 s) [  [# s0 h) v5 L/ Q    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
& }, p- f$ v3 F. j9 W7 ~        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
" L' j, L& _- x. k        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令/ X* A; w! x3 c9 E
        DOC.Save '保存文件
& G3 D( ~) u( I! ]0 v& u" F        DOC.Close '关闭文件/ M9 N. z& o0 h) H" F) i- r9 y: i
        I = I + 1 '计数加1
( Q1 Q2 C6 C$ \# s" U6 C, Q    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
0 i# h" i5 E% F    '如果检查结果为单元格内容为空,就执行下面的语句' O2 F4 r9 X. D& S; g
    CAD.Quit '退出(关闭)CAD程序& A1 `2 V4 f4 |- t7 G
End Sub
" T* Z  C) ^/ }0 ~$ D0 o* ?----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
" _9 `/ \( S2 _版主说说看vba、lisp这两个到底怎么个差别% J: I/ A. }9 D8 J

8 E) M; ~- q$ C[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
: ?( y8 x. p2 v% W* f选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif9 c9 f! {5 H* {7 @3 Q
2楼代码注释: R8 n1 K! e2 y/ S5 z5 I
----------------------------------------------
- |! Q+ X* Z1 w6 \% K. z, OSub A()
. J& n) y! n; w/ `# h% o/ j    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
; R3 T7 a. S' `2 y' u) e5 n    Dim DOC As AcadDocument '声明AutoCAD文档对象% l. Q& _) v& H( j; t
    Set CAD = New A ...

! J2 y3 }8 j  H8 U/ J0 v+ j2 A, u如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。& T5 z  o: O1 v! l8 L% b/ c1 }/ }% s
实际上字符串中的空格(实际也是回车的意思)也可以这样。3 p& {/ c1 `" Z9 m
另外,按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% U3 @* f5 N  M6 ^% H9 p0 O2 L6 g
( D. C* c8 V8 O  Y' g
' T/ {0 i' F* j
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

6 h5 [1 m! P+ P; B; b& w
7 A  }0 F3 ^4 l( n; p: l6 s# B2 @$ ?' Y' a4 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程序的当前文档上做下面的工作
/ n9 e: a1 R8 Y# U9 m
$ e; z# z( p3 `# c. P8 w6 x如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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