QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
6 r  A* c. u  D1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
# A0 J( Z* T5 f1 [+ p Untitled-1.gif * f2 }& ^% Y' W! M# V
# c  E: g9 ]& }
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。: J3 i4 n- M) T. z8 w9 j8 C
3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
# p  L7 ]# D" p- S" R' c3 g% q Untitled-2.gif
1 q  O" `$ P' W5 c5 z
" a7 Q2 B) u' x# D* V  G: @# g4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码: Q! j% B. b; g2 Z/ i
-------------------------------------------------------------------------
- M7 d) q9 [1 m; tSub A()+ ]* b+ v% v2 T; v! x
    Dim CAD As AcadApplication, DOC As AcadDocument2 a! T' w3 {4 g' E: S
    Set CAD = New AcadApplication7 s4 N" A8 z- x% \" ^
    CAD.Visible = True) H! |& `4 G6 ~8 N+ [' P
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
% D. o/ z6 T% ^# D/ B8 Z    DOC.SendCommand Sheet1.Cells(1, 2).Value8 e8 R- Q) S" d& I) O' I
End Sub( ?- ~! E' v  Y5 L7 {9 |+ L
-------------------------------------------------------------------------0 w" Q! a7 r4 b4 p, u1 G+ ~# S( o6 p$ C
见图3
. y& z  b2 h3 N# L: j6 N Untitled-3.gif
# Z1 Z9 z2 K2 q* s5 p6 ]# w7 a- A2 \2 n- Y9 D3 u4 c
5、在EXCEL界面运行宏,见图4
( L  P4 M( P& l5 B0 Q2 D1 ^: w) v Untitled-4.gif ' @8 \7 E8 B. i$ W" I. z4 @
0 H% `6 y$ Z7 U- v- d' t7 u+ W
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
' N' t1 ^) ?6 W 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 l4 \) ?' [" e) y' ?' N
---------------------------------------------
' q# p* H5 T& G- I1 wSub A()6 F" K. W2 O8 U+ F  f( Y* @
    Dim CAD As AcadApplication, DOC As AcadDocument
2 }, y8 w5 ~5 G    Set CAD = GetObject(, "Autocad.Application"), C+ e8 ~6 M# m6 h1 R
    Set DOC = CAD.ActiveDocument% B( i; b& }* b2 h, u9 ~
    DOC.SendCommand Sheet1.Cells(1, 2)% }) z/ P6 M  H# q0 L2 N
