QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
. y8 E# X9 [- p% X1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
, l) N- D: f6 k  g Untitled-1.gif 6 m' s7 D. i; p) ]3 t# o4 I* V

' J* [6 E  D" O0 g0 ^2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。. D, m2 [* ]% N% t1 b
3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
0 X0 c- n4 {* b0 q% z1 m Untitled-2.gif : I4 v# }' {; o& G" }
" e9 b, @2 D1 h8 m+ d% Q/ E( Z
4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码8 r7 J4 A& B& h5 V3 ?
-------------------------------------------------------------------------
. O  T" Z- E! s* w  f* r5 gSub A()# w9 G  J2 b, F$ o! ~$ O. p
    Dim CAD As AcadApplication, DOC As AcadDocument
. M* ^  _4 g; }# U    Set CAD = New AcadApplication1 t' N( Z; z! h  d. ]- y. U4 Q
    CAD.Visible = True/ P2 E7 l0 J( [0 E% e
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
: F7 j$ q+ Z0 r6 {) a    DOC.SendCommand Sheet1.Cells(1, 2).Value" p/ \/ a' N+ H+ O" I# ^
End Sub/ Y3 ]5 e! F1 s% @& `: W- m2 n
-------------------------------------------------------------------------
8 |) x% ?1 U  _4 }) j" I见图34 N2 a! C. O+ a" A4 h
Untitled-3.gif
* ]6 u* Y, o) B* a7 y
; N1 M, C/ i8 a6 J0 }4 I( O5、在EXCEL界面运行宏,见图4
6 u9 r: T, o' Q; J0 X6 O Untitled-4.gif / q6 F! D0 F0 d+ K' e
2 d2 W+ e# @3 E8 X# G: p
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图58 }6 J+ ~4 ^5 v8 S3 T: m
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# 的帖子

上面的代码改一下
  ~3 h% p- Q1 B! D# m) P---------------------------------------------$ y+ k/ l! _7 \5 i) _  a
Sub A()6 {7 ~8 h/ _6 u4 q' V6 \5 K
    Dim CAD As AcadApplication, DOC As AcadDocument# Q! l. V& z. {* |$ C2 l9 l5 F, n
    Set CAD = GetObject(, "Autocad.Application")* K& s# H; h2 |; ~! z
    Set DOC = CAD.ActiveDocument
4 Y: \9 t( ~, \6 X% h4 G2 L    DOC.SendCommand Sheet1.Cells(1, 2)
9 N4 ~$ G( L4 ^3 j3 _End Sub1 n9 l; a+ U) S0 C1 y+ X. B; u& V
---------------------------------------------0 u& G' Z& f8 {8 Q" q
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
# U0 N+ u$ e6 u2 i
) T8 B2 V  P. w1 ~, z: D[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
4 f' l; k" N/ j, `
6 _. ?  t! f% X. q3 z& K7 c3 z[ 本帖最后由 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.gif7 t0 P8 M* @! m0 i* a
不太理解你的意图,能否再说得详细些?
8 P3 S6 p1 r  F0 g
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~# C  Q2 W9 E" n$ L3 Z; n% a

% R( {# T  x/ v2 b2 F3 m& ~( b[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写( R2 [0 R$ X1 ~/ c4 O  i" `
-----------------------------------------------------
1 ~# _  Z5 l6 _5 y& q& ^1 QSub A()
7 b, x9 F9 @) N! e4 `" z    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
. C. M; {+ b1 ?8 R1 u% P    Set CAD = New AcadApplication
& \) T9 }1 u0 V0 f: Z    CAD.Visible = True
8 I  j1 C8 O( @    I = 1# b; b/ X/ J/ B% B' D. P
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "") _3 S, ~6 y- f1 _( ]/ \
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)7 b( F7 M0 |8 _: D/ W% m
        DOC.SendCommand Sheet1.Cells(I, 2).Value8 _3 p' B) l+ E& M2 D
        DOC.Save1 Z* D( L0 q* N, ~  [" |: [( {' `, {
        DOC.Close
5 X' G" j' E& l+ H        I = I + 14 d% a9 |: ~. o
    Loop
! B: S" B( E9 w; D  `    CAD.Quit
* }* V6 G: A- z1 o% C  H- L" vEnd Sub
! Y# ~* h& j1 `. @/ m/ V' C-----------------------------------------------------------------
4 r# b# l0 ?& \: D" C运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。& S, F# C9 p7 M; Q% M& h0 T
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif! ~0 _: e7 p0 `
代码可以这样写
! H" f- h/ N0 A& V- j& G-----------------------------------------------------
# b" U1 @  J. @; k9 sSub A()3 H) @) t$ A; }+ u% G5 V, q! p4 u" p
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
3 \0 R2 k: A# t7 D    Set CAD = New AcadApplication. E) T0 ]( f5 g! J3 e
    CAD.Visible =  ...
9 q6 X! V4 q0 _! ]! ~6 t7 Z

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

回复 13# 上山蜗牛 的帖子

2楼代码注释; \2 E* j$ T  k4 S& q' L( X: L
----------------------------------------------' C, Z. l' |' H: Z2 ]
Sub A()4 n) D* J4 W/ i, Z* A$ T
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
# w% H: U; |5 Q& J' P4 g0 b3 H3 Q; Z    Dim DOC As AcadDocument '声明AutoCAD文档对象
0 @+ x% Y: y5 O& x$ u. R8 v9 X9 R* X    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
$ w9 E, G# X$ h2 M. X! f2 i    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。+ i8 `$ T! c% r" R# R) b
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
% Z, X/ |; e0 B( I& n    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
* @7 W& U4 t& U! h" t, AEnd Sub& H  i3 e( _1 G8 f! c" I2 D
----------------------------------------------
+ T( H  Q6 I: R& u5 ?3 l
- r9 h, \( p+ V% _. r# s% r6楼代码注释" i' t. E; F. G7 |3 V& M1 f. L2 R
----------------------------------------------8 \( a) c; p0 {8 k# `, D
Sub A()
) ^. I9 z) T0 i: w$ z$ }    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象) |* k0 j6 q" U) }! g3 h0 z! j
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)# O4 F' B. z* Z. S0 Z3 E+ U! ^7 P
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
3 w5 S1 y, B7 n  t    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
! R; Y! @* ]3 G! o7 K+ p, {End Sub3 c6 ?4 A, l* ^8 @3 _2 C# H
----------------------------------------------* |  n0 X( O4 \7 k9 `) k
3 @; |; q# M& i- {' I& g% o
10楼代码注释
% d7 b  ?9 R/ i& k3 D6 Q' A----------------------------------------------0 V1 g. V+ E* ~9 [$ K3 ?
Sub A()
& @/ x0 x$ S& J) R: F. _+ Q9 l    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
+ t. Q) r4 H4 H- s/ P    Set CAD = New AcadApplication '运行一个新的AutoCAD进程4 ~+ D) z  f- p6 C8 A3 Z
    CAD.Visible = True '使运行的AutoCAD程序可见
6 L; C; X5 \2 N0 \    I = 1 '从工作表的第一行开始计数: k; e" m  f% E$ I) n1 V- n
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
1 @- ^3 n/ t9 M2 A        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件) q) O* Z! A; B6 Z
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
; K. }/ X/ c4 V' f8 {' J$ L; ^1 L        DOC.Save '保存文件. r  ~8 ~( A, R) t
        DOC.Close '关闭文件  C  Q; Q  c8 d3 w$ T, Z
        I = I + 1 '计数加1
+ S- F) ]0 a: `8 r  K! e0 z    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。8 I$ d  W/ Z0 _0 d' ?+ U, b
    '如果检查结果为单元格内容为空,就执行下面的语句$ n# i" ?, U/ l9 u, l& w
    CAD.Quit '退出(关闭)CAD程序
- Z4 G; {& U( c# cEnd Sub% }& A( R% D6 W- W; b
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
+ F2 |2 ]# @' x0 {( z3 [" E) B. x版主说说看vba、lisp这两个到底怎么个差别
. d# q1 X, S6 @
% r! @/ r1 d3 d& ^8 g' k4 Z9 A7 c[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子  {: J$ i* \3 D; B3 ]/ v
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif! h+ q& }0 G0 }
2楼代码注释7 w) q7 |: I2 o  Y9 g; C
----------------------------------------------) D6 n* U* @& R4 y
Sub A()! |+ J- C5 D& W$ H7 g7 N. I
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象% E0 \* c0 H  f5 E# l3 C" j: x# v
    Dim DOC As AcadDocument '声明AutoCAD文档对象
( y, e( L# W; P2 T: O- m4 W    Set CAD = New A ...

+ Y5 u3 b% T2 a+ T如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。7 G: S/ q* n, ~# s
实际上字符串中的空格(实际也是回车的意思)也可以这样。
3 e6 y( \" [! @+ p% ]另外,按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 \# p* ^9 Q$ w# ~2 g

8 }7 X% ~) F7 a" c' r  a& l' T% W' r6 v& D8 G
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

$ B0 R. b" P0 J, D/ C  t! X5 y6 |1 I$ p' y2 L& U9 ^; r3 K+ {
+ \( z. |, p8 j2 H& H
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
2 ^% N9 N. T* m( A4 h
! x: F: g8 e& s1 g' A1 H如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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