QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 19799|回复: 28
收起左侧

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
# v' M- _: Q5 u0 u( q4 _. g, p) [! O$ W1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
% ?& I3 |6 Z" _& I! I1 K5 ? Untitled-1.gif - W+ n0 Y  _; T: M
4 l4 U2 }; w( _8 E! u  ^
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
$ j" I$ Z; i% P7 a3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
- z. |0 S- k4 s. R) ?7 X' E& S$ L Untitled-2.gif ) N: `4 D& n) t! h0 @
( E1 Y) M9 d6 r
4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
7 W8 i( @! n: f-------------------------------------------------------------------------
! m' c" J# w) s) ~9 m  GSub A()
+ @+ h( |; X: L3 H    Dim CAD As AcadApplication, DOC As AcadDocument; |8 u3 w0 T7 U+ H; {0 H
    Set CAD = New AcadApplication
9 P; \7 _/ ]7 H) x) V( K    CAD.Visible = True
" \: N: E6 c2 }1 E5 L    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)4 a& t1 z- x: D2 d
    DOC.SendCommand Sheet1.Cells(1, 2).Value  V/ T9 n7 I2 p, }" O/ l, }
End Sub
6 G. h# Q" A8 j9 b' I-------------------------------------------------------------------------
: Z) G' a- r7 J1 f  {! m见图3% a* k! _7 O( s1 s6 D. {) a
Untitled-3.gif
/ K: f2 O/ |8 E- i5 v' s# c; t" O  r8 Y4 @
5、在EXCEL界面运行宏,见图45 l' A* R. x; q; m
Untitled-4.gif
3 Y3 q8 W2 j7 U; H4 b& n, e, U5 D% w( H$ T9 g- g
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
) g+ ?9 l2 `4 U5 h 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# 的帖子

上面的代码改一下
6 V% H" V5 z! J---------------------------------------------
% T! \7 B" p) a' c6 W! ZSub A()
: \) M( X, ?: Y: P& Z5 L$ e* d    Dim CAD As AcadApplication, DOC As AcadDocument; {, ]1 p0 x. P8 o
    Set CAD = GetObject(, "Autocad.Application")- N/ X6 u0 t& q" ^) ]7 Q
    Set DOC = CAD.ActiveDocument
  ]& t  `7 J% d: L; p" s6 l! `    DOC.SendCommand Sheet1.Cells(1, 2). p; H/ Y6 j* b& u1 n
