QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
2天前
查看: 19893|回复: 28
收起左侧

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
8 n& k! n7 e! U# b+ v. x8 S1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
9 s2 j4 k, ~' B" [ Untitled-1.gif / t; E" q! R8 v  h8 P
, ~4 I& {* \- \0 Z' |) u
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
* y  @9 G) b* Z8 v  w4 e; S3 Y3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
" Q: ^* c( O. v6 p! T, k! M Untitled-2.gif 3 y- M4 ^( T$ N! \8 B
1 l+ l5 r! I) }) S  C" U9 h
4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
6 f1 z9 H8 _- \1 d+ C+ x1 R-------------------------------------------------------------------------5 `1 E0 Q# w2 _3 ?2 g
Sub A()
' D7 K6 I# L: w2 O' B. N    Dim CAD As AcadApplication, DOC As AcadDocument) i  R6 O+ u% y4 y# E- b, a  f
    Set CAD = New AcadApplication# s9 ]3 r  B8 q) ^# W
    CAD.Visible = True
* v: j/ [+ y! o# Y4 T. @# K& A    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value): n2 F( F6 X5 ^8 D% X6 q# Z
    DOC.SendCommand Sheet1.Cells(1, 2).Value
6 D  |3 Q( y1 c# ]/ i( }* \& Q! J7 a$ BEnd Sub, X% Z2 \- ^$ F- R) ?
-------------------------------------------------------------------------
" C4 {/ I* f9 y& c, w见图3
3 k: G2 y, v# F# Q# w* _ Untitled-3.gif
: z8 j9 `: P2 q0 X# h6 f6 S; W& @
0 {, W$ ]3 E, D+ L1 V  N5、在EXCEL界面运行宏,见图4; @. ~- T( }9 M; r0 s+ v& b
Untitled-4.gif ! n7 N9 ]; t: F$ k' t8 x4 Q) H
% C3 t2 s) l6 @% v( l) C
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
, M: Q. q/ @2 Z+ G+ U, 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# 的帖子

上面的代码改一下
  ]. Y' {+ L9 q! ?3 o3 @---------------------------------------------. e0 w2 b- z) V3 X* \/ S% A& u
Sub A()
' E8 Q9 T; i* b: M& d' I    Dim CAD As AcadApplication, DOC As AcadDocument/ a- e( z$ A, r0 F4 p3 G( ?
    Set CAD = GetObject(, "Autocad.Application"), |+ M3 ^1 F; h+ ]5 p
    Set DOC = CAD.ActiveDocument' r7 h3 z, W) w, g* z
    DOC.SendCommand Sheet1.Cells(1, 2)& b0 Q9 o- @1 T2 `  D$ e
End Sub
' P+ D  N! @. N" L---------------------------------------------/ B7 P9 Y) l" T* }6 y+ A
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接# _: T2 |5 ~. x) o( n

- X' G  v5 u6 K  q! W+ B4 X0 |8 H[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
) y! k; N, E% n$ i" K
# W7 m/ P4 a8 x9 }[ 本帖最后由 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.gif3 c: k: i( {+ f! c; I' p- s4 s6 ?
不太理解你的意图,能否再说得详细些?

4 d  O8 i% ]! \7 m7 Z! N& G' d就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
9 O$ k; j0 v0 h9 v: x: d
" n, e- @$ f! Y4 D6 R. O- {) S7 ~[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
& M; s  u$ Y# y) v# ?: _0 i-----------------------------------------------------
9 [5 N; W9 D8 h$ _7 |Sub A()
& |, {  l4 W$ q: X$ G0 P  D. q' R    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer' B, F' A5 c+ W
    Set CAD = New AcadApplication
5 y$ ?6 a- D% \8 h) V' G    CAD.Visible = True
. }- P) M; D+ [8 Y    I = 1
6 {6 o# Q# F1 @* u: y- a    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""+ D. v  ]9 t" K
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
3 B7 E' [1 o1 O* W) y! ]; r        DOC.SendCommand Sheet1.Cells(I, 2).Value
; a) d( ~, I& v( i5 ?! `        DOC.Save" Z2 g- L* j2 z# q1 C
        DOC.Close: R* ]; L* \4 Q, \% T  T, a
        I = I + 1
