QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:4 r" V( c9 l; F& B% I1 Z9 y. F0 m
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
; H% h* y+ Q# q) ]( M. N9 b Untitled-1.gif 9 g& G' F3 L! Z# l7 ]( K

  [! u' ?7 d  f2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
3 n4 V' K$ W  j- q0 S9 `) ?3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
) I* c9 ^% V. d Untitled-2.gif / N8 E1 _* ]1 w" h* R) z6 g4 V

4 n5 f5 w/ z) x/ H4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
4 I9 }6 Y5 L+ \1 p- Q5 D1 Q-------------------------------------------------------------------------0 @1 j0 Z! L8 G  \
Sub A()
- \) _/ H7 F8 x% [+ L# }- M    Dim CAD As AcadApplication, DOC As AcadDocument) X/ t1 C% x4 N. A1 E9 i; y
    Set CAD = New AcadApplication: U3 j3 Z: `) F  m8 O
    CAD.Visible = True
2 v( K: ~  Q; o( W9 T# f    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)" W$ b3 H6 B: L4 P$ w
    DOC.SendCommand Sheet1.Cells(1, 2).Value2 r' }# Z9 D1 s; T, n# [4 s
End Sub
# ~. h% l# j3 [* I-------------------------------------------------------------------------
3 g# o" W. g/ a! F% k6 E& ]  A, y4 N见图3
: ~7 A. x, s$ _5 v, q2 H% T+ g, a' ] Untitled-3.gif & W* n4 D- B0 e

9 `* N9 g- O/ o: p" k% Q% H3 n2 x5、在EXCEL界面运行宏,见图4
* B% {4 P& B; q( x Untitled-4.gif 9 ~: c0 Z8 z2 c, |! u2 {' C
$ U0 h: M0 [8 ]! W* q8 H0 O) o9 s
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图54 Y! u# |3 c1 A: n2 J2 Y
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# 的帖子

上面的代码改一下
9 O/ e/ W4 \: l0 Y---------------------------------------------
' t' @/ M2 }  Q% r8 dSub A()6 F( Z" b! w3 L$ ?& j9 p8 t! E
    Dim CAD As AcadApplication, DOC As AcadDocument
$ }" h- n1 L: L8 n2 o( p    Set CAD = GetObject(, "Autocad.Application")% c  L( Z7 R4 r* w
    Set DOC = CAD.ActiveDocument6 M7 H3 ^/ i  _5 T1 Q/ `. U
    DOC.SendCommand Sheet1.Cells(1, 2)
( S# k1 H7 l9 M2 y5 }% dEnd Sub
4 |# ~( R' v, w4 \7 X' l---------------------------------------------
; Y6 q9 }9 u- c* X本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接+ \+ n1 X% Y0 Q9 o# G6 Z  G3 H6 H
" J5 T9 K6 b2 p% J/ N
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?( _6 i2 e+ Q/ p* K1 \6 p
6 @/ a4 r* X% _2 k" i' A
[ 本帖最后由 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
+ i7 m% f, N( y1 c, |3 \, L" F不太理解你的意图,能否再说得详细些?
2 |9 D: c( ^: T5 w
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~) r% m0 }5 D) w! H6 _2 [  C
3 a( R$ A9 J. w# t
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
* `/ i) g0 f' U# o-----------------------------------------------------
7 D) V9 R8 r2 O0 aSub A(), @( Z! ?( V4 J$ T3 ~# A
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer5 ~6 Z% I/ L. P$ [% m* \6 f; p
    Set CAD = New AcadApplication( V7 u7 R! G: X6 C. d, @9 x7 p
    CAD.Visible = True
) ~( ~* u  }2 l/ m& }7 {* O6 v    I = 18 M$ ]0 }- f6 D5 ^4 G
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""/ T7 X0 Y& A* H6 Q3 c
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value): r3 U" B. m4 l+ Q( c9 x
        DOC.SendCommand Sheet1.Cells(I, 2).Value
& S, R- R: {6 {- ?6 `& g. y        DOC.Save
+ c& z( ?! l, B# o9 \" x! u        DOC.Close
7 e  k) E2 z( o9 `8 d        I = I + 1/ s2 R8 n- y7 T3 w# O$ G& J
    Loop( J* x1 I! r+ `' k9 C
    CAD.Quit
9 G3 k* ]! `; c4 ^End Sub4 ^5 d" p+ v! K' |8 A
-----------------------------------------------------------------
2 f4 z) g& A- X运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
: `$ W- q* c) ?, t& [8 G% y2 B本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif
, ^" w! K/ V4 S4 S3 Z代码可以这样写8 m1 l, `' b$ F* n( Z. a
-----------------------------------------------------" l1 _2 j/ g2 |) s
Sub A()7 U/ V9 F  w6 D8 h9 q3 B) n
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer! r! a8 w+ }1 q
    Set CAD = New AcadApplication
