QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
% D5 J& W- S1 z1 H; o% }1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1: c$ J1 b4 w- |# p. g0 P
Untitled-1.gif 3 t" y7 e8 X9 _" q- u

: K; N9 E* y) T. S2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。, n; J7 F$ b+ l8 v/ C! C
3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。; b* ?- M3 l: s' p' m1 S- h" d4 i
Untitled-2.gif
8 |3 K# e$ Z5 A9 y' h) Y
9 V1 l. `, w9 v+ u$ e6 W. |/ Y' ~4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码0 p+ k5 J" ~& R3 x* u
-------------------------------------------------------------------------
  u. ~7 f. ?/ b( v& @. vSub A()
! N( u# D  Y4 L9 E- J    Dim CAD As AcadApplication, DOC As AcadDocument
0 a5 i8 ^6 [, A$ r    Set CAD = New AcadApplication! L8 _# `. n. s
    CAD.Visible = True) n7 Z" @2 F. q: d! G3 g
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
& D3 O! W' R/ M    DOC.SendCommand Sheet1.Cells(1, 2).Value
/ V/ r9 l7 O, [4 w9 d) CEnd Sub
3 ^$ Y4 X% Q1 W) p/ j- E3 ?-------------------------------------------------------------------------& U: t# Q7 u$ `0 x
见图31 {+ K: b5 C7 L3 j  e* x% d
Untitled-3.gif
/ ^' c8 k$ l0 B8 v. s
3 x. `+ ~# E: v4 O5 p5、在EXCEL界面运行宏,见图49 b* X: H; ~+ N
Untitled-4.gif 5 [7 E. t7 `* u! G7 n% e, m  c: u

. J* L6 ^$ Z* ]0 y+ I6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图54 I1 _- h; E* y1 q
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# 的帖子

上面的代码改一下: b% z# ~% m* w* w: k8 s" {
---------------------------------------------
( s# Q" p- k) C* o8 GSub A(): ~- H& Q1 ?4 G" S7 l: V
    Dim CAD As AcadApplication, DOC As AcadDocument
$ G  K  z) h' W  W    Set CAD = GetObject(, "Autocad.Application")# l" ^  t; X" j( n. s8 ^
    Set DOC = CAD.ActiveDocument
2 t/ s9 c0 \" }  g1 p    DOC.SendCommand Sheet1.Cells(1, 2)7 o5 I# ?! O. e7 P
End Sub
+ ~# l( H, R  ^$ G---------------------------------------------
% z2 k8 O" h5 l7 d; P本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接$ k# \4 a5 Z7 d" S0 X) s9 c

8 t9 E2 Y5 O5 B8 K2 r8 `$ Q8 w[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?* J+ n% Z, t- b8 \. T

( A% J2 U8 e# W, T) f4 \[ 本帖最后由 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/ Z' G* z- t. A3 Q0 {
不太理解你的意图,能否再说得详细些?
* X5 s4 n1 G' L$ Z/ E# [
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~/ W/ k2 q5 ?5 o% n! C, J
3 k3 p" r2 T0 c3 v2 }! z
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写1 a0 o1 f$ A1 _
-----------------------------------------------------
" g5 H% l) x3 `* gSub A()+ A9 E/ m4 O& b6 w0 s  T
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer! C/ {. `9 j: {' h" V( F3 w! ^
    Set CAD = New AcadApplication: w3 }* J0 O& P
    CAD.Visible = True
5 m( o$ x6 V/ f& h    I = 12 o3 P# y0 i' m" N
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""  Y4 Q* f3 i5 H4 Q% ?4 f' ~- a3 o8 u
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
  e9 Z" x( `: K$ @, G# O/ }7 c        DOC.SendCommand Sheet1.Cells(I, 2).Value+ f- {- _9 U  C6 t8 }
        DOC.Save3 p2 {% b1 ~# ?! \& m
        DOC.Close
0 ^3 O" E+ L: Z        I = I + 1! k. C) U# B5 S9 P! k1 E; e
    Loop
& ]% h+ w" \; w( @0 S& e6 a    CAD.Quit; ^/ ?) M6 l+ H. a$ r' A1 L9 L- |
End Sub
1 {6 n  H3 h* X& s-----------------------------------------------------------------) f( f' {8 \8 k7 I7 b5 T
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。3 e$ W: G% k7 n6 ~, @9 l$ ~) x1 F
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif2 i- v  J% u4 y: P* k$ d- T9 G
代码可以这样写
& ~* M9 q7 X% Y6 d1 C- R) x-----------------------------------------------------; B3 p- }# c/ F# j6 |- S
Sub A()& ^* w2 x: G; e. Y
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer+ g. a+ y. C0 T% B! b" z
    Set CAD = New AcadApplication
