QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:* J4 z8 e$ D  G, {! B+ I9 {5 d
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
; x6 S. p/ F- L# o  H Untitled-1.gif + y9 C. W1 [5 p. {8 E

* t0 @" `. R% K0 P5 [2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
+ b$ N* h5 Z3 s& b; v3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
) P1 H) x+ ]& `2 M& a Untitled-2.gif
; ]4 G# U* }5 D: |' n* P+ e
' d8 t1 a0 X* _# E3 `4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
3 {( U. I9 E% B1 j' P5 m& J  u-------------------------------------------------------------------------: R6 J5 e' e7 z
Sub A()
6 O) K  `) f2 }& ^, M  k# H/ u    Dim CAD As AcadApplication, DOC As AcadDocument' Q9 h& ~( F& g: n/ c
    Set CAD = New AcadApplication9 e& ?& Y0 Z  r- m' I) p
    CAD.Visible = True
; l6 ?" u) s, W5 K: B- y  l    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value). L  d& o- E) X
    DOC.SendCommand Sheet1.Cells(1, 2).Value2 [! t$ K/ S) B) f, n' X- q
End Sub* T' p3 ]. \3 f% L7 Z8 P
-------------------------------------------------------------------------' C' \& ]" X$ t1 _& p$ n% p* N
见图3- m6 ?9 A  r6 I1 y, z; q$ E% G
Untitled-3.gif
) Y+ N3 Y: d, J4 P6 z
8 v2 ^& A2 X0 J6 @: m  T5 W5、在EXCEL界面运行宏,见图41 k: l+ s+ R" n& \" ~! P0 l! y) M
Untitled-4.gif
. J5 H4 C1 k4 L" @8 U+ f, i0 n; Y$ @1 \4 ^6 l
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
8 r  a# V2 @2 w' j 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# 的帖子

上面的代码改一下
/ ~( ?" r+ Z+ Y# ?---------------------------------------------
$ T" G& t7 w, W! D# vSub A()
& e0 }& L' m$ T7 A8 q    Dim CAD As AcadApplication, DOC As AcadDocument
8 v3 M. P3 s; F! J: I* N    Set CAD = GetObject(, "Autocad.Application")
9 d3 f) i" K7 B6 T* X! t, I    Set DOC = CAD.ActiveDocument1 P! r( c7 }0 s: M2 _( f+ B
    DOC.SendCommand Sheet1.Cells(1, 2)
0 _; W6 k, A" UEnd Sub
8 X, A2 |; X$ W: B# }---------------------------------------------8 z- [* \% U. v! Z& A% y( J
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
$ M% e+ w5 h$ C& S
$ u8 T+ \) V4 F% N[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
, x8 M/ x# g0 C4 R3 m2 p( N  m* ~; f- v7 c# r5 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
: f& F# Z  g9 C( r! l# m# W: w不太理解你的意图,能否再说得详细些?
# c, M, Z/ h& |# I
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
6 L' [# {0 U* Q% O9 g& {, F6 t( h3 ]
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写8 U: q  `  J9 I' }  {2 }& m
-----------------------------------------------------7 P+ j7 ~! E/ u9 z
Sub A()
# O9 k$ |% Q8 G! g- I6 L& ~, Q- [    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
9 Q5 K6 d$ }- v6 G: P    Set CAD = New AcadApplication* z2 L1 J7 g4 g+ D8 P' j9 R+ f
    CAD.Visible = True% u0 A' W0 o) J
    I = 1
