QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:9 I* W. O! T$ ]
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
& j+ C8 z& T3 Q# K, s Untitled-1.gif
! g0 L! u- L2 M; p" `7 z) r- Y9 p* K; q
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
4 C: d9 U, A1 W! I+ M1 K3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。; \) Y8 r( i7 I7 Q
Untitled-2.gif
) m! z4 B( N( j3 w1 k/ E6 _
. P! p+ }0 i, A4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码! q0 W  x+ U# l3 T2 K: S8 W
-------------------------------------------------------------------------# p# F( M5 P. \1 _
Sub A()" x& r  z. \1 _
    Dim CAD As AcadApplication, DOC As AcadDocument6 d3 i" e$ i* k
    Set CAD = New AcadApplication
4 s( r: ~: @1 j: d  _1 I$ i    CAD.Visible = True
1 c% B& ~: ^# S    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
5 U* R1 ~. {2 P    DOC.SendCommand Sheet1.Cells(1, 2).Value
/ i; T/ Y; d) @: UEnd Sub* ^8 ~6 C5 Y$ q, U) j% G
-------------------------------------------------------------------------, h2 E& s, z7 x1 f. k6 K
见图3/ B7 r* w* v/ t: B: R9 {7 q5 j
Untitled-3.gif
4 ^: v2 a+ W0 r" i* D; k; S! y% n& Z0 e7 m* ?9 P+ V
5、在EXCEL界面运行宏,见图4) l* l8 d" G/ [! v
Untitled-4.gif ( r6 D# Q4 ?  K/ w( y6 P/ l

0 N3 I/ L3 R+ I2 A2 b# U5 a' l* d6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5" }5 l. c4 e0 |
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# 的帖子

上面的代码改一下
3 Q8 t* t& J% g' }* z$ r---------------------------------------------
6 x: p0 G: U6 _Sub A()9 F% E0 e  k1 b: y
    Dim CAD As AcadApplication, DOC As AcadDocument9 h4 Y0 b: N. f+ `: C
    Set CAD = GetObject(, "Autocad.Application")  W" ^& ?' f  P+ ?3 I
    Set DOC = CAD.ActiveDocument# V: z# L3 w2 U" W+ _7 V' N4 ~7 N
    DOC.SendCommand Sheet1.Cells(1, 2)) L0 K' o1 y6 L3 m/ {& E' {/ [
End Sub
+ _, W8 p* ]/ w% H---------------------------------------------+ _  l; S( Z- E, D6 n: D! Q
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
' f: G& Z/ h  I: G6 `- c; N0 ~; @0 r) @+ j6 O! R5 t
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?1 s' b  X& e$ ^' a. Y, \* S) i

; o; d+ N8 l. d) A5 o' h" B[ 本帖最后由 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
% q0 R! G# D$ M& R0 B7 d( g不太理解你的意图,能否再说得详细些?
  e+ W4 T6 Y7 }$ X( V
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
; ~! B) j+ E" Q! U8 @( p
4 L- v6 B: r* q1 C9 ^: F' p[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写2 j) J5 @7 O" \; |& n
-----------------------------------------------------: e9 o! a3 I" m; y  r0 Z* M! C5 b
Sub A()- O# ?) K9 @, U/ o& |! f
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer) ]( l$ O1 G9 T" U1 g0 |
    Set CAD = New AcadApplication
, s, f; K& }9 x, E: D" `+ K    CAD.Visible = True3 v1 ~6 S2 M% V6 P- G/ I# M5 a+ ]
    I = 1! `* G; d0 o9 I
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
5 ]+ z% _2 s0 X+ n8 o6 m4 K% t        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
) j8 T( P. d' ?) p" [3 J$ w; C        DOC.SendCommand Sheet1.Cells(I, 2).Value
7 l: N5 x  w) @& o% g. l2 c        DOC.Save  Y% C( l% K6 ]6 Y( l4 H9 x5 G
        DOC.Close
  K' u* o* ^# k, O1 g        I = I + 1# D' `- z! _& ?& G5 M
    Loop3 k# N% {, n5 R$ O7 |
    CAD.Quit/ M9 w& z, n) R+ C% ~1 h6 e