6 t5 a& K/ X0 o" j+ T    Loop
3 `1 b. U9 _6 u6 F    CAD.Quit. m/ v% e, v9 q9 T+ y! X1 Z- v
End Sub
7 v) T& ~7 t$ e" N; `! [-----------------------------------------------------------------+ r1 |! X# B7 T
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
/ X9 I6 g6 {# Y7 z% B/ v6 H4 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+ b- j: `% K) j8 _/ W  N9 G
代码可以这样写  d1 ^% N: d4 T: X, S; R- i
-----------------------------------------------------
; A' s3 w, y( u7 @; [& w/ E5 pSub A()
6 e" P5 s7 c1 h9 M; G    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
7 {' Y" K& c9 }3 y4 E    Set CAD = New AcadApplication
% N4 W- w& c/ h5 K0 E7 Q    CAD.Visible =  ...
' d3 `# L# T9 f5 y& n7 p2 \

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

回复 13# 上山蜗牛 的帖子

2楼代码注释% g4 }' y. f; q* v  {
----------------------------------------------
* I) F. a; ]( |2 T( i& lSub A()3 |+ g/ m" Q3 z; ]% J  h
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象1 J: E; M/ y4 J% ]/ y3 {
    Dim DOC As AcadDocument '声明AutoCAD文档对象
  m- M7 @" Z" z' I7 Z0 H8 o. E    Set CAD = New AcadApplication '运行一个新的AutoCAD进程7 y. K" N8 m3 P6 r
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
* B8 b" q- e! t. M9 j0 n5 J* i+ ]    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件/ t2 k0 w6 y1 C" N; a
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令, N: k7 ?$ O9 n4 p% [0 y
End Sub
6 F6 _# |  M& p- s, n3 q$ X----------------------------------------------5 y, W& c+ m4 ~7 j. H9 t

' z& ?  t4 X% Z3 P' |6楼代码注释
; a* y7 G* e$ k----------------------------------------------6 H( J# |( G( x" d* ?* j! o" \' C
Sub A()
4 H2 `; A5 ^$ \0 w2 T" [    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
5 s) n9 M! q1 k7 s$ _    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
5 m/ w, y* n8 Q2 \; Q    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作) H4 r9 N# Q6 W8 L
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
" D/ s& W& a3 H) OEnd Sub
7 j8 y, s3 E; ^) y----------------------------------------------$ x+ v% R& N1 W5 h9 h8 {

; a3 c( E4 B8 E9 [* v6 ~+ o" O10楼代码注释6 c/ ]1 l. n) V0 A, c6 H
----------------------------------------------
5 j6 u( G: J  o1 mSub A()9 {% A' ?4 U5 S1 k8 I% D& g
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
5 H$ I# ]) O% W9 [& K$ H    Set CAD = New AcadApplication '运行一个新的AutoCAD进程3 t, i  \% z' v: o+ K! o
    CAD.Visible = True '使运行的AutoCAD程序可见- q! f* K5 p0 [, @
    I = 1 '从工作表的第一行开始计数
; w0 {0 l8 w  B6 Z" G8 g; }2 h    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空4 ?" m' u0 w: Z! |9 M9 Q6 o
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
6 Y; C5 j+ g% K$ A        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
: j" R2 M5 e6 Y5 k/ O0 R; H, l. v        DOC.Save '保存文件. y$ _0 I! L: g  d
        DOC.Close '关闭文件
5 ?7 b' Q! v; d6 Y  @0 U9 Z        I = I + 1 '计数加1
) B; V4 L" q& r  Y& q6 C$ d! a    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
) h2 A0 G$ L' M2 s& k    '如果检查结果为单元格内容为空,就执行下面的语句
3 ]& k% p; e1 e1 n    CAD.Quit '退出(关闭)CAD程序
* g- `  q/ z" _  [0 A* f# VEnd Sub7 j( E* U' u) M
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!: o) W$ \! y+ {" l
版主说说看vba、lisp这两个到底怎么个差别
7 h* |7 a4 I: |8 j8 M+ x; R8 B3 `8 q8 Y
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子+ |- f# w7 ]0 S7 ~4 o
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
, F* x  y8 i" _2楼代码注释' W2 h" v9 O$ g
----------------------------------------------; g. u; C) k1 u
Sub A()
& T' ~/ r% O2 X: K. i    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
4 ~: _7 S/ K7 x, i    Dim DOC As AcadDocument '声明AutoCAD文档对象
* J8 a" g! t' V1 R    Set CAD = New A ...

  C$ W. m! W1 W2 K+ i' Q6 Z9 u/ ?& b如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。1 k: p+ P; d8 S) l
实际上字符串中的空格(实际也是回车的意思)也可以这样。
6 t+ H4 d, q- U$ }) n& ?( ]) v另外,按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' Z6 H# V, j, @) }. v
: ~2 F7 c+ T0 ^/ S8 {. n  ]0 ]6 W
# C7 q- U+ W# c. O$ u# n
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
! K7 i  M# b* N/ T6 S: G9 _: b  J

% k  }3 I2 ?1 k7 R
; _1 N- {2 `$ A8 ^8 Z( k真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
3 p5 f( `! L  z7 P% ^( o6 d
# ^. E! q+ m- w3 ^; W5 _8 A, ^: E如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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