QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
6天前
查看: 19795|回复: 28
收起左侧

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
$ b) c- r1 K2 `  I& M+ h( ^1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
7 b7 p: k2 a5 F/ {) c& H0 ~/ G0 `' X Untitled-1.gif - ?4 |  \8 q1 x4 @9 c3 u1 s
+ B6 |) N% i; I/ \# i
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
8 z: S3 s/ N& l; I. z3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。$ @+ T# J+ I+ w2 R2 ~0 m
Untitled-2.gif
( k4 F6 [6 B3 q% E$ D4 I# j8 s
; e) |  C0 X; ?1 Y: J2 w4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码9 \1 n$ @4 R; z( M$ v
-------------------------------------------------------------------------; u/ A2 ?# ^5 Y9 g6 \9 J) p
Sub A()
4 \+ r" x, A7 B4 q# c! @    Dim CAD As AcadApplication, DOC As AcadDocument
) G; B' S: C% a: `3 c7 P    Set CAD = New AcadApplication* \8 F- y/ t8 j, o+ e* }
    CAD.Visible = True
7 o  z. o  H7 e3 i* y- k    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)( c  d& B  ^( c$ i8 p$ t
    DOC.SendCommand Sheet1.Cells(1, 2).Value4 a; |0 H! b3 }
End Sub3 m2 v- m0 \# m) B
-------------------------------------------------------------------------+ K( I( N: f4 L5 G/ m
见图31 A& l7 O: m) b) K6 a% o7 A
Untitled-3.gif
" g' E" `" l0 t8 W$ c' k3 d( a- A9 ]$ a" g7 L9 N
5、在EXCEL界面运行宏,见图4) B) U( S$ N) a: B% N( a5 c
Untitled-4.gif # _6 ?4 X0 a" D- W5 J

! d; q4 q5 M, J  F$ s1 D4 t6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
$ {, h( [+ l7 I 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# 的帖子

上面的代码改一下
7 A8 B+ c6 Z; p5 E8 q---------------------------------------------/ Y" U  u" p, i* Y
Sub A()
) O  T; R1 {  i    Dim CAD As AcadApplication, DOC As AcadDocument( p! J0 G' r0 n
    Set CAD = GetObject(, "Autocad.Application")
$ B; y5 j7 H) `. n4 i# B    Set DOC = CAD.ActiveDocument
: i6 g$ R: g2 A  c    DOC.SendCommand Sheet1.Cells(1, 2)1 c2 q, t( Z% C) p
End Sub, P) f% T9 ]; N) B+ [* i$ U3 i
---------------------------------------------
( h$ H$ X6 d# D. e( ]" y) `本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接9 q; i3 a; U. s9 }+ y* r
- p' u/ j+ n9 h
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
! h1 G5 N5 I0 \7 h  _) O7 a6 }' \
[ 本帖最后由 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.gif1 k- Q# C* X0 G/ l1 p
不太理解你的意图,能否再说得详细些?

* C" d5 k0 P5 a. A就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~( J( X; K9 c4 i1 i( N1 ?. b

; Z/ O$ n+ n3 J1 M3 s- ^$ G; i[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写; f1 T+ J' ^% |! \
-----------------------------------------------------8 |' X' L. C) p( w0 ?
Sub A()" O9 {4 e+ K8 Q! a. Z9 s' I4 d# h
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
7 e$ W0 H, |; E6 j    Set CAD = New AcadApplication+ S+ Y* n; ?" ~  t0 q
    CAD.Visible = True
- \" ]" ]2 _0 l9 w0 W    I = 1
7 \% @7 E9 W) V, x/ T5 P% x    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""2 l& O" Z/ ?8 ], I* L& h8 Q
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
# t4 Q& @3 \/ x3 H: v3 V9 U        DOC.SendCommand Sheet1.Cells(I, 2).Value, V. K% x0 g6 q0 w
        DOC.Save
