QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
+ d9 F/ E9 t/ l# O) c1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图17 i. u/ g* R8 V4 L# E9 F
Untitled-1.gif ! L# D2 K( i9 |2 `# r+ s3 o

, [! O$ ]: H7 Z0 T2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
3 S% z" ^/ E! S, p" F3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
3 A0 l2 P" W, }$ O Untitled-2.gif
7 t: i- J* o' b6 ^( R$ L% }& b2 g. r+ V8 o- O4 L$ O3 J
4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
; t! O+ O7 u, Y) B-------------------------------------------------------------------------0 G1 n5 I7 m# x( M" ?( Z
Sub A()8 D0 X0 s* ~8 h9 X0 k
    Dim CAD As AcadApplication, DOC As AcadDocument
. D0 @7 Q4 `3 ?: _! }9 S5 I8 ~' Q    Set CAD = New AcadApplication
7 f8 B4 [9 g6 [; L, m4 m    CAD.Visible = True7 h7 m/ r4 p& {
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)7 P! ~4 l3 O+ I$ A) Q
    DOC.SendCommand Sheet1.Cells(1, 2).Value/ ^. C6 d* T7 c$ ~4 I% h5 ^
End Sub
1 s  V7 ]3 e6 `4 `- W# E1 P8 a-------------------------------------------------------------------------
' G0 ?2 G5 b* c' U% m8 r; H见图3
. Y% J0 u/ m( Y1 t Untitled-3.gif . A6 Q. a9 [- `9 M6 b# K  o; R
" S+ C, W) y  R2 Z7 ?  g9 g
5、在EXCEL界面运行宏,见图4
- ?7 O7 k7 ~$ V! n2 w/ ~ Untitled-4.gif
* l7 e5 _+ G) J" j0 D5 c* i% B8 q2 @
) t8 E" z, G3 ]6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图56 r8 L- p6 k# O$ h- S
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# 的帖子

上面的代码改一下
! c1 U5 `) M9 f- {' S---------------------------------------------
7 p. W" e+ r  n, G# XSub A()) w" L8 v/ E. K
    Dim CAD As AcadApplication, DOC As AcadDocument  a. |  L1 Q" B, ~- c9 f
    Set CAD = GetObject(, "Autocad.Application")
; i4 Q% k' S! B+ V! b! y# C  |    Set DOC = CAD.ActiveDocument
8 W) z1 Y; _% {! ~  T    DOC.SendCommand Sheet1.Cells(1, 2)7 d4 h* ?# G" Z& {
End Sub* Y. g$ M* j6 ^
---------------------------------------------% Q4 B( x! p5 M1 y2 C/ w# j# q
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
" \0 ]. X/ y4 W( E; p5 d8 R" ]3 H5 G% y, w: K
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?. |+ i6 g- ]1 u6 j  a1 c7 j0 U) M

' i9 ^+ D2 f" Z) ^[ 本帖最后由 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' H* @7 n3 c0 n8 D/ |' l
不太理解你的意图,能否再说得详细些?

9 ~9 [7 x8 p1 ^! V% Y& k8 X就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
, a, \% F( E1 g) i. R5 e
7 D. Z# L# b: U- C( o* \' J[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
9 o( u7 K& _$ R% Z-----------------------------------------------------0 J. @0 K! l) \5 m% q+ V
Sub A()
- A0 u% L; h7 z: m  q: S    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
2 ]/ s$ F# y1 q3 ~$ b" \; \    Set CAD = New AcadApplication6 C5 U5 A1 g1 p3 o6 P2 [5 w" a
    CAD.Visible = True4 I6 t6 ^. q/ M7 A: n  q+ N
    I = 1" R' ]3 E) R! p& A. x+ ^
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
% u  a- A; C; G4 G: B# {        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value): v2 p* a- u8 R6 z
        DOC.SendCommand Sheet1.Cells(I, 2).Value
+ Z: I8 f& `7 l: ?# T8 w8 f        DOC.Save
1 m: _# m+ y. c+ t/ R- V) W        DOC.Close  Z/ `/ P! I/ @) Q
        I = I + 17 O/ v2 E& ?) Q8 A# v5 Y
    Loop; g, I3 G8 i8 |. u5 g5 G9 g
    CAD.Quit: I! S4 n8 F* H5 A. r# P6 Q& h
