QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
0 k* E' J4 c  f9 f0 U1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
1 j# i0 z. n( ?0 p* d Untitled-1.gif
$ X5 @. W( Z5 h) n% ~  Q6 k0 f  _/ o& Q! U! H3 ~4 ~
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。, h( k! Y& @7 ?% ?$ j, c2 W4 t, S
3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
5 t1 S& A6 c1 l7 a' L' |8 n9 H Untitled-2.gif
8 O  b2 g' }. S4 I) i6 m) ]; u% E! {2 t$ l
4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码0 }! }) \# R5 g' V6 J* j* n9 f
-------------------------------------------------------------------------
3 e  U+ X* e4 _$ J* v/ ^0 P1 NSub A()( o$ j( u4 X& X1 P, z1 K4 k) _- Z9 E
    Dim CAD As AcadApplication, DOC As AcadDocument
# q- c! w9 _6 \- L4 E* M! G% R    Set CAD = New AcadApplication% X' i8 N5 P2 x7 `8 f
    CAD.Visible = True* n/ N# z( U5 E1 ^! C( Y
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)3 [; P' K% @  Z/ [. w
    DOC.SendCommand Sheet1.Cells(1, 2).Value
3 h6 z0 b+ h% a  O- c* c5 NEnd Sub
" {7 H0 x8 G. L2 G-------------------------------------------------------------------------
& ^4 w4 b0 c* w# u1 u) K见图3# y2 Y" W$ j- G7 B7 T2 @' m3 K
Untitled-3.gif
9 k/ b( ]  R5 f7 t6 k$ o7 k
! _# a+ D) u  {2 o5、在EXCEL界面运行宏,见图4
; J; h- n7 \. Y Untitled-4.gif
! B# B& |: |' x* Q2 ^' O7 @. T$ ~( B/ j/ o0 p6 \6 `
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
4 m- P9 }* W' _  o: f& U2 w 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# 的帖子

