QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
* p8 v9 Y6 l* j5 E# }3 Q4 l- O1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
% S1 B7 g! ^( T9 M, b- Q Untitled-1.gif   u" N6 a+ Z' ]; \+ w+ G
% L8 n. n4 C; N5 c7 |
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。- a) L6 w* ^% u$ h* J1 R  ~
3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。8 k; |2 @1 B# _; ?& F
Untitled-2.gif
; r& f- H+ H, b! z3 ]2 \( p* y8 V2 q
0 k4 j& a5 l! H" G4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码, w7 _) p9 G/ Y8 O$ w9 n
-------------------------------------------------------------------------7 x$ J% X+ Q* Y8 w
Sub A()
& f2 L5 r% d  U    Dim CAD As AcadApplication, DOC As AcadDocument
/ L3 N9 M) @! d/ O# I    Set CAD = New AcadApplication6 Y0 K7 \2 z  W8 b
    CAD.Visible = True
, `' b9 q4 Y7 ~2 J9 `; Y8 @# t    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
7 M- u3 G; s) _# d" I- k    DOC.SendCommand Sheet1.Cells(1, 2).Value
6 d0 }+ W4 r0 z. q. jEnd Sub
$ Q& {* k) l. t; _  b/ X. d& H6 P-------------------------------------------------------------------------( t- _* h# L/ ?1 R3 D
见图3
6 w  C3 x9 ^8 a) C* f2 E Untitled-3.gif 0 B7 h$ M7 h/ U6 W% D6 S7 {2 J; K

/ f2 J& a$ n' _  w5、在EXCEL界面运行宏,见图4  C( f- T8 e/ F1 ?0 P
Untitled-4.gif
% f9 E4 U2 d" e' k6 z0 M' w5 k5 o: j8 C/ s! W5 G; |
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5# S# `" V3 @) ?* O) f5 h. y
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# 的帖子

上面的代码改一下  e& V# N; c6 G6 N7 Y3 E3 s
---------------------------------------------( E+ ?3 k- X$ t
Sub A()  J9 V$ m7 q# Z% G+ l) R
    Dim CAD As AcadApplication, DOC As AcadDocument/ _: g' A8 p! B5 I
    Set CAD = GetObject(, "Autocad.Application")+ ^/ O* C8 G" |# b0 f8 M
    Set DOC = CAD.ActiveDocument
2 j% t" K+ q4 u8 |% u, f    DOC.SendCommand Sheet1.Cells(1, 2). h" A- C, G' c& V( _4 i
End Sub: X0 f9 [1 E2 F. S# r
---------------------------------------------
0 r# |9 n: w+ z本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接; ]' o# V8 e/ Y( J
4 C$ [. q# q1 H. u5 v6 b7 O7 k
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?3 V& f. C  a; S/ q- K- t
4 `7 o9 g# X" G& \2 G+ @& q6 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; j5 S) F3 _+ X6 |* g1 F
不太理解你的意图,能否再说得详细些?

: k8 t4 ~3 ^/ {1 v! `7 m就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~' r* I( h) W4 o" M
  I, `/ |. n0 o9 \6 Z
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写! c1 t' y% J% s9 f
-----------------------------------------------------/ C* b4 n+ ]1 s* g. C1 B& g
Sub A()8 M  `+ j7 Y8 ~- N; C; l- }1 K
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
4 a8 ]; O3 l% C! j5 J( q$ `, r+ F    Set CAD = New AcadApplication) x! w6 U) K: o9 f
    CAD.Visible = True6 p& J& \$ `. o1 i* ]
    I = 1
( d' r* u6 X. r    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
/ E+ [" a) E3 \        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value). I: ?* l6 d$ E1 z% A
        DOC.SendCommand Sheet1.Cells(I, 2).Value
* G4 y( h$ s- s9 J        DOC.Save; ?6 X  F4 r1 x: ~  M& q  _
        DOC.Close4 W6 Q: I/ @" i5 k: e' [  o# [/ V
        I = I + 1
' N) ?% o: @1 J# }    Loop
  k* o# u  f% [7 ?    CAD.Quit
1 n3 s; h+ h- QEnd Sub
) s8 W: r1 t5 B. b-----------------------------------------------------------------$ ~6 ^, I2 X+ }6 `
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。- W) M) k& o! c4 i9 D4 n: i
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif
: r6 V! q/ j+ t6 I3 B4 x( C  R代码可以这样写
* y0 B1 D2 c/ n& \1 w0 h1 y-----------------------------------------------------
1 b) Q! b  R( d7 jSub A()* k. y) e5 M; A6 ~+ y
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
/ p: b$ J& u: M  Y* V: H" ]    Set CAD = New AcadApplication- F4 t- n8 Z+ j' e
    CAD.Visible =  ...

* J/ c5 @- z7 p0 q
0 c4 O+ U8 F) `/ J' r3 c3 a- q+ @; y学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
- _: \8 `7 j2 o2 F# w" k因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
, Q" S; f- d; R----------------------------------------------
5 R( ^$ X6 v8 @: |" u1 L7 ASub A()
  I6 g- p# S# A0 }  q    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象' ?) D* K* Z, F" S
    Dim DOC As AcadDocument '声明AutoCAD文档对象7 ?' |: i( i  O3 _
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程" A3 `3 L0 f6 w* |1 a
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
" g& t. c. t) u    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件2 e4 F( ]6 L7 h. Z2 P4 P. {
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令' U& E8 y( e5 s) L1 `
End Sub( g  p$ {5 y" f$ I, C! S: X) t
----------------------------------------------
7 @4 w% C9 i' \  P% ?, q% N
/ A  o. |* |* L$ ^1 E6楼代码注释
# _. I% T' ~, G! q----------------------------------------------' J' r. g6 O) j) W' H+ D" E1 T
Sub A()+ }2 M6 A. C3 q- M. R- r+ M
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象' W$ l1 h: [6 S+ U) p  N
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)7 X# ?8 A5 F% \/ A
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
6 A% |+ l3 [; t6 |* h. @/ h9 N    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
, f* O8 G8 F* k+ o4 C$ ]" yEnd Sub
! J# `8 V% ?: }  Z----------------------------------------------$ {, Z3 d/ L! Z$ O; m. ^
' P$ A( c& N, v8 n
10楼代码注释7 v' S5 f  u; j" W2 \2 E
----------------------------------------------
% p  e# v* [; Y/ p5 b2 `Sub A()
. G$ h6 |7 I! y4 b7 e    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)" K2 l& N  w8 i2 B
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
5 E' v, x% l/ C7 D  s  j, s" o    CAD.Visible = True '使运行的AutoCAD程序可见! v* ~8 }( ~. F5 f7 _# v. M0 F7 j$ ~
    I = 1 '从工作表的第一行开始计数5 L5 M" F7 F6 e+ b5 F
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
+ Z6 ^. \9 d+ W2 H        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
, L. K/ ^; m; }! L% j. {$ D0 N- s        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令5 [% Y: Y0 B+ Q! _3 y
        DOC.Save '保存文件
7 N- p) O6 i: I; s' _' K$ [        DOC.Close '关闭文件
. [' B! P5 X1 \3 ~1 I& b        I = I + 1 '计数加1- V+ {) f/ v1 y6 ~
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。! Z2 Z4 _! O0 S/ d
    '如果检查结果为单元格内容为空,就执行下面的语句( L5 v; G# E& h% l" G$ l
    CAD.Quit '退出(关闭)CAD程序
7 v* c% a+ K3 h/ x* f; J' ~End Sub; j' Z; Y5 d% y6 m$ @: l. |
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
9 }1 u) d& N  E6 W版主说说看vba、lisp这两个到底怎么个差别
% N( B, _7 V7 Q$ B- M0 D5 |* S; [' R/ u
$ F$ g7 q, l! V# Q- O[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子* }# n; h' F/ W7 A" r- c0 ]" n* ]- T
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
% v4 e& ?2 T2 J- B' a2楼代码注释
& Z9 }% F# v( J1 H: C, Q; i! h----------------------------------------------
5 k$ e1 n# `# U3 ]4 h7 }5 PSub A()) @. h+ ~9 f5 W
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象( u/ Q( D& b* \& C7 V4 l
    Dim DOC As AcadDocument '声明AutoCAD文档对象
: i+ O# \" `4 C8 E" U    Set CAD = New A ...

* C, }+ @7 u1 P% d如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
/ C& g2 i' m. c* P2 p  I实际上字符串中的空格(实际也是回车的意思)也可以这样。+ r5 a. q0 U- p' [2 Q
另外,按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
( {: R& [( s6 g7 t+ c* W; I/ c' i% i. j  `, b  L

6 A7 y& W& r$ [) J学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
% a+ ~9 A, E, ^: w$ [1 |
: M) R+ `1 T( x" \
- n. A6 i  y. T
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作0 d- ~# r- `% K5 d  y
+ x( d( ?2 I' v
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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