. E  Z* ^4 g" ]6 D( E9 P7 M    CAD.Visible =  ...
) `2 _  y' o! d3 s4 |9 C
- i8 y& r1 q- a$ l
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!% A7 D8 M9 l5 q9 n0 z0 H, e% f
因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
. L3 H+ ]1 d: D! p3 e( X----------------------------------------------" F0 h" e) s$ H* y
Sub A(). T1 i5 c" s$ C- e: ^. `) q
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象9 Z  R6 q* F  z
    Dim DOC As AcadDocument '声明AutoCAD文档对象5 l9 B; q  C' z( D$ ^
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程! G2 ?; l8 M1 _! }
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。1 w  X/ E; D4 ?. @
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
4 r7 F4 u: |. T: z  d% Q    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
0 i9 A  Q# t% ^# x$ ZEnd Sub
4 Y  Z- c8 e" z2 r; g2 ?----------------------------------------------
9 c# Q9 S. d& j) C! ]6 z" K
% N. K- d4 {8 k. x1 E; H, y6楼代码注释4 R& d2 e* E' j( y! ?  I" O
----------------------------------------------! h3 i: l& s7 Q- P
Sub A()2 I$ o  ]" a% ^% F9 d
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
8 O  Q; Q5 O% `( {+ y2 Q9 f5 T    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
8 k# L2 v$ |: o$ D3 s/ O* d    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作- v8 I3 L: t  y/ Y; z
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
9 O+ s; M# x# _: h/ x' oEnd Sub+ `, E! C( h- N
----------------------------------------------3 m2 I' @1 t% _
# B! m* Z7 ~2 L) {' V( g
10楼代码注释8 W( v3 k6 q& Z/ ]2 L) }# w
----------------------------------------------
, S$ m( \5 K' v' ^) fSub A()
% a. K( _$ T) u7 y    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
  {* y2 a% r: Z; [% `    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
$ C$ d+ G6 v0 N' ~    CAD.Visible = True '使运行的AutoCAD程序可见
. E: m* z! e/ i    I = 1 '从工作表的第一行开始计数
6 R6 C; c" _& a5 f! k0 l    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
+ Q, H# z) T$ \/ F' Z        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件, H5 b6 d" h4 Y
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令4 v# @* _! D8 o
        DOC.Save '保存文件
: X% V# a$ z, ?  M& i" H* a8 i6 Z        DOC.Close '关闭文件  V1 M7 @9 E: k7 k* N
        I = I + 1 '计数加1
8 w* k! b1 F8 @$ B/ y) f: q    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。: B: Q/ g; u0 x  O
    '如果检查结果为单元格内容为空,就执行下面的语句
8 P6 f" C( d# g. D+ e. T  v    CAD.Quit '退出(关闭)CAD程序2 U- @9 n$ l  V  T" D
End Sub
5 m4 e1 g2 N$ B$ P# s----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!( X5 B, \5 A6 y3 k. R$ _$ f
版主说说看vba、lisp这两个到底怎么个差别
) o! E" ?' |5 B6 S* E" B
6 D+ e" W# u6 G$ I. u- B/ b) \3 a[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
% }- J; O5 E% F$ M5 {选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif5 Y; W/ F4 U, B8 f  \
2楼代码注释
8 o7 P- Z% a3 u/ X4 ]9 v----------------------------------------------
6 X, ^  ]+ a+ H! v# SSub A()
3 [4 z$ Y, Q4 v- `$ f- i: T    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象& v* ~# t4 X* A9 S+ n
    Dim DOC As AcadDocument '声明AutoCAD文档对象
! O0 p8 P  x' f, Q  ^3 P6 b* x    Set CAD = New A ...
" s/ \, r* a0 a7 r) ^
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。% l" J0 \6 o1 p- H1 N/ `, R
实际上字符串中的空格(实际也是回车的意思)也可以这样。- d& m3 ?* B. ~, j4 J! `* C
另外,按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
$ G8 Q9 p" _* \" j) i8 l1 \# ~7 Z2 w2 B* F

6 }  _4 m$ J% A; \4 C/ B! d3 [学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

  v  ~( e5 |' \3 u0 l3 G# z% ~4 O% O) Y: g4 W  l2 b
; r8 l2 p; k' Z+ Q$ ?
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
# d4 n4 m( W% w  |! k! }8 {$ U" C# Z3 V+ C2 v
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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