QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:% M" z. M2 V+ o5 v4 h
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
* Y/ K- ~! P4 O Untitled-1.gif ( S! t% ]% y: D; O- B
2 l) d) H# r% H2 K6 R4 G% l
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
0 a9 [& n) V+ D8 l7 F. L) R3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。7 A2 B  M0 B% V+ m: y
Untitled-2.gif $ h6 U! e* U4 ?7 @  t

& Q/ v" x( f6 J8 A3 E4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
9 {3 d* F  n8 f$ B, p$ v-------------------------------------------------------------------------9 u  b, y* S! Z! C1 I* ~7 k6 J3 j
Sub A()$ G  j) k0 W8 j) W* x3 s/ e
    Dim CAD As AcadApplication, DOC As AcadDocument1 A0 e* }- X, C4 A
    Set CAD = New AcadApplication$ e2 R" H# V8 b
    CAD.Visible = True
2 N" f  X* ]* U6 ]    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
" y9 L) L  I" S* P# Q    DOC.SendCommand Sheet1.Cells(1, 2).Value
: A$ Q- @9 T$ I/ u8 P4 ?End Sub) O( G' c' x2 H) m
-------------------------------------------------------------------------$ B/ c) K+ [5 G2 w, m
见图37 y/ T% E" C7 b' N" ~$ }
Untitled-3.gif 4 \6 H( Q; }' w' R5 f% ~, T& S- V

# r( G9 w+ e/ e- e9 ^" }5、在EXCEL界面运行宏,见图4. X0 x7 l* }4 P
Untitled-4.gif 9 i% G4 {: ^* t) d* t" y; _
" \) @0 v8 o# ~3 i! @6 k
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5, _- V+ Z$ q  I+ E7 ~3 a$ `+ n
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# 的帖子

上面的代码改一下- n' m7 ~/ j8 A; u
---------------------------------------------
1 G, I4 n  {# s6 y9 n$ ESub A()
+ z* q  {% g$ |1 [5 p- V! n4 H; ~    Dim CAD As AcadApplication, DOC As AcadDocument5 D5 j; y8 Z4 c, b
    Set CAD = GetObject(, "Autocad.Application")& b1 u2 x$ f: d7 N. ]) V
    Set DOC = CAD.ActiveDocument
$ M" u+ `1 @3 f! Q    DOC.SendCommand Sheet1.Cells(1, 2), J5 F. O; Q& M  E) h6 I  ^3 a
End Sub2 ?. n7 ?2 e" b- \0 D, c8 I
---------------------------------------------
8 e6 ]  W) ]& t2 U& O6 w本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接6 c! d3 P6 F; d8 l+ F8 d0 t
) @7 P) Z- E3 e
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
% x, }; l9 c3 N. O! u' z% I
$ M, c9 V9 N5 X[ 本帖最后由 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
% i4 W# y& z  G2 t2 h不太理解你的意图,能否再说得详细些?
; e3 ^4 Y9 Y% I" T% d% `9 h7 c
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
- N6 d8 p: |$ w8 H8 I
; T) ~' e: O: u% _8 E$ ^5 A[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写8 ]  S7 M* ^! L# M
-----------------------------------------------------
8 i5 c% g8 R* U: I$ m! S& b) KSub A()
, A+ P+ O0 S0 f- w  I! U8 t- n    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer8 \8 l4 G5 n+ d' b3 b
    Set CAD = New AcadApplication2 ]! g' D  U" n9 V5 ^$ L
    CAD.Visible = True