/ \7 G& V. y3 X: x    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
+ a9 |% q/ l* R! t* g) _        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
1 T6 [% L. \$ w  U        DOC.SendCommand Sheet1.Cells(I, 2).Value/ b/ {4 E! Z( D8 W- [
        DOC.Save4 S7 [/ U7 K. j* c3 A7 M
        DOC.Close" I8 ^/ f/ q$ B% k5 M5 D
        I = I + 1) J+ a. [( w6 s. o
    Loop
" j3 Y7 P6 e! d, j( U    CAD.Quit
& a/ H/ A' L8 a; X4 k' W/ ~2 ]End Sub" Q- K, c8 ^0 g
-----------------------------------------------------------------+ A! g% j0 d( V! P: _& s
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。9 _" D8 c" U5 N& c9 ~. b
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif
' ~; I, J: Q" W- S9 c; z% O代码可以这样写. E3 H0 D+ P. F) {1 Q( a
-----------------------------------------------------
# Y6 P, `3 H9 Y$ vSub A()
$ |- _5 }% F: W2 K. L" ?; p! n8 S    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
9 v8 o" r5 `. z8 I1 t0 k    Set CAD = New AcadApplication8 p! B! z5 V( a9 w
    CAD.Visible =  ...
& `$ a/ g* m. V, t. J% b( A4 G
6 q! W* J0 B! w  B4 Z5 S. A5 T5 b! X
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
2 r/ k4 ~0 \( o4 R$ b1 ]# j因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释4 k4 j; {  d0 C' Z' q  Q/ K- F1 N
----------------------------------------------
' |! I# |% |* p- u, z. x( t" SSub A()
# L9 |! T3 U5 y* P! m4 D! D9 A    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象  z) A  t! G& \; j
    Dim DOC As AcadDocument '声明AutoCAD文档对象  N) F1 J" ^1 V2 _4 b: _, A8 l
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
8 f6 M; }; m. C    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
* u7 E( }2 h1 D, ]; M4 P9 I1 o+ `    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件( i8 m2 q4 s1 F) ~& x
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令& ^+ \) ~3 Q: S, O  k* s, w/ T
End Sub. F: a( b( [* D
----------------------------------------------% G# U1 w. d2 [2 W; v( L9 E
* k! a5 X' {5 |, H
6楼代码注释
) U( P+ A3 L' ]8 i2 K+ h6 Z& L4 H& L----------------------------------------------
8 S* H: r& e8 o% \4 ^# SSub A()
8 d& m' g, n: j0 {0 `    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象! e6 a; P# m, G
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个). ?8 |+ g! J3 c! K& K4 J
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作. A" T8 ^+ G' n6 A$ G
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令! e7 q0 o" M/ I8 y( b. q
End Sub# L0 h. @3 X2 `% K- B
----------------------------------------------
/ d* C$ B* |2 E; R' B1 p: `* v6 G7 J; z
10楼代码注释
# g3 @8 q4 A  u* Q; l5 q* k----------------------------------------------
7 _8 k* g5 B! C, }' JSub A()
; _6 X- T: V/ A; Z  a0 h    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)9 Z$ Z: ~7 `" D& I' n* y" D9 t
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程" W, K  A; y" z) ?/ b
    CAD.Visible = True '使运行的AutoCAD程序可见. c$ g0 c' P5 R% p0 Q4 x7 J
    I = 1 '从工作表的第一行开始计数. p6 _3 Z( C$ i3 a! t
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
8 ?; ^1 v$ B2 [: a        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件5 U# I- K( {, E( _  ~
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令8 Q1 l: O2 \% ^% y: n* i3 V
        DOC.Save '保存文件
! b% G% M3 R- K7 t/ i0 l3 ?) ]        DOC.Close '关闭文件$ y$ U" ]* G& e
        I = I + 1 '计数加1; y& A! r' u7 `% u1 `- i
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
/ f$ ]4 q; f% A+ Q0 I# |) c7 g    '如果检查结果为单元格内容为空,就执行下面的语句* b6 ^& l1 c% E7 p
    CAD.Quit '退出(关闭)CAD程序5 w  B! y& Z1 n: x- j$ }
End Sub' m: m* m- a- j
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
& A* O8 U8 w5 v; U7 Y版主说说看vba、lisp这两个到底怎么个差别
3 V# Q: f4 y8 b! l) s" }; J5 f9 |+ r+ B1 x2 y, l7 y, @
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
; p3 w/ C% V1 N7 R, L选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif/ W, r0 D8 k: }) X
2楼代码注释7 y$ i- k' I2 L' I+ V* h; n
----------------------------------------------
8 o9 [; q  R. M0 a/ F1 L( SSub A()
2 q$ e8 s7 B' J3 a+ }/ @$ b' y: S    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
. F  S' i6 z) C) M, x    Dim DOC As AcadDocument '声明AutoCAD文档对象! S8 w) B) F' m  M* c
    Set CAD = New A ...
- x2 {" z0 H0 X. v5 i
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。& K, d0 A* [6 A+ v& X2 u
实际上字符串中的空格(实际也是回车的意思)也可以这样。4 t, w6 U, ]+ _# `2 W) V9 E
另外,按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  H. l, R: G& K

8 k5 [5 {: O. m" m- z. l  c7 M5 J" h. E  [3 P- v
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

9 u0 T7 L$ `% \# X* N& J  V) G0 p' ]
4 z6 J, g7 I  S  _
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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 v- ?& k* l, }: ~/ m& U
. A: Y2 k1 Z$ \; x/ X" Q
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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