End Sub! u4 m0 n) y) g/ T" n
-----------------------------------------------------------------3 S4 R, I' e% C0 x
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
, q6 W' R  _- o0 i8 h! ?- V$ D本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif' t4 q& g9 Y, \9 ^/ C2 N: r
代码可以这样写, E  w/ @: L5 N8 Z
-----------------------------------------------------
4 q" ^5 g2 u$ \/ g$ l3 {5 OSub A()% Q- {  `6 |# N9 C6 j
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer1 \0 @9 {. A& p; Z7 x, k/ r: _5 [6 x
    Set CAD = New AcadApplication
. N" l1 U- R4 F* G$ D4 d! U4 ?    CAD.Visible =  ...

9 I- n/ |6 |& `" Z2 |1 S" c! S$ v: ^7 Y. ]3 o* f
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!" o7 N/ r% r1 N1 {
因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
3 Q! K: e$ z, O9 @' E----------------------------------------------
! ~, N& L6 I. W5 n- vSub A()4 C! Y( Y! V; U" D
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象$ S& H6 e# L1 v, D
    Dim DOC As AcadDocument '声明AutoCAD文档对象4 |& H) Y: ]3 f  p8 m
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程7 \" o7 c; r( t; Y* v4 U5 ~
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。$ u8 W* A. @- `" V0 X3 x% y. k# \
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件4 L! U2 G) O# X
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
* t: U+ @" I7 l( l. d* DEnd Sub! ~4 [9 t* k/ J( Y4 ?7 k
----------------------------------------------
+ W9 Z& R. L4 v  _
1 M  S) |7 G/ I2 z" g! Z# B: R6楼代码注释
( I* r, ]6 X, H" S: s1 b----------------------------------------------3 v# i  d, q# `; A. j  [) W3 Q- |* L# F
Sub A()
# D/ R! D6 t& V$ l    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
3 g7 e% i% q! T" F0 H+ |# U& Q    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)  f, x8 h" Y* S, f
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
" }' @4 r" c' l  t* _$ n    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
8 L, w8 [  C5 f. yEnd Sub2 _( C9 o1 d" g9 T. i0 e. }9 f
----------------------------------------------
$ ^9 m8 ~; [; ?# R6 W' z4 \0 q$ i* d+ o
10楼代码注释
" V7 u4 h, W/ E6 v- a* }: Z. a----------------------------------------------% M* I, y4 C* l0 }
Sub A()
& ]) p' `+ G6 v% H    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)2 J& F$ M7 N' }" F
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
* ~8 M- O9 o6 h/ r! @" Y    CAD.Visible = True '使运行的AutoCAD程序可见" ~; U' {  M! {# z# k
    I = 1 '从工作表的第一行开始计数- ]( M' o; g5 F
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
# b5 x& V6 |  A1 o! `8 A        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件3 @) w+ t& u; c( y; D' ]
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令, f. o) ~# ?1 S- z) R
        DOC.Save '保存文件
7 l; a' o& W9 D. p        DOC.Close '关闭文件
, F! M, K  e% ~7 T; ^        I = I + 1 '计数加1, c8 {" d- ?& k" O
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。. J- z9 N# p  c8 d0 b* X
    '如果检查结果为单元格内容为空,就执行下面的语句0 d( c* x  W/ ?1 F5 s; c( J% G  L
    CAD.Quit '退出(关闭)CAD程序
6 M( a* g# i# |1 n0 [6 @& R% WEnd Sub  O* }6 z) q# n/ l9 ^, d  K
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!' y0 m) L# F% Y# k) g8 G  _
版主说说看vba、lisp这两个到底怎么个差别+ g% t, F! _8 h& g- Y- c, |

8 K9 D* @& [( }6 S$ L  l' L7 G0 J[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
3 L  E) S$ H% V* C' U( h- y选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
9 S1 `6 P! R$ o: s7 ^7 q2楼代码注释0 h% p  W, h" j$ m
----------------------------------------------
2 ]! p- S0 S( s  SSub A()! Z4 R  B* B' U6 {) ~& F$ J
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
7 ]% n5 `" M7 R  \' t' S    Dim DOC As AcadDocument '声明AutoCAD文档对象
; c4 t% g% M5 `+ W1 s3 d* q9 c    Set CAD = New A ...
5 {7 A+ N3 `) n, o+ R! b2 F5 m
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

text 0,0 2.5 30 你好!5 z/ j' J$ \; S' I! I+ v  D- K. ?: ]: D; Z
我在Excel VBA 中用以上命令建立一个单行文字,可以生成文字,但是无法自动结束这个命令,必须要到CAD窗口按两次回车才能结束,请问这是为什么,有什么办法可以解决。
发表于 2008-11-14 10:44:53 | 显示全部楼层 来自: 中国辽宁营口

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
7 o; Q& T, y2 z% X$ @$ u实际上字符串中的空格(实际也是回车的意思)也可以这样。$ t4 m* M2 n( ]# y
另外,按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
5 q* F* L) K) v/ ]7 L( z
- }1 i" ~, R/ O* W# Y5 A
+ \8 d( |/ K% h, }5 v' b) G学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
* H  ~9 o" h7 F% N1 l% @* d6 t+ z

/ `: m# [+ `% c: @, n! J/ {
2 F9 N: `( z; [# h真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
5 L: l$ \9 m( i# F5 Z4 Z. ~# J$ l
- l9 K: i7 P+ p# b0 q如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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