QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
11天前
查看: 19648|回复: 28
收起左侧

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
2 k/ U! [! u, s' g- s* [1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1/ x1 V6 G# ]3 w' D2 c) `
Untitled-1.gif , e, C( q) g: I0 E7 |% R& Y% m! A

: l9 o+ N/ a9 M" E  k% s6 e) M2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
% f5 {/ v& L$ }2 j/ m/ C3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。' p3 s! N) s) {) d0 N' Z6 f( b
Untitled-2.gif " l, W8 r' A4 g3 z; M: h

, U+ K+ {- B; }6 ?4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码" l8 ]6 i# g& b+ Q) E: V% w2 g* j/ a
-------------------------------------------------------------------------
3 `9 B+ T  Q* Z5 A5 _Sub A()
" \, J+ H3 n$ \3 {3 W9 I7 `    Dim CAD As AcadApplication, DOC As AcadDocument
& ?+ `8 h- K8 K    Set CAD = New AcadApplication
( s* [; ]5 x6 \  L! J  s    CAD.Visible = True, ?! z, X0 Y% ?2 @; o0 H# K
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)& H5 D5 e0 p% m7 ?5 y
    DOC.SendCommand Sheet1.Cells(1, 2).Value4 x1 l/ i4 c" q8 _) n4 e
End Sub2 n( U+ ^$ c( m% |& ^
-------------------------------------------------------------------------
: r6 z2 H( v$ D见图32 D) @' z% h% W
Untitled-3.gif
: q' B, b) H5 s' o% D$ a2 V& X# R' h* ^7 z- ?. e! \" Q
5、在EXCEL界面运行宏,见图4
) v1 S/ h( p) y( v- j Untitled-4.gif , p1 {0 n% k: }; ~" f
. o  q3 @- t! P0 |4 @# a& K, \
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
9 v5 D: D5 y- c% N, A) M) [& E* T3 ~ 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# 的帖子

上面的代码改一下) a& C' v1 U+ b: E. d
---------------------------------------------# W( E: a9 V0 \; A+ c9 f- u
Sub A()
/ M; g. Y: D, S# s# J2 k# ~" x    Dim CAD As AcadApplication, DOC As AcadDocument
- i4 }5 B( F  p( I) `; [, h    Set CAD = GetObject(, "Autocad.Application")
4 W( |0 N) u0 @1 S% w7 Y    Set DOC = CAD.ActiveDocument
' E8 C" v$ j7 }# f$ _: Q4 F/ B    DOC.SendCommand Sheet1.Cells(1, 2)
% X+ E1 O$ M# t. H6 o9 a1 xEnd Sub
- r+ w3 _! N8 t8 Q$ Y" p---------------------------------------------3 m5 i2 x  d( T. A9 }3 U9 r' _
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
% c' n- R4 b8 b  O$ M4 x- ~1 k. L6 A1 o6 p6 E4 ]9 j" ]) }5 C
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
1 Z4 z/ P) L9 y  J. `. [* M
2 f+ g3 t  u6 Q& G2 h% H0 d[ 本帖最后由 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
5 h9 o+ `' O0 s6 f: @6 F; d不太理解你的意图,能否再说得详细些?