, w" D8 X, u: v- h, |        DOC.Close
, \4 g5 ?) m9 L3 K: Z, u- P$ C        I = I + 1. a2 `7 m+ G! a; @; Z# k
    Loop
7 C8 m( F. P& i1 |    CAD.Quit* U9 U3 ]1 m! a  [! N2 Q
End Sub& c# h8 q' E- h8 p' b
-----------------------------------------------------------------8 P/ d0 h  ^9 x" n/ ~4 J
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。; j) [/ _  g& F5 H
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif. U6 e; v: p5 G: |. z. v
代码可以这样写
$ g9 D' C, }! U$ j0 f6 {1 }2 U-----------------------------------------------------
2 C4 F+ o4 i/ v. N( |5 e; X$ CSub A()
6 P7 o* [8 a1 m$ g7 R. ^    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer( A% g# j4 i- N. P' D( R3 F0 v" @
    Set CAD = New AcadApplication" A% }5 U/ n; Y7 |( |! e$ @
    CAD.Visible =  ...

( |. @; T4 ~5 y" o( p! r5 T- z6 k; A8 D& U5 ~5 e9 H2 a0 g5 z
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!1 @! e! U" {+ c; r% W
因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
0 {7 Q# m; F. r/ S; y----------------------------------------------+ X3 V: z! M8 M2 T1 v7 w: j
Sub A()
. D4 ?4 S* E: R% n3 I    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
7 }& Q8 S5 G# ?  x9 l* L) C- {    Dim DOC As AcadDocument '声明AutoCAD文档对象2 A( B8 G+ o3 H! p4 v
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程, ^0 [7 X: t0 u* C3 Z
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。# m. j  P' o$ e+ Y8 K
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
8 A8 s. T+ K5 x  ~% R: }; x  I0 q    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令6 `6 Y( C2 Z( ?* n+ T
End Sub
% d5 L" t8 m  g7 p----------------------------------------------
) q; A0 ?( T$ u/ r  U$ y6 R$ X
, d# A# E9 q6 D3 n6 z. N" Z6楼代码注释
; g* J9 P3 a5 Q1 u( k" |----------------------------------------------
3 @4 \4 n; s3 P% [# cSub A()1 ?/ t' D& O  ~
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象* H' @/ z8 I8 b0 A8 C/ i" B
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
' ^; t$ S! v% `2 ^: t    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
& x9 f1 n  j1 L; B' g% p    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
5 ]1 }+ U# F- e& O& ]% CEnd Sub2 N) Z; x5 h7 `
----------------------------------------------
9 S- n3 S! r/ _( B7 @2 C! T9 D  m# S2 }& N) j0 w1 K
10楼代码注释. g8 C, V! _* i# ?
----------------------------------------------
1 A& C9 s& Z8 qSub A()
" [1 H! D+ M& M6 P    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
- K, J% S( Z/ U    Set CAD = New AcadApplication '运行一个新的AutoCAD进程  Q. }( T& t* x5 A. R
    CAD.Visible = True '使运行的AutoCAD程序可见! K+ ]+ W$ N+ ?" x  E! k5 y
    I = 1 '从工作表的第一行开始计数+ |* z6 h* T6 Z/ F( S, _3 o
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
3 |/ K7 g% ?: _% Z6 l5 Y        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
4 p5 w5 a% p5 |0 K9 C/ M' ^  p        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
! ?7 e7 v7 `1 Z: P8 t9 F( q; {        DOC.Save '保存文件' _" `2 @; b# r0 x+ j8 k! z
        DOC.Close '关闭文件
, @  G6 |# I4 ?8 ^+ _        I = I + 1 '计数加1' N2 F- v' t  N' P: e! Z5 f
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
% b5 O8 p  i0 C6 v    '如果检查结果为单元格内容为空,就执行下面的语句
5 l4 ?: K# H3 }4 y; z    CAD.Quit '退出(关闭)CAD程序& M0 {2 c- s0 J6 T
End Sub
* f2 r4 N9 v4 v6 j. c! v& s' h7 ~----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!: f5 a# v0 l& S2 i
版主说说看vba、lisp这两个到底怎么个差别) h# W5 l7 H5 F3 J8 z' X

- `- P* B4 w6 \2 c0 v6 G+ U1 \[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
3 r5 B6 e/ Y# J8 k+ H选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
) b" l, L) o9 K3 R& h, h2楼代码注释
" ~0 Y. e' \* \9 v! p----------------------------------------------
0 _6 B1 g' v0 h& D8 b& T, t0 I% xSub A()
, {5 w& T! i; b. T% Q    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
2 I( r/ `! r* A6 }3 q: m! l    Dim DOC As AcadDocument '声明AutoCAD文档对象7 U0 ]- K3 X4 Y3 |0 a6 y6 o7 |
    Set CAD = New A ...
3 C$ q9 m  Y3 w4 P
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
& m6 |: z  B2 g" d2 [实际上字符串中的空格(实际也是回车的意思)也可以这样。
  D# i' N3 s8 u; {* _# K另外,按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% d. J4 {3 G6 M7 I$ n
6 p2 D7 h# e+ k- D# V# M- a; ?3 T( }; b
. O# ^5 z2 y* U3 L' |& w  ^
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

6 a1 [. i& q  n1 z: n& p; h: n( {* P* a' x8 ~' O- g

: ?' k/ ^8 L1 R6 E- H$ K  z1 x* 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程序的当前文档上做下面的工作  J( L. U8 `9 ~, E$ _9 b: g, w

% S" T7 M# ~) m# f如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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