QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:, V! U: ?0 I9 a0 ^. _' e
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
) f! u* ?0 r+ d4 T$ p7 f8 W Untitled-1.gif 3 ~- k% l* s* |/ f) Z
# o' N1 i. [7 V+ p
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
4 I! R; F2 b+ c# M; T2 J6 F# r  I3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
5 Q) i! R3 U) Y6 U Untitled-2.gif
& b$ v; F9 v6 I7 l0 v5 x  |
$ y' i$ i+ {! b4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
+ j- l0 i4 P; j# }( [& _-------------------------------------------------------------------------
* A: W! ?' x% @3 z' V5 x4 t" bSub A()* d( S8 W' c" J: [- i/ q) V
    Dim CAD As AcadApplication, DOC As AcadDocument7 K5 |, m6 l& `8 k+ L1 Z
    Set CAD = New AcadApplication
% L6 O8 s2 q% Z. U+ H- a    CAD.Visible = True+ R) Z0 d0 z; w1 ~' D
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
3 o, c3 v' c* l# W% x8 c! o    DOC.SendCommand Sheet1.Cells(1, 2).Value
  }$ R- v4 W2 ^: JEnd Sub
8 Z" w0 q8 s8 t9 }$ H/ }& v9 O-------------------------------------------------------------------------
- `) K5 S0 n" \% j* T9 ^0 `见图3. P4 i% S7 ^" }3 v, r
Untitled-3.gif % s* |# O: ~3 S1 U, s- f! |