9 e! {7 e  E$ j# L就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~+ D5 O+ Q- D2 j% k+ F' J9 a
# F& a( n' d  n( ?  O- o% d- j
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写' _) Y+ ~8 s4 j( G9 D
-----------------------------------------------------
$ v6 Y- Z+ v- X% Z" KSub A()
: W9 X1 ]! @- G* W: Z    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
! C4 ]  J+ v9 G; x' C+ c. {    Set CAD = New AcadApplication& w9 E, y5 m. k2 N' s. h, I, [8 G
    CAD.Visible = True3 K! ~& w' f1 s( |1 J
    I = 12 M+ S0 k: x0 }  v8 q# K- o
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""2 Z% G3 r! b0 Y/ {! I2 v- X7 w
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
! c" P1 S2 v/ ?7 `: f: B1 n        DOC.SendCommand Sheet1.Cells(I, 2).Value
7 V0 e6 w  _4 q        DOC.Save0 \: `) n/ w0 U+ R8 s2 M4 _9 O
        DOC.Close. Q3 m/ Z) V. U6 y
        I = I + 1
$ m# V9 X; `" p# w( X5 c    Loop
5 J3 Y  V$ x8 g" ~* v6 y    CAD.Quit, }/ A$ X) O: ~* }
End Sub
  K$ u' ]7 J* j0 {' X-----------------------------------------------------------------
4 L2 _# i! m% }4 X) K' Q- Q$ i  \7 m运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。' @6 C, c7 {- a- V
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif6 s* |3 N; j8 I5 j( K7 A  j4 j
代码可以这样写: J6 n; f- H" l3 I1 Q
-----------------------------------------------------$ m: P+ f" j; P0 k' M: y3 c
Sub A()$ g& p6 R0 t* m% }/ ?: {9 f
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer: `4 d! o3 x( |1 Y/ k6 @
    Set CAD = New AcadApplication/ m! G4 s7 K( T6 n5 X0 P4 H# G7 {
    CAD.Visible =  ...
. p1 G- n# B, k6 R5 V5 N

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

回复 13# 上山蜗牛 的帖子

2楼代码注释; \  P/ b2 Y( E/ q0 D0 W% X
----------------------------------------------
, |. G: [  d# Q+ J9 S7 vSub A()
( j, @; q, k0 m/ b" X1 V& e( o    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
3 Q- p; U( M9 b( m4 d2 q! w# `9 N    Dim DOC As AcadDocument '声明AutoCAD文档对象; X; y3 l6 ]: m3 @
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程  |" q0 ]$ h' v
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。6 a0 o) A, v& |1 h9 P" p
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
2 E6 j5 p0 I% Q7 G& X4 _    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
, g: k4 @- W; ZEnd Sub
1 j8 b# X# y( z----------------------------------------------& q% ^! i) B$ y' u

7 c- z! x) ~2 ]  a( }/ l6楼代码注释
0 Z+ s7 d% n+ V# x! F/ o----------------------------------------------
: A3 x: ^5 N2 \Sub A()1 r; n1 ^! D' C5 a
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
5 Q' O6 S0 o+ N7 J/ s    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
. N# @/ F+ E* q    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作; ^' c) i9 V% a$ U$ A! P% H
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令& }& @5 `9 q. i: }6 _/ ~
End Sub
$ {; I' {* \) E1 `3 R1 U----------------------------------------------+ T' w. y- ^  |1 Y6 X/ E
" G4 \. M: i) L! X" r7 ?
10楼代码注释
& Q7 w7 f, b5 L# e2 l1 I----------------------------------------------* j* Q+ H. k% L! G, b
Sub A()/ K( |$ ]$ f( p( e
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
, d# z. u" t1 Z- \8 v7 u    Set CAD = New AcadApplication '运行一个新的AutoCAD进程* H, \2 V" g9 {% b/ `" D
    CAD.Visible = True '使运行的AutoCAD程序可见! k, Y4 f+ S% G# x$ S  [
    I = 1 '从工作表的第一行开始计数
2 K( p, D& u* J5 R! P    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空# T+ O- |" V1 g
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件1 w+ l& @2 Z+ m
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令/ k+ t3 t" \9 p
        DOC.Save '保存文件4 I8 ^) v0 l3 t9 d
        DOC.Close '关闭文件/ P6 j; p$ |* Y& N7 e, N. i
        I = I + 1 '计数加1
! q) `: k8 G6 y( R5 E; [    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。$ Q8 \- \/ L2 P0 I
    '如果检查结果为单元格内容为空,就执行下面的语句
2 t  S- n* O7 U& h6 T    CAD.Quit '退出(关闭)CAD程序0 }3 K& a8 r6 L* z) J
End Sub! y  U0 W0 L. ]: V0 i) s# Z( d
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
' l/ J+ \  \" S) {/ ?) R版主说说看vba、lisp这两个到底怎么个差别
2 s9 z0 y. l& w1 g# [) l0 E* i' Y& P7 t0 }$ {8 _5 V1 g
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子2 R2 B$ ~! d7 o, z' Y2 `; r
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif2 s" S7 r) n7 m$ A1 S- n
2楼代码注释. a7 s7 q1 J8 j
----------------------------------------------
' _, h3 U# {8 q3 fSub A(). G* p8 {' t1 k0 K1 E
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
6 v. ^* |0 v1 Y4 `3 i; u) ]    Dim DOC As AcadDocument '声明AutoCAD文档对象* ^0 ]! Q- S& g: X/ i5 B
    Set CAD = New A ...

) c. A. o: l) P7 K如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
$ m+ Y' H, ^  S+ w; e实际上字符串中的空格(实际也是回车的意思)也可以这样。7 G& x! K2 R! [# u' {
另外,按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  z* d; k5 ~1 @) z, U( v, d4 L
! l! F$ d) D& n
/ \' H' t2 q# ^
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
* C* \9 ?. S1 ]6 t
- L# e7 t3 m6 \2 m! J; }8 y
9 V9 b0 i, L5 V% O, N$ L) c6 w
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作9 K+ P3 {- H+ m2 s- @6 b. A

  O& x) A) J* i/ C. d5 n+ M9 M如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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