4 ^) n( s  {, U6 P    CAD.Visible =  ...
$ Z& h* j/ D5 b( k9 ^+ @8 p

0 H1 w0 @# {& G2 ?学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
5 S! f( a. K$ X' O* J因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释5 c1 s- D% E5 }$ e+ W7 T, |
----------------------------------------------) a( Y. Q3 _+ J
Sub A()& }- z! V4 b% G; z* t
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象: y6 Q$ ?; X0 D
    Dim DOC As AcadDocument '声明AutoCAD文档对象
" n4 l) g( z3 ~3 G/ T- a    Set CAD = New AcadApplication '运行一个新的AutoCAD进程$ L2 W: C9 w: s5 R2 R  O. A" C
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。3 v; w8 t. c! ]0 d& P
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
5 ]! a7 P) V  H4 s0 |! p    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
; d& [  l+ L+ r/ |. D9 r: G) h9 [End Sub+ Y* k% Y# Z* ^! `+ F/ X& O8 O4 I
----------------------------------------------
; _. Y% t; C; A$ T% @0 Z/ H* O+ g- c0 V
6楼代码注释( D6 c6 y, M  I1 K  g% X5 @
----------------------------------------------
) ?; a$ E6 `. JSub A()% _1 H3 s" }8 b) c' V1 \" T, i& X
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
' e* c9 x+ _, K7 C; [; c( z: E3 c    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
7 F2 S' l7 h4 j0 S; t( N    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作! O# F; H. \/ p; w! H# v5 @, B
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
( i/ d6 ~+ M3 {0 G, {+ P8 n! zEnd Sub
# F! b9 |$ |; r3 Q, L* n& r, Q; v( B----------------------------------------------, ~8 t, N" e# F$ q4 o

* D+ r2 g5 C1 n. ?( ]10楼代码注释8 F. G) m: M  W# p3 Z; T7 d" }
----------------------------------------------$ Y) F! l7 ~: ~8 \, y' }& c& y
Sub A()
: O4 F; W( o8 }2 T    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
4 E$ V. Q2 q9 Z; O5 }" B    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
# Z6 d  e  r" k    CAD.Visible = True '使运行的AutoCAD程序可见! N, B! z1 `9 k! M, Q  a
    I = 1 '从工作表的第一行开始计数
. T& z4 H6 G) K6 V; K4 J3 |% r& h    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
& E- n. d* _  s0 x9 w; A        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件2 E6 P% r- ?4 }5 A/ f
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
# F9 y6 U0 d# s% @5 R' ]& O        DOC.Save '保存文件
! F* P' z0 S7 v% h% B. m0 ]( H        DOC.Close '关闭文件$ ?! ]1 N' I, L1 i  j& K1 b# o
        I = I + 1 '计数加19 b3 w( B) J- \) w" k+ Z- o
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。2 f1 N% ?, S5 X! g0 ^. X
    '如果检查结果为单元格内容为空,就执行下面的语句
6 f) r/ T9 L8 _4 Y    CAD.Quit '退出(关闭)CAD程序% \% E3 X8 ?5 Z5 g. v
End Sub* t# K5 ]3 c, T- f- B( h9 U* n# Z. H
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
1 [- I& d( V, U. X( t/ |: X版主说说看vba、lisp这两个到底怎么个差别
# G" H2 k( Z- b8 q# m0 M: `+ {0 t% ~1 ^
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子3 m* W5 j3 o5 w" \. i4 a
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
3 d4 P# h1 l1 l( J+ M2楼代码注释
3 }0 m9 J  X3 }) F' `0 j----------------------------------------------$ _! P. _6 Q: U: ]5 F1 ?  N; f6 }: z# N. m
Sub A()
# U) }) ~! g5 D( o3 g% Z, E    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
% h4 O/ V1 q3 G    Dim DOC As AcadDocument '声明AutoCAD文档对象! s) r) d/ l" w8 w/ {
    Set CAD = New A ...
9 r; q* _3 b! w9 J- S; ]) s
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
- ~2 r$ Q  i1 e) ~6 H% q3 p实际上字符串中的空格(实际也是回车的意思)也可以这样。5 X% E4 J- ]* v: Y2 p- H* _
另外,按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
8 J2 Y4 h$ s" Z
+ I6 R' q, M% F( C+ ~9 H: I! k+ Q) G: }
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
# Q. D- U2 {3 Y" V; u6 Y8 a2 S" \

9 b% R2 ?/ ?0 u7 W
: Q. L  v' {- l- I) O真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作  u+ Z$ U( A( c" m) m- t( u
7 [6 A: u. w2 v( `- r$ Q
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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