QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:; ?- X: O- `1 T' {1 L. K  S
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1! i8 P. U/ ?& R+ c$ z& Y7 x
Untitled-1.gif
& s: O9 p# n  t3 }" f9 d, l9 y, n' N) H/ ~3 p' S0 j
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。5 d9 Z. S2 a. i1 ]- n4 @
3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
2 J6 D: P; x7 K9 ^( ]1 Z8 s+ m$ ] Untitled-2.gif
7 t+ I* ~& _& q, o! E2 y' a+ [" R" i- H' g
4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
0 V: k7 S5 y: t: A2 M9 I/ K7 [-------------------------------------------------------------------------
0 @& S' T2 }5 A- Y* p7 \/ V2 ]Sub A()% z" V+ S8 M" g1 {& {4 i
    Dim CAD As AcadApplication, DOC As AcadDocument0 ?7 Q0 J3 W" J: |
    Set CAD = New AcadApplication
8 T, t1 g' K! c- w- b; f$ M9 g    CAD.Visible = True
  X4 h5 D1 z! {+ t  K4 w5 Z' i    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
- a9 K" K5 y; f" Q    DOC.SendCommand Sheet1.Cells(1, 2).Value$ E- f* ?* e) X
End Sub
5 Y# f( z( `% H: v  D-------------------------------------------------------------------------
: n) D$ Y/ e& K% `见图3
7 f% q# ~% s  G3 K2 H) E Untitled-3.gif
! V2 N' t% E  y; p/ N: U5 V7 O0 z: n7 Q/ G1 m5 Y6 m7 z
5、在EXCEL界面运行宏,见图42 {( d% U4 m3 l! _
Untitled-4.gif
+ z) ~+ \* s# k% O' e; w' x% r+ _3 |1 t4 ]1 _2 Y8 |6 F1 m! q, G6 y
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
6 O, e/ M8 W1 b 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# 的帖子

上面的代码改一下: y5 ]1 X" k' `' @/ O
---------------------------------------------" n& Z0 J2 c# M8 @( v1 m5 `2 y
Sub A()) p6 u" T0 r* S
    Dim CAD As AcadApplication, DOC As AcadDocument
