QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 19878|回复: 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- K/ l0 \! e/ j/ t$ T0 S* d* l1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
3 H4 |  O- j( q% y Untitled-1.gif # q) z5 d1 T- Q4 P- ?' H

2 ~4 A7 i! b  @3 X. A  n" d5 |2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。; n; _" g3 i9 E: }. b2 J2 d
3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
6 `9 S1 v6 a9 ]0 h8 g/ H Untitled-2.gif
2 _3 c4 |9 c1 ?4 s1 F, A& R. I
) H; v# m9 s8 _4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码3 T  |1 ^% E4 M' [: {
-------------------------------------------------------------------------
4 ]( k: |- i+ J5 u; PSub A()" |& `0 O# I3 O* {
    Dim CAD As AcadApplication, DOC As AcadDocument7 X3 U4 P! f! G
    Set CAD = New AcadApplication
- |1 o4 |' a1 ~7 v7 f/ h    CAD.Visible = True
! T. o$ B4 t1 p1 H6 ]# `0 }( c    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
' l# s( @  @5 u# b8 W    DOC.SendCommand Sheet1.Cells(1, 2).Value. k( @8 F! y% p, E" g4 H
End Sub. E$ d6 N( ?3 R! e( X+ x
-------------------------------------------------------------------------
1 |8 d0 O8 H. b! O" t, j& S4 a6 i见图3
! `3 u6 S0 Z0 U' J Untitled-3.gif
$ E( |4 O) H$ ^, v4 F' C3 q. p$ Z' q, _) r7 d8 S+ o% t
5、在EXCEL界面运行宏,见图4' M& I- J" `1 h8 L
Untitled-4.gif
9 I0 U+ y8 f' v* x& u& |7 b% p+ m% z1 X; n4 `. p& a/ G
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
8 l4 @9 i  n+ J9 a# e 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# 的帖子

上面的代码改一下
2 E: O& {7 t" \; E---------------------------------------------
9 E% u5 n1 j; C! ?) q" _Sub A()4 }6 v+ C) ?) i1 r( v2 z
    Dim CAD As AcadApplication, DOC As AcadDocument/ j  W4 N' ~0 D, f) `
    Set CAD = GetObject(, "Autocad.Application")* Q% ^, j: i$ [
    Set DOC = CAD.ActiveDocument& L7 q! D# B& i, R6 Z
    DOC.SendCommand Sheet1.Cells(1, 2)
9 n# J& s/ }, _: e2 aEnd Sub% O4 n* r/ }, N" v. @
---------------------------------------------
7 Y  b, ?3 L, s% B本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接5 L0 e, N( E: [/ @

( A' F% |# Z9 L9 i  [; s[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
8 A! W3 E- j) F% U4 \- k1 I2 e, A6 ^( p+ F# q  h% @; W  b7 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.gif6 ?" |* F) g1 k
不太理解你的意图,能否再说得详细些?
1 C: i* `* r: T) p
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
* \3 l  n. m$ H5 G6 u7 J( s1 a/ r( q! u  U; y9 o
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
# P& i9 X) D: r2 S' K% V-----------------------------------------------------/ l) H- ]6 @  h& p0 O
Sub A()6 G. w+ `! r7 L: B
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
! u6 w* |. J3 C% B3 c0 N. j  U9 P    Set CAD = New AcadApplication3 g) B; X! V' O5 J$ w% u+ v
    CAD.Visible = True" L. J3 i* t/ A) |8 H2 ~1 l2 `0 K- Z  A
    I = 1
" Z% m5 c, d+ P- ~' I4 H    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "") {/ k9 v9 V5 C7 E
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)0 p  z% o" F6 j% E! F; F, j* h
        DOC.SendCommand Sheet1.Cells(I, 2).Value
4 Q$ @' u2 R( e# p5 P        DOC.Save
% w; U: w) x$ l1 n+ [: O        DOC.Close% _5 p' Q1 [: o( l" H+ V$ Y5 i
        I = I + 1+ f6 A0 u9 t7 \* a! ^1 t
    Loop4 h6 O+ c6 N& g& P' d7 _* ^* T8 I6 ~
    CAD.Quit* H# R1 M8 ?5 y, _
End Sub
3 S: U, J4 X' I-----------------------------------------------------------------9 E3 v) g$ k: v' T0 V$ E
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。2 R" ?/ {) C! W5 Q8 S
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif
8 R2 D" l. ^! B# y- [! P( g代码可以这样写
3 X' ]" \8 A, `-----------------------------------------------------
8 f1 m1 D, h2 _2 e2 s7 l0 uSub A()
# c+ F3 L/ P% `6 r- R3 i' L    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer; h' {/ d# n7 s
    Set CAD = New AcadApplication; I5 _0 ]3 ^; h/ e
    CAD.Visible =  ...
6 L" Y' O; w! H4 `
  W  A+ ~5 L$ N2 Z
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
! V% q2 U& j; D4 W" A9 P, R' X" ~因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释. B! I: k. N6 F, ]. P5 Z# n
----------------------------------------------
  j  l. m) k9 DSub A()
0 w, c7 T5 P2 o# \    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象6 g4 J/ N- F. L/ K, z- W8 \: W
    Dim DOC As AcadDocument '声明AutoCAD文档对象- ?6 R% Q/ ~, N; A2 F% m* G
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
+ H- T( m2 _4 O. s: H    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。4 w. K0 s9 `% c; o
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
. s' b2 ]9 Y# b, f    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令4 k& Z, Z5 o8 v: ^
End Sub; \8 q8 i' J& x$ `2 g, k
----------------------------------------------* @  c% {* C) K. A8 l8 A1 `
! ^. \7 p4 ]- g  N. u9 H& B
6楼代码注释3 T! x* C. S" Z  p  Y( T, R
----------------------------------------------1 b( ^5 E; n+ K, E% `0 e+ ^
Sub A()6 J, E8 ?: o( ~  v$ F+ w
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
7 l. ?5 n+ r6 u; b+ b4 [! V. R    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个), L% G- G% a! p/ N* ^! p
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
' C$ _6 j* S- \    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令7 n" p' o( l& C
End Sub# B, g9 b! [' x: W2 L0 @
----------------------------------------------
( ~. Y* A9 y" m; [* ]; A, u/ N; T, S- ]" d  f3 ^
10楼代码注释
+ c) h8 g" J6 ^! O, g6 h----------------------------------------------. R1 w7 t8 c' b, [9 b, }
Sub A()+ j2 P( G& V/ \: x! S8 \
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
% z8 k' y7 k7 g1 q, \    Set CAD = New AcadApplication '运行一个新的AutoCAD进程) x) z( f7 W; a" d. A4 P
    CAD.Visible = True '使运行的AutoCAD程序可见& ^/ P2 _* B, q/ {
    I = 1 '从工作表的第一行开始计数
; I# Z- |6 @: D1 C* K, z" o    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
: I# `( ]4 @( p; I4 s        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件) H, }% V+ J3 ?( k* n
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令2 q. I! L2 y3 _0 z/ z' @/ x, |
        DOC.Save '保存文件! t$ u" _/ l+ Z$ N4 E9 s, f
        DOC.Close '关闭文件
3 j3 F& j6 p' ]        I = I + 1 '计数加1* N" |7 L% ^! D2 R+ l. \
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
: C' M; n. j5 E0 A    '如果检查结果为单元格内容为空,就执行下面的语句
; j8 R  e; `1 N3 r- f3 L    CAD.Quit '退出(关闭)CAD程序- N6 R2 D- r' l' E! l$ l( v0 F! Y
End Sub
4 p( v3 T4 E$ S' x) Z----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!. D. u, q$ z' B8 y1 q
版主说说看vba、lisp这两个到底怎么个差别  E: H- k! T) z$ I5 b+ {8 ~/ _, o8 m
, ]3 B: A; w% P) A
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子0 f+ g: _( O8 o4 R
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
: I: f# V& M: B+ _5 ?2楼代码注释
- X6 J  `9 F/ T3 I- f3 @( [----------------------------------------------
( k0 O! M4 Y9 ^/ B! O8 r+ r! Z8 s- [Sub A()) e6 P. N( ?. e, Y% w# Q/ L
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
# o2 I" W7 Y- {0 x2 m( J- [0 G. @    Dim DOC As AcadDocument '声明AutoCAD文档对象
& \2 J( b8 G9 m" B5 ?1 w, e    Set CAD = New A ...

4 ~; N+ ]/ m  Q- a6 @; K) G如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
, l/ q( q8 X, z2 \6 b实际上字符串中的空格(实际也是回车的意思)也可以这样。9 b/ g- o  m; 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% g. Q& `9 J* V# p

4 p) I* T/ F( O5 [3 t- h, D: K, M% q: x- l* z' O
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

( w5 p0 h5 G  @/ F, V1 v- L2 a9 [+ y# O7 y
3 _* `. [0 z% P1 h, e& v
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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  O) H; r4 p8 s% ~( P# l

) |7 p' a. Z- I0 V) V; i' y! W( U如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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