End Sub
  v, j0 ~5 _6 Y0 E---------------------------------------------" ]' h2 g' C7 W8 Z( H8 G
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
+ \* Y/ \* y% B' K% T- k: w9 d# v4 \. r7 W& z: ?
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?* o5 l$ n: T! Z
3 J* f; {4 D+ `/ G/ V
[ 本帖最后由 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 j; q- |. P+ \" P( Y不太理解你的意图,能否再说得详细些?
! r& p! D; G8 s, u1 w7 ^
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~2 ^9 ~5 j# D0 r3 [
8 A# G) J9 I( k* e9 Q& ]
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写# B) y: j& d6 z6 @6 U% w8 L! a' z  B
-----------------------------------------------------' G: B- a  C* R. f4 D
Sub A()
6 z9 |0 l7 h' g1 K& V6 v    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer- D% j  ?2 I& Q5 A. z/ N8 ~
    Set CAD = New AcadApplication
: Q) j% `4 Z$ n5 z9 B    CAD.Visible = True2 {  ]9 G- f9 p: B: T3 U
    I = 11 Y0 ^" D3 I; _5 S3 s
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""6 O+ i" Q/ N0 |8 g
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)$ o/ K) a7 u8 `; E/ F
        DOC.SendCommand Sheet1.Cells(I, 2).Value
% s  i- R4 j6 a5 g6 K7 g        DOC.Save7 n; v. R- m5 I1 Q+ Y
        DOC.Close; X0 {+ P: ^! d# m/ ?
        I = I + 1! T- @: W0 f4 G% G# [" \
    Loop1 Q, {) |4 ^0 W1 N: o3 F  a
    CAD.Quit
/ H! }- s& z- w. X( _+ D4 ]End Sub
: m& ]* p  L# ]4 |-----------------------------------------------------------------
7 [. O* ]5 {9 D6 c运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。) h2 `0 V2 x% ]% P
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif2 |8 N6 S* k7 E# V9 i
代码可以这样写/ H- C( z3 X9 c8 `( c6 {
-----------------------------------------------------
( @+ G: D. ^5 ~* ^Sub A()
6 T) v1 }! F' M5 A& Q+ {    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer; j! q7 d4 \; ]& I! ]
    Set CAD = New AcadApplication
1 L1 c; \5 W9 V$ C) l4 X7 W$ {    CAD.Visible =  ...

7 Y. S1 H' o8 Z
- U2 c5 Y# T- H  G  B  c学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!: K; D) N+ o, y
因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
; T$ d+ A, Q7 p3 x: F----------------------------------------------
0 q6 l* A, m6 X5 y% e/ s% e4 FSub A()
9 @) W9 e& T, F; o- a' C2 `    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象, d8 {2 P& v$ q
    Dim DOC As AcadDocument '声明AutoCAD文档对象
& r0 s- W+ z7 E" N4 o8 m, }' R9 {    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
- `8 O3 }) C1 ?) R% d; e* \3 s' b    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。# k4 J( b2 v6 A( S# T
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件# `. v6 N% V; W9 O- ?# o8 i: n) `
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令9 r; e: k/ ?% r1 E- U$ K
End Sub
6 a; i  x8 G" I- c----------------------------------------------
# _+ b4 ?7 k! I5 a% C0 ^
9 P$ c; w- `5 W1 {' E6楼代码注释7 E( P8 N2 @: i, `1 A
----------------------------------------------
  N6 ~5 Y3 w* i- B4 X8 a. {0 BSub A()
5 ^- V5 q* I$ }, S0 U    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
6 M3 u. J- H! T7 m$ H2 i    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)7 C/ s3 u! {& r  `, w0 U0 _
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作0 O- k; m  w( y( P+ I; K
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
; R6 v" [- a- z, ?' k4 \! cEnd Sub
" Y0 i6 t; c1 o! Q0 {; m0 ^----------------------------------------------
! N/ }! R' b1 e  t4 R1 M" j  i2 g, c( c. d# i2 B7 ~3 b
10楼代码注释8 o. u3 K6 e2 d; B
----------------------------------------------% f7 I3 J- [0 c" q- C: I
Sub A()% Z  ]( W1 x  v9 x. e3 n/ p
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的): V2 J& o3 P: {7 h8 f
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
8 u5 m2 R# g9 m9 B3 O! f+ v    CAD.Visible = True '使运行的AutoCAD程序可见
3 B) S) ~1 L. ]    I = 1 '从工作表的第一行开始计数
, F) }8 v- r& i  |    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
1 Z8 O  Y# ^# d3 u        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件( x6 z+ `; Z" ?% \7 L( ]
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
" _, W' S- W1 p        DOC.Save '保存文件# T  V& W& ?: X
        DOC.Close '关闭文件
6 v# u) @" y9 V+ A& {& |        I = I + 1 '计数加1: v5 T1 H7 W) Q( J4 L
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
  ^. I$ [8 v  P/ i: W: P    '如果检查结果为单元格内容为空,就执行下面的语句5 `" d( c+ y5 G+ _: u
    CAD.Quit '退出(关闭)CAD程序$ i7 g5 v* t; X; R$ t
End Sub! `" Z$ m& l' H$ _" ]! @7 i2 y
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!% j" [/ T& b" ]: E4 R7 G2 |
版主说说看vba、lisp这两个到底怎么个差别$ q" C, q( U" h6 M* p8 I* k

5 C9 a) t4 k. H: X6 I" q' l[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
3 s  Y: |6 L+ z' Z* Z. q4 c选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif+ O  S: ]; M, |9 O9 _0 Z
2楼代码注释3 T- |9 i; x2 a. a6 m& \8 u, x
----------------------------------------------/ K7 p) k% S, s. O0 G9 p
Sub A()
* P$ c" j% ?" B! u6 {    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象( ]5 L8 y  G( i6 G) {
    Dim DOC As AcadDocument '声明AutoCAD文档对象
8 \+ R* O- q# o* [7 w9 R  M    Set CAD = New A ...

. V+ J( S* M# W; G4 _9 d如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。8 z: N: M! T! s3 T4 W
实际上字符串中的空格(实际也是回车的意思)也可以这样。
0 }8 x7 t/ }! h- A另外,按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.gif2 [8 {4 \2 m! g: C

" B; N! X& Q. T& {4 [6 n
( F2 W& `$ R; O& [6 w学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

3 @$ u% r/ z+ r- q- v( F7 ]2 L' k1 _2 U- B) Y2 ]6 w6 H
! D* i7 \4 A  }% R- Y2 A
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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 x5 M9 A0 [% r& i0 h1 L9 b6 ?- T, u4 r3 e5 u. {
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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