End Sub
4 i' Y9 N$ E; @- m: \-----------------------------------------------------------------, u- W3 A9 M# Q5 y: }" m
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
2 t$ z2 c: M- 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
2 O0 p! B; g3 I; p$ @) l  ?代码可以这样写$ Z& Q7 w( ~% K9 q
-----------------------------------------------------
7 h3 d4 H/ M- g* E' A8 X' WSub A()  E* Z- N! O# ?; A: S1 f3 }
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer* s6 Z7 V. _' G  n* X
    Set CAD = New AcadApplication
! U( g  X& i0 O; v7 U+ Q/ j    CAD.Visible =  ...
. D  f6 w# r4 H6 p& m# d& S

) \* ~. a) L4 l. A; l/ Q学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!8 Y2 m) B9 }& {' Z* ^
因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释& {7 N: Y' q3 i! h+ |* B* l
----------------------------------------------
* D$ _2 J/ `+ hSub A()
# n7 o5 K7 }2 c2 x( h    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
4 d8 k! z0 }7 n3 o' e    Dim DOC As AcadDocument '声明AutoCAD文档对象
4 O" V% e: M. j; B* [    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
" D( b- f+ b3 a5 M/ {! w    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
' H8 o# `8 T" v1 y6 n    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
% `. w# m" L3 X5 d4 Q    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令) N0 I! Q  I, V+ N. t3 G3 B% b
End Sub
# M1 }1 d9 k/ R6 d, `! j----------------------------------------------3 B! R# @) p4 Q$ A- `# R

/ u! ]0 B5 Q1 U1 _9 F9 ^7 x6楼代码注释
2 Y) _% z+ Q( O% L: @# |9 q7 S! }----------------------------------------------
3 \& C( w+ G! I2 n$ l5 N# ISub A()4 _7 Q/ Q; B3 m+ C9 }
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象2 a6 d1 y; g/ i7 `! f) Q
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个). h+ M2 [/ {- L, r
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
9 r( y: S& u7 g& O- T    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
8 G; w+ V: Q" `2 k' f' \; UEnd Sub
5 ^6 y/ |/ E; U* m  ?  @# b----------------------------------------------/ [( f+ Q" l& t. Q; F- R7 ?

' V* `! p' g* @6 y10楼代码注释% K- m' m7 s, c$ w. ~
----------------------------------------------
( c3 v9 ?/ Z/ y: u2 qSub A()
1 Z+ [, V& B6 F; S    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)4 N& e! ]& B6 t* k
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程0 F0 {3 F# e) x0 _/ E
    CAD.Visible = True '使运行的AutoCAD程序可见
! O2 q9 p( w+ y/ Y% E' O    I = 1 '从工作表的第一行开始计数; Y& E$ }; _! v% x
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
( Q' @* |; G% D5 N        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
; v6 `5 r6 [$ D* i        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令. Q  p$ B* Y: [* l) P
        DOC.Save '保存文件7 e6 x7 O" K# H  Z" x" ]! |. I
        DOC.Close '关闭文件* p; C8 a# k( R. K3 C9 M
        I = I + 1 '计数加1  E  [  C& |+ J* `3 i# ?( \$ X
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。- ~5 e( Q) ?& r. P4 Q: K( J' S/ f5 u
    '如果检查结果为单元格内容为空,就执行下面的语句" C2 a$ k- `; K
    CAD.Quit '退出(关闭)CAD程序3 C0 T$ V& s$ E. O; n7 h2 W6 C' a0 D
End Sub
# t9 w8 x* f2 b# ?- M* m# r- c----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!8 A/ Y( G+ l9 m$ Y4 B6 K
版主说说看vba、lisp这两个到底怎么个差别# V4 u3 I# K: P- M. o

0 d) X* g4 e: D9 ^4 n3 _[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
7 K9 @8 I* P% e* q: W. T选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
% {, @* J4 `) i4 m- `+ h2楼代码注释
9 `3 `) \! Q3 R----------------------------------------------
/ s$ y- l& `+ W6 g1 l5 j9 X9 ?Sub A()
1 o, f/ M2 C( ?; Y8 k    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象8 O4 i6 p3 v$ Y" O9 |, x$ W3 t! Z
    Dim DOC As AcadDocument '声明AutoCAD文档对象6 p/ }  a" Q  l/ I  Z" K, d6 N
    Set CAD = New A ...
7 w" ?; r! ~4 w  ^3 a: X) `
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
( q! Z" d7 P8 F: W; k: m4 A7 m4 o实际上字符串中的空格(实际也是回车的意思)也可以这样。
/ X  W7 g) G- v4 N另外,按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 d# d0 I: c0 K& w- [/ [1 G
7 t: ^; r% h* R% |* K. K( A( Q
( @4 x. b0 k: f7 c6 g* u7 [; g学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
! |5 S7 x+ S- y2 n. I- E
  R$ B8 Y: p$ k% p. o
1 Q  M6 U- u, V8 l) P" s: v  m$ u
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作* B/ _8 i4 E1 r( ]8 M. e2 Q

# Z6 H! a  m/ H2 S, c( a. I: Y如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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