! [5 ?7 P0 P  H. S0 L( p5、在EXCEL界面运行宏,见图4
' l* d6 y) g& v' G, k- ^/ { Untitled-4.gif ( {0 [; m0 {0 i" R8 J/ P7 O

8 c! z2 g! ^" m. h! k; i; \6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图54 J& G4 d. `2 o
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# 的帖子

上面的代码改一下
$ [/ n8 C1 p0 ]; P  W---------------------------------------------( }4 N7 o) @9 k0 l7 M
Sub A()( V( A# @2 m/ Z
    Dim CAD As AcadApplication, DOC As AcadDocument6 p- A, V( }3 Q2 O2 T3 j1 }
    Set CAD = GetObject(, "Autocad.Application")" T) l6 ?. I, w' _5 m2 O  f
    Set DOC = CAD.ActiveDocument
) h0 V% ~1 |9 C. B    DOC.SendCommand Sheet1.Cells(1, 2)7 J" i" ]# y+ Z5 |, S; T* g' Z
End Sub
7 b0 i% G( K! r! ]( @---------------------------------------------
2 C, ^- G5 ^$ _9 u/ X7 n4 @本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接0 e) Z  e3 `; M2 m0 L

! y$ F! ?# \' N( \% h& F- F[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?3 ?6 i! a. o" H0 a+ i

" C5 P5 p/ w! @$ C! k9 C: T0 X% V+ U[ 本帖最后由 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
( U5 C+ B/ I; Y0 h0 s$ e5 z: W" D不太理解你的意图,能否再说得详细些?

; b0 c9 R4 Z7 U# \; ]1 L# N就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
6 G+ o  ]' i, H& G" ^9 C. a3 U3 h
7 t) y2 }( W! U[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
% c! P0 H  M. b$ p! i6 T* m  I; C, o# Y-----------------------------------------------------' J* m" t) D1 H8 U2 K
Sub A()
# j! F8 I$ h/ E9 j( \2 h( V5 q    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
+ K8 b8 c* k2 t* L1 B: |, g    Set CAD = New AcadApplication
  N  w3 \. X4 T; f    CAD.Visible = True
5 J: q' X) J: Y    I = 1* E2 m) P/ F% h1 d6 ~
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
+ M+ l" a6 y/ Z( N  D        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
: _: J$ O5 l- \1 c5 A$ \        DOC.SendCommand Sheet1.Cells(I, 2).Value8 w3 _7 O8 z$ s! K: G
        DOC.Save, l( {8 I6 `/ |0 z
        DOC.Close
- Z7 N- I. Z8 A        I = I + 1
/ L+ l5 O+ s. L! ]; j: B: Q    Loop8 \/ b, D% A) w/ e: E
    CAD.Quit! @: o( b: z: Q9 p. p1 c# O* ~5 g) W) P
End Sub. k7 G" ~" d+ J3 |+ m
-----------------------------------------------------------------$ J) H- N% h4 F3 T2 l9 K0 Q
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。7 V# t+ b9 H: ~& A9 |
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif8 Y5 n' b9 m/ Y
代码可以这样写# V6 _! H" e5 ?! \
-----------------------------------------------------
& y0 `' l. E7 VSub A()
0 n% B/ `1 B/ _% A" `. e    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer' f# X( P# v8 l  \: U; H) d
    Set CAD = New AcadApplication# C$ r4 \% E& D
    CAD.Visible =  ...
6 y; F( z  l9 e+ ~  l

& N7 I5 `6 @# u. _学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!) z& i1 d* E6 ?
因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
6 @4 n) v- u5 S! `' A7 _----------------------------------------------" @/ c! b7 J; L# p3 P% N* I
Sub A()5 _- O0 h+ |1 y/ d8 U" @  m& }% V
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象; C7 `, L5 w3 c  I
    Dim DOC As AcadDocument '声明AutoCAD文档对象
* K+ G- H6 ~; Z3 s( f    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
/ O; }; ~, ~' e; f    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
: M6 P0 Z3 m- ?& Y    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
/ L/ N; T  p6 |% x    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
9 Y2 }0 D' @* _/ i8 lEnd Sub
% u& g5 [3 c4 O/ a----------------------------------------------+ a/ x+ C5 F3 {4 t$ s1 ?! B; u
% w2 f: e9 l% K" a) `/ J% f& m
6楼代码注释
: f0 I0 Y4 g% P* K, M6 D----------------------------------------------
5 k+ X9 P* \; \6 ]/ o- \# w- ASub A()
% S3 J1 u& W' ?6 }# x% m    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象1 e5 @- D- j2 I" Q1 G0 E
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
& o" X0 ^) v( Y+ b' ]' f( O0 |    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作  F; C( P# \6 }5 b
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令0 o6 [: ^* W/ `( _+ ^( W4 e. L
End Sub
7 ~. l- n3 d+ L$ X5 d* R! T5 C----------------------------------------------
% k$ d4 i# P: \6 q; P) q* \  G
% }# J) ]6 x  L10楼代码注释
& x0 h- r" o" |9 x! f5 h! l5 c0 n9 ^----------------------------------------------; A0 M. x7 L$ T% h( A
Sub A(), i8 B5 L, }* Y# Q. S& S3 p( p0 u
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)' u1 |- H  S9 P4 K7 a* ^
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程1 u2 D7 `8 a/ J- R
    CAD.Visible = True '使运行的AutoCAD程序可见& e9 @3 t' @0 G
    I = 1 '从工作表的第一行开始计数# x% v3 l  h1 h) c/ W
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
. F5 D- l0 ?7 I        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件: E  V$ A2 w( \, i0 O2 r, ]( p( p- F
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令  s2 t: u  {/ v% D
        DOC.Save '保存文件  k# u; {; s* @8 q4 X: K
        DOC.Close '关闭文件
1 r+ z9 P- W! p2 V4 K5 d1 I- B        I = I + 1 '计数加1
! z8 }* Y0 }  F* r    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。- `$ B% C0 U1 w; E
    '如果检查结果为单元格内容为空,就执行下面的语句4 Y: A+ J$ ^$ _1 G8 K% b$ w
    CAD.Quit '退出(关闭)CAD程序: |; E. }1 Q/ e( g% Z
End Sub
7 {! q& e& z7 C; l1 `- q----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
3 K4 e) L* R; m3 f8 j+ X, ]版主说说看vba、lisp这两个到底怎么个差别
9 |8 E. {1 I; r0 M# b" W* l8 a0 B, B& n3 t3 W
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
2 i/ t) W; E5 H  v$ \( E选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif) `  x- ^7 d; Q6 ?/ |/ i1 l# X- M1 e5 A
2楼代码注释! R5 K% I8 A; T) H7 w8 n
----------------------------------------------" `" U9 j7 i) T8 K  d" t
Sub A()0 B! b1 t% t0 R6 B
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
& N4 i  M% V3 n: K' G% r    Dim DOC As AcadDocument '声明AutoCAD文档对象+ x  o3 ^! B% h) f+ o3 m
    Set CAD = New A ...

7 |6 P, M$ V: z; M' K) f/ L$ z如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
# i. l- R& \- m5 M  B+ K实际上字符串中的空格(实际也是回车的意思)也可以这样。9 ]9 ]9 ^5 C2 b6 l3 d7 U8 o9 x* G; 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' y! g4 O' c0 v. v- t; k% X( j8 |
! R0 I2 Y, a. _' a2 h% L
" C8 F# Y& M* w  F% H
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

$ n0 u# y) P( k' E) S8 I/ a. p& k# s! ?
% R$ U% `, e( ], f$ h! A
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
$ a4 p* K) H: p' d4 s4 R4 @: p7 m' b) i6 n( O) U" R) I9 u8 @
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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