QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
10天前
查看: 19803|回复: 28
收起左侧

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:/ N: N* s: f0 T- q
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
! h0 @0 J2 m! f5 G) P& k( D' G' R Untitled-1.gif # K) Z5 {7 e2 d" S3 ?
- B1 S4 L# J/ R+ ~4 m  U
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。) H! Q7 Z. i0 K( m$ {7 t) j: a
3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
' T4 O2 b$ [: l0 U0 A/ S1 F Untitled-2.gif
" ~! u9 O% c% z, T/ C
0 S5 L/ B. V. ]" u7 y9 N4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
; ~1 t  T4 i/ p! n& z% l/ T-------------------------------------------------------------------------% X+ @& y& p2 i) ]! D/ c
Sub A(): [3 l2 c, Y' q) G  [5 |( e% p  ^
    Dim CAD As AcadApplication, DOC As AcadDocument( g- y2 l' ^. e
    Set CAD = New AcadApplication! K. y0 S3 T1 N7 L/ ~5 t
    CAD.Visible = True
; b6 p7 t. I  k: {; f1 m1 g    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)/ W$ c: r' i: K& G1 H+ @& X$ ]
    DOC.SendCommand Sheet1.Cells(1, 2).Value, _1 k1 e6 H' N& K1 F6 b+ ^
End Sub$ Y: U, G; V6 E! W# [4 a9 S9 }! c9 A* J
-------------------------------------------------------------------------$ t) [& i" r: l/ s/ ~% z
见图3. {% v" U* z1 [8 S
Untitled-3.gif
* ^- [" n5 L. {2 A) \/ k+ H, J4 e7 N1 T; c: j5 Y! J% ?8 F
5、在EXCEL界面运行宏,见图4
' Y, N7 x% P' ]# o+ Y Untitled-4.gif
8 J* [  j& M" W
0 x, c/ Q( @+ w1 C4 L1 {6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5# Q* j5 r% D1 X/ \5 A
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# 的帖子

上面的代码改一下
; i8 ^: @8 x0 L0 R7 Z/ D---------------------------------------------
: K1 i" R! C! Z! i) ZSub A()) u7 T' e, j( n: f0 Q
    Dim CAD As AcadApplication, DOC As AcadDocument
- `: v: P/ w# X$ ]; O6 w( f* l    Set CAD = GetObject(, "Autocad.Application")4 R0 ~( l3 w, C* T% T
    Set DOC = CAD.ActiveDocument
' v+ u  o( S7 B8 V! w0 v7 ?    DOC.SendCommand Sheet1.Cells(1, 2)
4 y  y2 E5 S$ Q! XEnd Sub; f# V6 i9 }6 l  E
---------------------------------------------
5 ]* A- N! @7 M) ~) E$ s+ L# W本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
& @- A6 }6 I- V" F! \* S3 U0 W+ k, o1 R
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
1 t; i0 F" X0 \- x/ Q- {1 ?9 f/ _% A. ~, C4 p
[ 本帖最后由 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! Y6 u) `* V+ D; q
不太理解你的意图,能否再说得详细些?
7 M  x- g1 w  M
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~5 E  O( K. H. }$ N; W0 Y! e/ [7 a

! H; ]& a5 A; E4 p$ v; B$ s4 Y& w[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
; A5 g: Z' }: `# Y# |  J-----------------------------------------------------
& Z- N- s) O: O0 q+ WSub A()8 N6 r+ Y' G7 m3 b9 D2 x
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer+ W, B+ @3 C& p2 C
    Set CAD = New AcadApplication3 P* h* Z* t1 V5 K
    CAD.Visible = True
1 V. z8 K) O6 i2 k  h$ N    I = 1
& p1 I. }  B5 t# H0 j8 [    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
! X- Q  V5 s& H. ]6 I  u% X        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)% v3 y6 D, N/ v4 j) u  G; k
        DOC.SendCommand Sheet1.Cells(I, 2).Value
# E3 f3 }+ ~; U0 Y: e; X  \        DOC.Save+ o1 j5 l/ S( U' I! M3 I* c7 X
        DOC.Close
0 l& p" x: U" Y- A. Z        I = I + 1' i* b1 ~8 g3 t5 \: C
    Loop
1 d( k! ^0 V; _2 J6 D    CAD.Quit. l" m3 C! ~& ~6 M  |2 ]0 x
End Sub  K) d8 u" i# }& @* ~
-----------------------------------------------------------------6 [$ q; v9 r# \0 l$ }% m
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
6 Y# A% F: O; ^& |本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif
5 ~, `- J5 ^, m* X6 E% ?代码可以这样写% A" H5 w& q: ~# y+ t7 A
-----------------------------------------------------
' r% f. }% [7 U$ p9 F: d2 QSub A()% a6 ?& u  s/ Q0 P. l
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer3 @' T7 @1 k0 u) e# w. U& Y
    Set CAD = New AcadApplication
0 L) {0 ]; ^. @2 M) F+ h    CAD.Visible =  ...
+ R/ C8 }8 K- C% s: J  @
/ N8 g7 Y! ^8 t! T* A5 z) Y5 o
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!5 A* W, l* `. f5 f. c3 N9 V
因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释! D3 q: L  X' D& f7 w" G' B
----------------------------------------------
- H- g2 V: D; N2 O- ?* q  E1 D% aSub A()
! B* W) _, ?9 c5 g/ h    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象3 i& q3 c7 b1 F( \- B
    Dim DOC As AcadDocument '声明AutoCAD文档对象
4 l  k) q. ^: x9 f  G% g    Set CAD = New AcadApplication '运行一个新的AutoCAD进程+ O2 K2 X/ X/ x0 ?+ t
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。. d) `. ~7 f8 Z; y
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件& z; f+ `( A; t) {
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
  r9 w- L+ b! b* s; }/ r, Y. gEnd Sub# S% J2 V9 s8 @5 @8 M( Q( T
