QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 19887|回复: 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 f% s' r  ~! s9 ?/ _, m
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1/ h) G/ z; `) `8 b" h9 b: l
Untitled-1.gif ; j- \$ c( _. B1 g4 G; u& A( Q1 ]' Z

; b3 Q; K3 z, B' M8 N3 h2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
$ A9 ^9 w5 u/ p4 K9 b+ n! w- u3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
3 |& R$ |! D. R6 L! ~8 v Untitled-2.gif
! K+ A* w7 ?$ ^
7 W7 s" d2 l. Z0 Q: I% k4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
! o2 F+ M9 l- m7 V5 G/ N-------------------------------------------------------------------------2 V& f+ x' I1 s: a& r6 I
Sub A()1 z+ F1 z5 L3 K4 B3 B8 ^* Q
    Dim CAD As AcadApplication, DOC As AcadDocument- C# ^, e# Z* [' }6 S* D
    Set CAD = New AcadApplication
4 ~. a8 T9 w9 J# s3 c$ e    CAD.Visible = True/ _! N' `$ w  C
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)  {3 `2 s+ J- ^& P4 e
    DOC.SendCommand Sheet1.Cells(1, 2).Value' G7 i4 g! ]/ `  m
End Sub5 [4 d1 W. E0 u. G7 z
-------------------------------------------------------------------------
5 i) h4 v4 j( ^) D见图3
/ y( X% q; O8 m+ t. U0 O/ | Untitled-3.gif # H: W% h, Y- R* W) y

, _! `7 ^, i' v. `5、在EXCEL界面运行宏,见图4
" g$ S* y& V. C# E Untitled-4.gif ( Z  S7 v* D" L& }2 _& [8 v

. x$ Q2 g" v& m6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
8 N2 i% y; Y+ k' q- D+ F9 F. I% t  T 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# 的帖子

上面的代码改一下( \- m8 t0 u0 q" j! k; H. s2 H4 }
---------------------------------------------
% S* d7 i  {: R' j+ QSub A()! F) l3 k( Z. _
    Dim CAD As AcadApplication, DOC As AcadDocument) R3 C; x6 c5 @( R  x
    Set CAD = GetObject(, "Autocad.Application")
0 W; S) z+ u) s- [3 S! Y    Set DOC = CAD.ActiveDocument2 J  L! ^- B& j/ _7 C: F
    DOC.SendCommand Sheet1.Cells(1, 2)
$ i4 w# c5 X  ?3 R: ~9 cEnd Sub0 U; S# t/ q6 Q
---------------------------------------------
/ C" T0 {) g' b# _3 v6 L本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接2 g, T  u' s2 L/ o' J

$ H! ~2 h5 }% c5 d[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
! a; f7 k- s4 {5 y3 x5 B
" p0 K3 S/ ~+ J- F# }/ q[ 本帖最后由 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
( l2 V2 `* B, h% o不太理解你的意图,能否再说得详细些?
5 b; G2 c% @' e0 L! g9 ]
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
' y8 i# g1 p; ~& T( W! J& I# F! }1 u4 d6 ^
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写3 L4 u. K- X6 q9 Q; B: J1 a5 g
-----------------------------------------------------
: a% c) e5 K, y: FSub A()# ^6 r1 t( \* y6 \5 d
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer+ |4 l+ j" j! B
    Set CAD = New AcadApplication: S, M! M' H* s* W
    CAD.Visible = True
5 u0 X5 Y& e% r+ x2 e    I = 1( e) g1 K2 M6 B# U1 s- Q& f% o
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""# U$ t2 j3 r2 o! g# a
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
5 @! {0 \( Y- u1 x) p        DOC.SendCommand Sheet1.Cells(I, 2).Value
( x$ U$ S1 W/ f  W+ b8 X        DOC.Save& u+ ]2 u! ^0 y) p
        DOC.Close
1 U7 P$ p" v! Z        I = I + 10 O& ^3 S9 k; B  x& G
    Loop* U: Q2 k% B( z6 ?8 R
    CAD.Quit8 C2 x% @1 @; l, s; ~
End Sub
0 Z0 ~9 ^* @5 _+ g$ K$ _-----------------------------------------------------------------
) f( @2 c, g" }: w$ H运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。4 f' b4 [# L/ c- b$ }+ b2 K
本程序仅供参考,其运行的前提条件是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. q0 B+ T1 o+ c! {7 O' X/ D& `" c
代码可以这样写
2 L( o4 ]# l3 n' S-----------------------------------------------------
" R0 }5 s1 |% Y; I0 H# a. KSub A()
5 p( e- P- y' ?    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
8 L# z- N( k6 H8 w    Set CAD = New AcadApplication1 k! i% z; B( H, h) X
    CAD.Visible =  ...

' L: f) n$ T  L3 T
9 B" }/ F/ c- u6 g2 D' C5 C学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
7 {  Z/ `/ ~. j3 O+ G0 }$ u因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
0 K; H# x5 Q. M' R. J0 s1 {" m----------------------------------------------
5 w8 ^1 r" e' v, V6 I' ESub A()
; ~. }* E3 Q, f$ B( d( E    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
) `" D7 ]9 ]1 `5 q2 g4 |" J    Dim DOC As AcadDocument '声明AutoCAD文档对象
* Y7 {8 W9 @+ M& J' x% y5 y. h    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
4 O% Z  \8 C5 m+ b" F9 q    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。  O8 R6 S5 u6 ?$ \+ p2 S8 S
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件$ f, e. t7 d2 B
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
2 S; F! i/ ^; l; ~3 o1 j0 GEnd Sub/ O% I8 S- s% Z4 M  y! B
----------------------------------------------# l# J. b! \, f+ s4 E! Q: S

4 m  J5 y' b7 `5 m, h( {6楼代码注释* b  {6 `1 [# r6 G
----------------------------------------------) L  R3 m* {/ a  H" m! a
Sub A()
1 V; e7 ]# P8 T    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
( a! ^  o, x# l2 W    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
5 o" C' [4 P1 Y* C$ a4 P* |; X9 T3 H    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
3 Y2 o6 S' F' b    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
) V: j: n% I5 J5 G2 {- l' b+ d+ YEnd Sub8 H/ E1 d" z6 k
----------------------------------------------% @; s9 B$ [" E( Y+ A

/ r- N7 B. m) e0 a10楼代码注释
6 |3 j3 o. ?  k----------------------------------------------& @4 Z1 i( g% ]0 _) J# S
Sub A()
8 t- Q6 ?% o+ Q) `: i  O6 t* b( I    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)7 a  K/ ~1 ^  s' w8 L
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
7 \( C. U" T  [; d    CAD.Visible = True '使运行的AutoCAD程序可见
2 }, S8 @9 [7 X    I = 1 '从工作表的第一行开始计数4 \0 M# C' L) @
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
5 W  d2 o: j, t+ D        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件% r6 `0 g% f: e# b3 q7 S
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令4 d0 h( \0 G6 D/ [( k+ B4 W; f
        DOC.Save '保存文件
; }) p: u# \3 W. K' w% n        DOC.Close '关闭文件
8 j! Z- u8 K. S0 ~        I = I + 1 '计数加1
0 m* l; X- U. u! ?& d, [    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
( W% V  M2 }' t6 T* }" a    '如果检查结果为单元格内容为空,就执行下面的语句
5 P  [* L7 `6 d* |% \    CAD.Quit '退出(关闭)CAD程序
; Y1 L+ Z2 R( s% A# V# e9 l: nEnd Sub) B" _5 [9 v) `7 }
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!- a7 g& S; V3 `6 c' n
版主说说看vba、lisp这两个到底怎么个差别
2 v* n0 U4 X2 e/ n) s$ T$ i4 ?1 Q' H( v' G: l- N
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
7 b* Q7 U* ~0 p选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif% L1 k+ I9 |2 u* w, w* d" i" A
2楼代码注释
  T+ d  W% ]" n+ P----------------------------------------------5 e7 e+ O4 [' H+ Z+ t/ R- i
Sub A()
. E7 K4 }4 P* d+ s" j0 T2 P* j" B    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象" u& P( k0 z# ^& O  W& v
    Dim DOC As AcadDocument '声明AutoCAD文档对象- U1 {$ [6 p0 S
    Set CAD = New A ...

- l7 R  I3 S/ k" Q1 k* g+ `, N如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
8 S4 p: b$ G% N8 M. y5 \/ ?实际上字符串中的空格(实际也是回车的意思)也可以这样。# K8 k4 r2 q# p& A0 D
另外,按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$ o7 b8 \5 ?

1 v3 y6 O3 C1 X! m' m3 O0 w, M' s' H
0 w& n/ |# \  a学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
# T/ u+ b, H  c1 a9 o* Y) Z, b

2 q- E; N: m. Q. O2 a% \1 ^! [# e: t, v# g) M
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
8 G+ a4 L3 c2 j' H; k! F1 }) E0 `7 P
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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