End Sub
6 h6 J& a! \& v- z' r---------------------------------------------
* l9 W# k6 g1 t# q( v7 ?* ?. F+ e. J本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
( {! @, x4 ^0 r/ ~* o( r7 |, Z5 Y2 `1 v( r& s, r4 d0 p7 q
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?: H- y2 T$ A7 V& o& d

( E1 ?3 \) z2 B$ N) H* 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
6 n, R9 p' t8 P$ c; J9 @3 C6 T不太理解你的意图,能否再说得详细些?

: e- S3 `; |+ k5 g就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
- o% n  y0 T7 H0 V/ Q( q0 c; O7 Y1 j3 e1 N0 b5 r- @! J, b
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
6 v0 v; D# m1 m& r& u-----------------------------------------------------+ C$ k7 x+ x  L+ F
Sub A()
$ p& q8 ]) R, b    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
3 u( L/ l. _  }# i* t& {    Set CAD = New AcadApplication5 G2 F' n, W6 [5 S( o
    CAD.Visible = True
# @0 O! t, O$ |& i    I = 1
- j' }! f, Y2 x% O% ]    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""2 |6 ?! p  f, d0 O; I
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
8 V' r( j7 Y' R' m& \9 Z        DOC.SendCommand Sheet1.Cells(I, 2).Value. ]( H# ~" u5 ]
        DOC.Save8 [4 v1 r6 z2 U" P/ [
        DOC.Close
  k0 G" M, m& p5 W0 a+ h        I = I + 1
7 O2 o1 z' N6 ]" D    Loop
+ v4 z6 G7 A" i7 U2 p2 B    CAD.Quit0 C# W/ f+ r& r( Y7 _
End Sub; ]/ {! j* |( D" u
-----------------------------------------------------------------
6 s: V* ~" B/ u, F0 @8 @; i运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
0 x& b! T9 n! J: X  j; k本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif& i! s( d9 V, U
代码可以这样写6 c$ M/ |% `7 U# p: H4 w% t: ^
-----------------------------------------------------' X4 ~8 q. e; l& J0 S% C
Sub A()! b7 G4 [, V- _# |. I
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
; U0 N) p: s6 }7 d) f    Set CAD = New AcadApplication- G  [# t) z9 X; w$ }
    CAD.Visible =  ...
! b1 j" r& j" ~" J" _$ o+ `
  I4 z3 G5 U9 `/ Z; T8 z
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!$ B/ w1 q% j5 ?# d
因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释" X# y5 N  e% S- U. H
----------------------------------------------
2 h6 v# O0 @4 |Sub A()
) ]5 N( ~$ t- O& @$ r- o  p    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
, F  v$ L3 c/ q0 b    Dim DOC As AcadDocument '声明AutoCAD文档对象' c2 c# ^) F; s# Q: \
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
) R% {- Z- m: v    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
4 H7 s% ^3 i: B1 O# t& H( s& u    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件- z- j3 N; P8 {+ m8 o  A
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令- F# R4 y/ Z4 Z1 b3 s! l
End Sub6 W' K. {* J" Q2 V  b4 G
----------------------------------------------- G7 k! @& h: X

0 y# t' d: d9 ~6 }5 P6楼代码注释. ]# H1 L2 T8 g" D
----------------------------------------------4 `6 t: v& {# w4 r( x
Sub A()
$ h+ [- ?& {  H+ |& }0 o1 K    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象. ^# p( q7 J. k
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
' y6 h# h1 Y7 D$ Q* w0 O4 `    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
7 y4 T+ U: J  ?- z  ?$ Z0 j    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令: e4 o; A5 B9 U4 t" q# h0 H9 `
End Sub
8 v; x/ ~3 e4 @3 r, }% W----------------------------------------------* g  s8 }6 X' e0 b, Z$ L

' V) ~2 y0 O7 R: P" `' b10楼代码注释/ }8 G# g2 Y* A0 ]
----------------------------------------------
! w3 z+ h( G& E$ J( i. fSub A()
4 L8 Y8 i- O0 U# m$ Q" j+ A' ?    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
- I$ e  F$ ^8 G. n    Set CAD = New AcadApplication '运行一个新的AutoCAD进程7 g7 ^! L0 _8 M% m, K# W4 O
    CAD.Visible = True '使运行的AutoCAD程序可见
. k9 t$ X" |4 ?    I = 1 '从工作表的第一行开始计数
3 [: O" o* C% I    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
- l6 O- z0 [2 K8 m$ @" b. U        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
% ^# I) }. X. ]  X8 y, R% g( ?        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令% F: p# E; T( U  h4 e4 v( r
        DOC.Save '保存文件
$ K  _! K/ \/ n6 _+ {/ n' c; b        DOC.Close '关闭文件5 o' \. R  j6 y4 e2 p! U  b
        I = I + 1 '计数加1
& D0 i( h/ p) k" {6 v    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。) B+ m6 ~# ^! I$ ^( h' j- w0 j
    '如果检查结果为单元格内容为空,就执行下面的语句, [6 w& `% T; w3 s- ]8 ^) A9 h. }
    CAD.Quit '退出(关闭)CAD程序. r8 g5 \; {& N  ]
End Sub4 f# x& F% |+ ?3 i) O5 S$ b
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
1 K6 i* p9 U( a' f0 e8 ~' a版主说说看vba、lisp这两个到底怎么个差别
; N$ Q3 k; e" V2 ?1 B" u5 n* J
/ p' H! q/ n$ ~1 E* |[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子8 x& r& V4 u  Y0 A* X1 Z
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif" ~0 h6 a2 W7 c% _8 e
2楼代码注释
& K3 J, p, W) ^7 k0 U" R- ~----------------------------------------------+ i0 m( ]8 o2 Y( U/ p& E
Sub A()) c6 d  x$ ]* {$ F) q. R
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
# Q# @' {1 B' h    Dim DOC As AcadDocument '声明AutoCAD文档对象+ c$ }* V0 b9 w3 I. ?. M
    Set CAD = New A ...

% H  c/ X* ~2 _6 A. Y0 c0 \+ T如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
2 M: S* I0 x! W/ U/ v  Y) P% B- s8 q: G实际上字符串中的空格(实际也是回车的意思)也可以这样。. ?  S( S  {/ v
另外,按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% B$ E5 D! m7 ?9 I. j3 x

/ c, _* H1 u" w8 r# R
9 x* {- C7 ~; o& f学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
: V2 x( \( n8 [1 o- t( a

2 `( C/ U5 ~) V8 ~* o/ E8 J! \+ ^4 R- F2 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程序的当前文档上做下面的工作
' ?6 X# ~  u) D
) [& k1 Z2 P  V6 A6 S, ]: x$ X4 o如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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