----------------------------------------------( ?5 Q' _# b. t
  F7 ~% H0 B7 X$ [: E% ^8 s
6楼代码注释
3 k' z  P: p) z; Q; d, m1 m- y----------------------------------------------% F* I, P3 J9 ~% S5 _
Sub A()9 [9 C) w; M, c) L6 y
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
5 M, P, K# H6 m& h. }6 ?* J0 U" M: i    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)8 g9 d. r$ z( F9 T4 M6 A! [: \
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作! E7 b! r$ }* w6 S2 i
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令; H4 h8 T; a: {
End Sub
5 v1 M: P6 f8 L----------------------------------------------
! j* X8 G* ], _
# ~* ~, I% \) `7 W10楼代码注释9 C+ B) \# W5 r" _1 `6 e+ ^
----------------------------------------------
+ C$ @  f8 M" M% [0 x6 c# S1 M+ dSub A()) q: ?: L4 \/ k& e+ G9 }7 c
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)$ [; y/ o1 D1 f; [. M
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
2 G) ~5 ]% D6 G    CAD.Visible = True '使运行的AutoCAD程序可见
8 B* E, G7 B) P3 `6 P0 q7 ^! y' m: i    I = 1 '从工作表的第一行开始计数' Y9 @( S; `7 O; m/ S
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空9 c8 [* o$ t7 \5 Y
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
0 X) t: {/ Q- d  H/ A7 M3 f        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令/ @( w% {, j8 B  c& t$ R; @
        DOC.Save '保存文件
5 V5 `. {- Y& {# A, p& v1 K        DOC.Close '关闭文件6 r1 k/ _; `- a4 c' D4 ]# n
        I = I + 1 '计数加17 Q& h9 i0 _9 n9 u" i; |! P5 |" J- j
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。; v" x3 I& r8 o8 K) m
    '如果检查结果为单元格内容为空,就执行下面的语句+ l) ^+ d7 g' |' `/ a
    CAD.Quit '退出(关闭)CAD程序' r9 F& h; B" T& q  D
End Sub/ P% X) p7 ~1 V4 G) E
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
- E; Z, s) Z# U. A! k6 Z版主说说看vba、lisp这两个到底怎么个差别' _& T* f, B. D8 s/ B& L2 M8 o

$ B, H* E; d5 l! P[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子+ q* ]6 |( X# ~) [' t( h
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif; z" v; g' Z* Y  R  R1 l. j
2楼代码注释
  t9 y& z6 K0 ]  s3 @7 p) M1 g9 A----------------------------------------------# ^* R0 H6 |! w4 g6 o
Sub A()$ J2 w) H& B# e3 P7 S
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
7 h+ q# F7 H/ y$ z+ P9 ]    Dim DOC As AcadDocument '声明AutoCAD文档对象
7 I- c6 x" V' G    Set CAD = New A ...
0 H1 v6 k+ z7 n( G
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。7 R7 [# O. M& e7 ]
实际上字符串中的空格(实际也是回车的意思)也可以这样。
' n8 [& d/ G( T另外,按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.gif0 `7 b% A- j  {$ q/ O% j
8 }- G6 K0 Z; C2 r, E# O) I
: J& q. F3 l, ^3 h1 f
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

  Z" u" f- u% r+ d; n
* Z1 @) U; K* D9 M7 f% X3 j5 l+ `7 n- A- K3 S1 |' O$ G! h* i" N( C
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作" K! l, I/ M3 b$ d2 H

( W7 J9 }. p* A4 X, P, S4 O4 @8 ]如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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