9 Y# y9 s& p: x' d! |, \& w    Set CAD = GetObject(, "Autocad.Application")
; Z. G; ^- b; g    Set DOC = CAD.ActiveDocument/ j( O( D' Q/ e) V4 a5 \1 z
    DOC.SendCommand Sheet1.Cells(1, 2)
# F. U- z  a+ J  sEnd Sub3 o. D! k! t3 H9 `; S7 k- U. f
---------------------------------------------  [0 r2 y& g6 P, K0 N  E: T" {
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
) s  g& @7 A* t* h
  m+ b" F# p+ Z! L# g9 j- ^[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
% e5 Q0 i, c% ~# T
( \/ l; I6 H3 Q. f) w7 D. {- i[ 本帖最后由 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.gif8 |& c" y) F& q0 k# v) A, s
不太理解你的意图,能否再说得详细些?
( |5 }! f3 M% H0 B. _
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
  o$ S, R, @6 H- f2 R5 z4 G' L# n" ~
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写, Z: M; Y# k( ?" o0 ]) M/ l
-----------------------------------------------------, q1 N! {1 T- B7 U0 i7 S3 a, @7 H
Sub A()6 ^1 D6 A# {0 j$ W+ O! @+ X$ v
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer$ [* I3 p3 D1 C% Q
    Set CAD = New AcadApplication( E. c$ I1 V, ~# f0 y0 [
    CAD.Visible = True9 o: f+ V7 v5 u9 F
    I = 1+ @2 N, C# M; P/ B
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""- D+ q2 ^/ a% ~. @. e
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value). U+ o+ S6 b* k
        DOC.SendCommand Sheet1.Cells(I, 2).Value% g+ H: }0 d4 w& P  i* ?2 T' j4 [
        DOC.Save* p+ h* X/ W3 U* g* ?3 L
        DOC.Close
! s; f3 C. }, w) Z        I = I + 1
) S0 b; W9 M9 x! @: }/ h    Loop
: M6 ~$ n* z+ A8 o    CAD.Quit, g5 Q+ X' T# n& |8 a& K
End Sub$ f8 `8 o. C' K
-----------------------------------------------------------------, j5 n) ~5 [7 g" Q# N0 N% A0 A
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
8 N3 {- v7 ]( ?0 n本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif0 i  [! s+ ]8 C! W- T
代码可以这样写
$ H' U  d: V$ x-----------------------------------------------------
( w" G- K' g; bSub A()8 L/ F7 c% B$ b  r5 r
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
% ^. v# R' r3 I    Set CAD = New AcadApplication# W& ]4 n2 I( }
    CAD.Visible =  ...

( N! @9 z! a$ t4 R% J& c1 ?" }7 p. `: D( w' F) |
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
! ^0 x5 s+ W0 [9 k- G因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释: T- X, u. T, }1 {$ {0 Y- V
----------------------------------------------5 q) O6 ^1 K- U* }
Sub A()
8 ^( o1 G1 ]# ~& O' b& H+ U    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
5 w" e4 E, B1 B1 z6 N/ e    Dim DOC As AcadDocument '声明AutoCAD文档对象
  c- Y4 `2 N* W0 q+ b; s) b* |6 s    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
" O5 t' V6 P" h  P$ _6 N0 s    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。( n$ j! M- d6 v6 N3 v
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件+ f" b& a5 h7 l$ p2 I. q8 F. z6 o  i" p
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
+ @4 B9 U+ F3 k) l( qEnd Sub
. K! L9 f: ]* J3 U8 Z& v& f----------------------------------------------  `, q9 `6 ], j/ N
( O" p) m; I& u, A+ `' ]/ T6 l
6楼代码注释" J2 F6 V! n) m- @9 M- `6 K
----------------------------------------------+ |5 d7 {- u. z$ i0 k+ U
Sub A()1 S5 l- D/ s6 X7 O1 `
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象- y8 l4 o# M5 A$ j5 {6 H$ F% l: ^
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)/ j8 }" C% u% v! E
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
3 g1 P) Y4 n9 \6 a& @6 B3 }    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令5 B$ h9 b+ }# c3 F! a
End Sub8 H. l9 ?+ Y$ x  f9 j# M
----------------------------------------------# _& }$ W5 u* R
  Y" T: K$ m8 T  z) |4 o
10楼代码注释
0 k7 p& s+ G4 S----------------------------------------------
4 J  E1 F; T( g6 Y. B0 P/ \6 i! @; nSub A()
# k6 k  s" d* ?2 w# @    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)) J  }$ g0 ^; ~$ ?3 Q/ ?  }- u
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程6 C/ t5 e' a  p3 i, {8 T# w0 S
    CAD.Visible = True '使运行的AutoCAD程序可见  C3 l( r, v. v  p3 H# D
    I = 1 '从工作表的第一行开始计数
2 e$ l1 l  K$ o- o/ O    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空, ^$ T9 {+ z( I% q/ n5 W, b. O1 d8 x
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件! h7 R" D' H7 k6 b0 P* ?
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
& K' i4 y: C: X$ {: ?9 `        DOC.Save '保存文件
% S# g+ h/ o; v4 a; H' P        DOC.Close '关闭文件2 }2 M. z- ^; D% g/ F+ _
        I = I + 1 '计数加1+ \/ d+ \9 _- ^0 A6 T! @
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
: f5 Y4 n2 b/ E  T9 k    '如果检查结果为单元格内容为空,就执行下面的语句
9 K; l) F2 ~3 G    CAD.Quit '退出(关闭)CAD程序/ q3 ^  T6 q, }, Y! P& u
End Sub( }2 b( }/ ?" s, F' V6 a  B
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
3 y, J* `' j. k' `% j& l1 a: t& }7 }0 {版主说说看vba、lisp这两个到底怎么个差别! c( `" B( a  D, V! a. @8 I

; Z# O9 b/ g' ~0 O/ V[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
. z7 d9 [3 i5 l( S8 L8 O$ N6 T选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif3 G" V$ I( p+ Z. n3 g4 D
2楼代码注释8 U2 T; H5 \& T2 n& f. Z# E
----------------------------------------------
7 S2 y6 K- h1 R  \% DSub A()2 R6 g3 a8 f9 _( v. t
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象" C  o1 |& t( @# M! {; @
    Dim DOC As AcadDocument '声明AutoCAD文档对象; u$ @  X3 g" Y  E- N# `
    Set CAD = New A ...

, ]" x- l! c& ^5 H2 j如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。' u6 U7 t1 d% x6 f( q0 q7 i
实际上字符串中的空格(实际也是回车的意思)也可以这样。3 N- R' V/ v7 F) W/ U" B  \
另外,按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, o0 B# H' X( }

5 [4 M4 w8 V2 [" Y# H, J: I9 j/ U# Q
3 u  T9 @; a) B9 i4 p学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

8 x3 d$ d9 {2 g6 L- X# y  r
% W- e, e: g/ Y: U8 O- B
/ ~9 m# ^* }% l1 a$ T真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
5 V& F$ a/ B  N6 y! n/ j6 g! z. I* J" N1 Q/ i
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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