QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
( g2 u$ `3 h) w, ?) m+ B" ]( ]1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1: P' B1 C& A; `, _. H" ?7 h
Untitled-1.gif
2 i) k- i' m, X# {  c% Y- J3 ], q' z" q% U: d3 m$ E- |$ S. v
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
. w7 z% T' c' y9 i# B6 w3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。4 O) e! [7 |" L/ @# I5 O; o
Untitled-2.gif 8 K' }* Z( V2 {3 r: i

5 v/ t2 l5 L9 s; x$ {6 K! n& m- U4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码9 C2 L% l+ \. K: b) k
-------------------------------------------------------------------------
% f7 S- j$ v* bSub A()
$ z+ N2 `: a' t3 f5 `: \) l    Dim CAD As AcadApplication, DOC As AcadDocument( w3 T- P, i7 S0 d1 T3 l# ^
    Set CAD = New AcadApplication2 z8 b  g; ], R+ a) p( n% j
    CAD.Visible = True
1 n: s! z; D0 Z0 q$ c6 X! f    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value); _& I' j; E! Z2 w
    DOC.SendCommand Sheet1.Cells(1, 2).Value9 z6 b: H$ z7 k( E+ q2 @! B
End Sub
5 y. H  F) B) t( d& M  ?& |-------------------------------------------------------------------------
+ i, J# c8 `4 t5 @% {见图3! j8 b. f* E( Z9 |8 B+ d
Untitled-3.gif
9 e+ w; e6 T9 K7 t6 C
: V4 ^# z) W9 B6 V+ ]5 E5 f5、在EXCEL界面运行宏,见图4  s2 }- l" p+ Q! S
Untitled-4.gif , s4 Z3 n; W6 ^
5 d6 `" P( t8 L1 a3 [  v
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
- b$ ]% n/ ]" V% | 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$ Z3 \8 v5 n, M4 ^0 S7 }- |8 g---------------------------------------------5 u0 `! _- m1 X$ `- I
Sub A()# Q1 z7 R9 t! b+ F2 D% ]6 ?; a' X9 E
    Dim CAD As AcadApplication, DOC As AcadDocument6 i) K4 \: I2 Q/ B. J$ L
    Set CAD = GetObject(, "Autocad.Application")
: ]. D4 O- E$ J/ R  M: N    Set DOC = CAD.ActiveDocument
! v7 r& s, p1 B0 b- Y    DOC.SendCommand Sheet1.Cells(1, 2)0 u$ @- E6 Z5 g: K. R8 H
End Sub4 o% b: }6 ^1 @' V$ S/ b
---------------------------------------------7 N  L( m0 h) P6 _
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接' n2 i( B* u0 H

; w4 {# J: Z& L6 t0 e1 ?1 K' |7 _[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?% @! b0 R/ Z" ^3 z! q
2 N8 M* {+ @8 K, s  I
[ 本帖最后由 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+ q6 n0 j& p! a' X  Q) F
不太理解你的意图,能否再说得详细些?
  o% g4 f" p) [; I# K2 u, P
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
  K( D0 E9 B% }( U6 w5 n  D
7 N  Z8 J% P% P( V9 g3 d- D6 S) w[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写$ d' w* X4 T" f" _8 @
-----------------------------------------------------
/ K& a8 M! C' I! LSub A()
1 T0 s' g3 n* j" i    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer& \5 x* l0 e$ a9 \3 `6 M$ _  v
    Set CAD = New AcadApplication  s' g! S8 @6 a: j
    CAD.Visible = True
) @5 @) J0 H1 u    I = 1; I& [" @7 w4 w3 k# {, S' U( m
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
# ~& C3 C. Q$ b+ Z        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
5 Q) R; r2 Q  E        DOC.SendCommand Sheet1.Cells(I, 2).Value  c: p; x; f, N* E/ M
        DOC.Save
& C" ?3 h% P- p: ?) _. w$ U        DOC.Close' @, |+ O9 l6 O/ ~! a" \' U% V9 f
        I = I + 1