上面的代码改一下
0 J3 G! j. {9 F5 s$ X2 [8 t---------------------------------------------5 F% P$ h; b( f& {7 F+ V- E& Z* y
Sub A(), |+ M% I' Y! |
    Dim CAD As AcadApplication, DOC As AcadDocument0 A0 {9 k6 S5 I: y, v4 q5 G$ D
    Set CAD = GetObject(, "Autocad.Application")/ u5 E0 d- e& P; e4 w$ J9 i# a
    Set DOC = CAD.ActiveDocument$ z' B6 e; M5 w
    DOC.SendCommand Sheet1.Cells(1, 2)' v* Q7 l' a9 t: d6 o  X, Y- s7 |
End Sub: o! Z7 o: l6 K2 w
---------------------------------------------
! {. o2 p+ }$ _0 f本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接' o" C* A& ]. z3 F1 D

3 ]4 W; M4 y! K5 q8 [8 [[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?6 o3 H; P5 J8 }
& q. x' ~- W" y' R- g
[ 本帖最后由 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
4 y3 ^. R2 K- m不太理解你的意图,能否再说得详细些?

0 A2 W, E( M9 r. L8 R7 w8 q就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
: c1 c. ], D+ F4 v, A6 T2 H% @+ j& w9 c+ i, z& M
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
# c' A& j  ?$ u% X* L-----------------------------------------------------
9 d+ t1 N- v) ~/ P- L) BSub A()
0 R% ?6 C# v+ i    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
; `) t+ y1 i: u" {  `+ p    Set CAD = New AcadApplication
6 q& z2 g5 K5 x8 \1 j7 `    CAD.Visible = True
, @( w: W$ J' ?1 {, e6 ]  B    I = 1/ g) I9 t6 B9 k' D/ h7 X
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
7 n: z9 d: h) T& E        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
9 t! ^4 X- ]: k8 C# a        DOC.SendCommand Sheet1.Cells(I, 2).Value
7 X' n/ c. {& E        DOC.Save
6 g0 l% T) g  h, K: K        DOC.Close* A. q! d8 i# Y' `/ T$ n7 o6 @9 s
        I = I + 1( D! i  }$ T3 o9 u# s% k- P# o
    Loop! U6 k5 F7 r6 l+ S+ J0 B8 \
    CAD.Quit
1 f! n5 X; \3 ~+ [, t1 v2 }End Sub: `. e" R! ~# i2 A
-----------------------------------------------------------------
6 k) N9 L. t0 R% r+ R运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。- x+ n7 W! {5 W1 `) q7 v
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif
* F: d) p6 e- M6 E! D: D$ v4 D代码可以这样写
9 Q3 `3 N$ L/ G- n5 x+ O7 _-----------------------------------------------------2 L7 s8 K: {6 @9 l5 ~4 M; F  c
Sub A()9 ?" U5 U; ]% t; \5 v" [
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer3 O) R& a! D9 q
    Set CAD = New AcadApplication/ T  }- f/ k& B# R+ [
    CAD.Visible =  ...

9 z" b5 H& v. x+ j. I& X
: j" |, x, y' h' P学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
* ]4 j, C' B# Z+ Q因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
$ |0 M2 T3 x2 I5 r4 M----------------------------------------------9 ~0 S, v% R2 I: O1 s
Sub A()
4 w- `& m# C$ ^+ G& s: U    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象( E+ z4 R4 m# {
    Dim DOC As AcadDocument '声明AutoCAD文档对象" s- _2 `  l, g5 q7 E0 X6 W
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程8 m4 B% l# G+ N; P" O  \. q
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。0 Z# A2 Z! e" \
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件3 y- ?7 D. i/ I7 B7 K' ]* O+ Q! D( Z- m
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令+ n' Z8 o/ l6 `! Z$ _
End Sub
$ X  [% ]: J+ e/ n$ X----------------------------------------------
- Y% ~5 |. ]) L! M2 W  d1 V4 @+ ~4 b$ Z
6楼代码注释( O0 G' y' _2 O+ y  S
----------------------------------------------2 t7 T5 Q4 B* x* n
Sub A()
! p* F% Z* Z/ r3 j/ y2 I; S3 k    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象3 |# p; A  u' e. T
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
/ r) u  B9 v1 F; M% n2 N    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作4 L4 ~- k8 h6 \
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
" q1 B" u: P9 G$ y0 y% EEnd Sub  l* }) H7 p7 J/ I$ d. b, ?
----------------------------------------------
# G: a- R! r8 O9 `5 _$ H* a* L9 w: M' i% `2 ~! W* ^; F
10楼代码注释) E- L$ I/ v, b0 Q' k: a+ S. _
----------------------------------------------5 w0 L& k: i- k4 \+ u
Sub A()
& n  d: x7 ]+ \$ ?% Q2 _    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
3 ^! k# V& b) V    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
& O0 C, H" h5 f$ O( c4 M    CAD.Visible = True '使运行的AutoCAD程序可见
. p$ U: p3 B3 r1 F$ F  M% c5 v/ X: h    I = 1 '从工作表的第一行开始计数# W, b. u. T6 h9 G) _
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
4 _* s$ [& R, d/ L3 d6 L! D        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
& a* ~; k4 ?& x: q' X9 }  U        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令2 a/ z$ R4 l, ^; o3 M8 d/ U
        DOC.Save '保存文件% z' B8 D9 G, M3 U/ U4 N8 E
        DOC.Close '关闭文件
6 D+ K) n6 L. s) l  |        I = I + 1 '计数加1* c' {0 N& W4 M- ?, [8 Q* ]: U; W8 \5 s
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。$ H  }  ?0 b" Z9 x1 b* u! j3 U' s: T2 a
    '如果检查结果为单元格内容为空,就执行下面的语句0 w$ K$ g, _% J+ \4 b6 k% A
    CAD.Quit '退出(关闭)CAD程序
, [# B+ @( j( c2 Y7 d- UEnd Sub- y! Y" A" k: Y5 E: B$ a, D
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
$ T- V1 i9 O$ t( S: h版主说说看vba、lisp这两个到底怎么个差别' _- l; w! r, s- B0 d5 l3 Y

0 @( g% S. x+ a6 H3 P[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子$ U5 f! _- C5 l: T2 Z
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
8 w# G) M% c) H2楼代码注释2 a: _0 K( j3 h1 L: G
----------------------------------------------3 T: c# ~( }& B% ]  m
Sub A()
1 j. c8 u/ t( D+ j: q    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
  f6 u0 z; s/ B- a0 d    Dim DOC As AcadDocument '声明AutoCAD文档对象: {' n6 h0 c- Q* {
    Set CAD = New A ...

1 R6 m* u  @2 C& p# I. i5 h! R如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。# P; g" ~+ @# L# s, i: j, V, b" j
实际上字符串中的空格(实际也是回车的意思)也可以这样。
) Y' M8 X/ J3 P! t' F  F另外,按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.gif4 a6 q1 X8 Y1 e- [4 k/ i7 j
( ~/ O* y+ [' S
" `6 d6 q" x$ a
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
% j. @4 f7 I* Y. ]

: _+ ?( L" R8 U2 y& @7 x3 R$ W/ 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程序的当前文档上做下面的工作
' k, S1 J! m" B1 X* z) P% K9 v% G; N& ^
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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