: C/ N3 q- ?( p( X! b    I = 10 T( x0 N+ `2 g6 }
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
( {$ ]3 O1 w+ x" W3 \7 N        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
8 X; k7 }/ F' I, E        DOC.SendCommand Sheet1.Cells(I, 2).Value
1 z5 J# l0 p/ P! e) c        DOC.Save
9 T" }/ O$ u3 B$ O% ?- I% Y0 P" O        DOC.Close+ |6 u; Q3 b0 ^) U3 I' X; d! ?
        I = I + 1* \$ F+ j  U! r' W
    Loop& {) @* z) }, R- {
    CAD.Quit
/ N/ P1 p: I, X8 V7 o. Z8 g1 o5 pEnd Sub2 h+ L2 L7 H6 t2 {
-----------------------------------------------------------------( @/ A  U* G- W5 V
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。0 \  U1 g2 G& i2 ?) i
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif& d4 v5 q* \/ M& k8 {
代码可以这样写) ?) G9 [; ^% X9 u9 a9 P5 T: v
-----------------------------------------------------8 n0 M2 W  @2 A9 D: x+ M
Sub A()
4 n6 S- E+ V" y/ ]" g+ T    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer3 d0 S5 O- [4 `3 q6 x; d. B
    Set CAD = New AcadApplication1 u0 p4 k+ q) e4 `$ j
    CAD.Visible =  ...

: `4 J/ s5 {) L4 C- A( U/ `; _/ B9 U$ e- T1 h1 l
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
, _+ K3 B3 O5 ]9 ~" X因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
0 C9 w" V  R# k3 Y9 g5 O) K----------------------------------------------( j2 {3 @5 q, F8 a& \" U
Sub A()
7 j. t, z! E. I8 k, M    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象3 z% p& V) ~. a- P) @) y0 U
    Dim DOC As AcadDocument '声明AutoCAD文档对象3 Y8 G- r) l; I+ s4 l! {( f; Y9 ?
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程+ r& W  H4 b: L# O
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。3 R( J1 X" {- `7 _
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件9 }1 E' R' b2 s" y! O0 N! J
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令, d# x' s3 p  C2 C, I5 W* p5 R
End Sub
, v$ V0 |$ j& |' b) L----------------------------------------------
+ G' w; N( |6 j+ b& O6 R, W# q3 g! ]5 g
6楼代码注释
4 n& V) w/ E! C% b; j7 f; q. Z  ]----------------------------------------------
; o$ y: B1 O& s' ]6 N# W% PSub A()7 E2 I7 N3 b; G% s6 i+ a& |/ a
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象  ?" ]% z2 u. M, g! O
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
3 @) d  J+ v+ ]4 |; x7 Z    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作+ N  S0 H3 I: |: p, C& J( j
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令' S$ g7 n8 j& e) g5 }
End Sub" n0 ^# s+ e/ h  p
----------------------------------------------' P6 Z' S/ v% P" J: k
7 G/ e' E; a5 [, y. e
10楼代码注释
" r* N1 y0 ]2 h5 d9 b' }----------------------------------------------, G; O& L* v, x! g4 J9 G
Sub A()
8 ?+ r% C. ]" I: x) k5 N9 R6 N    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)$ d/ I7 F# m; W& Q
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程' c# N0 \! O' e4 u6 k% a( x5 y
    CAD.Visible = True '使运行的AutoCAD程序可见# f8 S7 n- b3 E8 B! O
    I = 1 '从工作表的第一行开始计数- z3 D; N2 W/ R9 G4 K& s8 Y5 ]
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空" }( \8 g! w4 g$ J3 L8 w3 @" {0 s2 I
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
9 B# v6 i$ u0 p9 w1 L3 e7 G5 M        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
% Q+ ?4 C' t  \2 J! J/ ~        DOC.Save '保存文件
/ J$ I- q4 d# P+ T        DOC.Close '关闭文件/ l4 O: C5 m$ S: X0 P$ v
        I = I + 1 '计数加16 E- G4 U4 {; l/ d& F
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
6 v3 x5 q& i5 I, J* e+ H    '如果检查结果为单元格内容为空,就执行下面的语句
0 M8 x, x: N4 K; d: v+ e    CAD.Quit '退出(关闭)CAD程序
1 x. J5 D: K' ^! UEnd Sub- Q2 y, X) E% E$ [3 b) V
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!! ^, ?& {2 ]# ~9 c1 @
版主说说看vba、lisp这两个到底怎么个差别
6 \) t4 K( h0 k9 ?0 I8 y. a) A" v' v9 Y) W7 t
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子! n( \6 s9 G+ S+ a
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif6 A* F' h$ H# X' E7 u$ v
2楼代码注释3 f4 j$ ^/ [% ]2 I. e3 U2 U4 N
----------------------------------------------
! _& s. X- Z! a7 [# K% l. q2 |Sub A()
, F5 v8 j4 I, W7 e* H3 L. Q    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象( h% t0 v0 s9 n3 _; V2 e
    Dim DOC As AcadDocument '声明AutoCAD文档对象
% t2 [7 e1 c5 H! N0 D    Set CAD = New A ...

- B7 u* r3 j  C; o2 Z, t% a如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
  n% o% E5 b- ^- N1 o: z实际上字符串中的空格(实际也是回车的意思)也可以这样。
' W$ F; M0 W& }- f" 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
9 T0 h' X, v: d/ J8 n9 ], P. Q8 [! N, D

/ k( w( P# \$ ]% i学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
7 A: V4 v  t7 y4 s
* Y. p) ^7 j$ A1 M1 c
; T: u4 ]* N  s, V" i' u
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作9 q( K5 H( J5 R' \3 r% ]

( _) X6 v' a" M如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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