* X: e7 k% T# H: c8 w6 W* T    Loop
- E7 E( M6 [/ |: a" L    CAD.Quit
3 f, k& S& A7 tEnd Sub' Z+ t: S, s' x; I! L
-----------------------------------------------------------------
4 F$ d  e/ s- v! n7 o运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。/ F/ l1 q0 O+ |, j- }( J9 t5 b4 N
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif+ j2 T% C& w7 m/ {
代码可以这样写
, g0 v$ y3 s/ N/ a6 e-----------------------------------------------------
. p+ \+ B: O0 U1 l+ d# u% OSub A()
  r4 K  `' N* j    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
% i2 V# T4 _. F/ F    Set CAD = New AcadApplication
: O0 b2 ]# k4 S2 E  j  T    CAD.Visible =  ...

8 }0 ]9 V/ p. a& R. m2 z1 Q: _
  a6 U# t& Z0 ?* w% ?2 i学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
6 I- g& ], @  _3 i4 ]因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释$ V5 z/ I" y- R9 p3 G
----------------------------------------------5 C* h. C. B) l. C& G, k
Sub A()
) D  s  T1 \8 C/ L0 F: u) D9 P3 k    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
" w! g3 t8 g( u  v    Dim DOC As AcadDocument '声明AutoCAD文档对象
$ f* u" w& G" l    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
1 ?7 V$ J6 f4 {! f# T" `    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。5 y+ K! d+ a6 B; H0 w
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件6 ^* q; o, ?5 ?" e! m" k
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令: {, r- e0 m- M" k5 x, I
End Sub! w$ C" o( X8 E0 L! n
----------------------------------------------6 k0 k' ?% `8 L4 x
( ?' j* N7 j1 K; K
6楼代码注释( A; n2 h' \0 N% l- |' n# F' Z4 ]
----------------------------------------------
+ H/ r$ P  E" ]' [0 ~Sub A()& [8 w8 }- P: J  i
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象7 i/ l  W6 \' C% F9 ]* N6 x
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
: }1 i" {; I% |% d' g' m    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
+ C& n' W; l+ @) h7 e  @9 f' j* ^7 X    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令, _! D9 Z: o3 ?" H
End Sub$ ^! D5 f% I6 V4 N' ~
----------------------------------------------
0 u/ t1 n  D  e) }1 A7 N$ ~- ^3 Y8 o4 b: ~& A/ E4 \! P
10楼代码注释) y9 D* D  V& a" Z  I
----------------------------------------------( I1 M, m; b" f9 v$ T$ K( q
Sub A()
: k" i8 p- y5 N- Y, N* A  _    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
# v8 t# U8 ], p. j; H5 D    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
' n* s: X2 `' F- @/ }! d, D    CAD.Visible = True '使运行的AutoCAD程序可见1 s1 T  H$ c6 R
    I = 1 '从工作表的第一行开始计数. R: Q' `# f8 J) h; I" Q7 t
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空( [. P7 [8 _6 S% U+ q
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件. |; m9 Y  v$ B
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
& R; G9 r3 ]8 e$ z" E        DOC.Save '保存文件( Z1 Y/ j6 ?2 I& W6 Z+ U8 p
        DOC.Close '关闭文件
5 W  `2 h0 `  W" I        I = I + 1 '计数加10 J& c  u. S1 z. }. X4 Q
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。5 X/ z0 r) d8 s7 Z
    '如果检查结果为单元格内容为空,就执行下面的语句
  \/ W+ |! y9 ^. l' |+ ?8 E2 Q9 P    CAD.Quit '退出(关闭)CAD程序
$ Z. F) d8 N) ~4 t- L$ c" lEnd Sub
% F6 Z$ I% O# A/ O1 ~8 a----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
- D6 f. ^. h/ o/ o2 J版主说说看vba、lisp这两个到底怎么个差别
* h( ^8 }" [4 g6 J9 S. N' g' c+ p' o8 z0 `% h7 K8 q/ L) P
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子5 i: Q; J- I. y# L1 n
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
  |) M, ]3 w2 h8 y- E3 k& V3 W2楼代码注释
" F8 @% @% B% ^) a" h- e7 G----------------------------------------------
, k8 f; _& l) VSub A()
& e9 c* g7 r% S+ u8 c    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
6 e; c1 ^9 Q9 _( T- ]9 o    Dim DOC As AcadDocument '声明AutoCAD文档对象
9 m8 d; h0 _3 V1 n6 i    Set CAD = New A ...

4 D4 E: g0 q2 Y: m6 N$ C如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
( @1 i3 ^* _& X4 b$ r; U; q0 m实际上字符串中的空格(实际也是回车的意思)也可以这样。2 ~" R6 a3 Z" n4 v# G  C. N
另外,按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
* |0 T$ P% _) E% }3 ]
8 N: D2 a4 ^" ]2 N
/ |- l6 k  R  R学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

6 o  w. E% C3 Y3 C/ v
" ~/ U7 }% j# v. q" ^+ g! {. h! |; T; |$ E, I
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
6 o% O: ]" S) g* G& b7 g& M
( j; |- c2 m4 N如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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