QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
9天前
查看: 19638|回复: 28
收起左侧

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:* E, K2 U4 I/ N  |5 S
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图15 V. o# F  C, b: O6 b
Untitled-1.gif 4 w. \, v7 {6 i5 I5 a6 Q
: n2 |- ]7 ]# k
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
$ @. ~7 j$ S0 h9 b; ?8 t; X; j3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。9 J' N7 X7 V+ U: X5 m% z$ U2 P
Untitled-2.gif ' D1 y! L' n3 q9 Q9 e& S

3 p8 X4 a$ t1 n6 @& {. H4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码4 `1 t" V5 a3 g
-------------------------------------------------------------------------/ W% e6 B" u4 E# t4 M) l
Sub A()5 A4 X$ s; z( o; F. A& N
    Dim CAD As AcadApplication, DOC As AcadDocument" m* l9 h* r1 P* D" a
    Set CAD = New AcadApplication8 l- Y+ P6 X! n1 b; B$ }7 X
    CAD.Visible = True! Y/ Q  L" c( U6 Z% V5 D
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
8 H5 W0 y( `" x. C7 Q0 a    DOC.SendCommand Sheet1.Cells(1, 2).Value
2 j2 E) I! f% sEnd Sub
/ s  j; l- g, n. v/ g-------------------------------------------------------------------------6 K; x; E' e' S4 t. b1 |
见图37 U' c+ L4 T4 s( K; Z" U3 ^5 ]
Untitled-3.gif
% ]7 \) g0 k, }; L
1 c6 I) s; i) h6 K5、在EXCEL界面运行宏,见图4& D' i4 B+ c+ X- U$ v' ]/ h
Untitled-4.gif ) Z& I% w! P$ A$ f$ a: U% O

* x( p4 k$ x" T$ w- j6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
2 H6 E) m/ W+ r& N( G/ j3 K" L 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# 的帖子

上面的代码改一下  K( r& O4 {1 H+ X
---------------------------------------------2 v: r8 b+ k# W; n
Sub A(): f* ~: a9 B: t, `2 ]* ?' q$ t
    Dim CAD As AcadApplication, DOC As AcadDocument5 k+ U& c+ K3 j7 g" p/ E
    Set CAD = GetObject(, "Autocad.Application")
, Z' N$ t) c* k# }    Set DOC = CAD.ActiveDocument
/ K! z( q# \, B8 y8 b    DOC.SendCommand Sheet1.Cells(1, 2)
: y7 x6 T3 l& s! SEnd Sub: W$ K! N& c( A4 ?/ E4 O
---------------------------------------------
! B% d6 D. F- X3 \0 |, ~' x本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
0 ^% S2 p( Z5 c3 j/ [% a0 {# `; X( ]( D, Q0 r2 m# j
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
4 |, b9 u9 ^) D$ E0 t
7 _9 |8 v# E. F+ s4 E1 U; 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
/ C' ^% h9 t8 A- L8 F+ ~  f! d1 |不太理解你的意图,能否再说得详细些?

; \+ A1 i: B$ }" d  ]# q: a就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
$ S2 h. D. Y8 z# F! E
/ k5 A, L9 B2 E, K8 ~[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写" F2 T$ S1 d/ t0 r* p" V2 ~; d
-----------------------------------------------------
" `  H; A$ a( I; t; qSub A()
! r# Z, X: K) |# @) d    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer4 y7 z. h, h/ t. M
    Set CAD = New AcadApplication
0 q8 x4 \9 i, p1 p    CAD.Visible = True
2 f! A& p% E. \  b" C    I = 1) h# B: g& G4 H* e9 e5 U
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""9 j% S0 A7 K# K4 G) h7 ?/ b: j
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)+ r3 M' f) |  E. H% r5 w( ]
        DOC.SendCommand Sheet1.Cells(I, 2).Value. R; G5 K8 Y. X  s1 p& a6 V
        DOC.Save
! Y1 H: u/ \! L4 \2 k, |6 J1 M5 {+ R5 Z        DOC.Close# h& L3 N" S; v+ A; D2 U$ r
        I = I + 1
  Q( {' z5 `4 }% ?8 a    Loop
8 W3 t) p, w) ]% ^) L" f    CAD.Quit# o2 o5 h1 @2 [" @) W7 _
End Sub3 ]3 q- S; z! G6 T& ?
-----------------------------------------------------------------1 f3 \  v0 l5 \, ]9 P, p
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。& y# `. J3 b8 _" N' {
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif
! e0 B! W: j7 y. C: F: J代码可以这样写
8 I4 L, P/ }6 m: V5 Q-----------------------------------------------------
, u9 Z4 I! m' m6 ?$ w/ ESub A()+ s/ s, l* v' U% _
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer6 p* n* f2 h: N0 }
    Set CAD = New AcadApplication* N$ W5 Y1 ~$ ]; K
    CAD.Visible =  ...
0 M. [. J1 w' d1 e7 F8 ?

1 B: g. `% ^% t& R2 m学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!* o+ r9 D" B* @* E$ ^9 \5 m' I2 ?
因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释& I% d; J2 F# N
----------------------------------------------
; f; b9 a. j8 d! {! R/ V# fSub A()( x& {% \9 T) F3 K5 ]
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
1 z% {! _( T% g# M2 x0 S7 y3 I    Dim DOC As AcadDocument '声明AutoCAD文档对象3 X7 l2 r6 K. D) |' D! Q2 P
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程, U" u' z! K. F1 v) }
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。0 [, q* o% n  l  L
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件0 _# W% x' N# W8 N4 V
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令: R$ H( w0 P# J; |5 s
End Sub
1 [; `9 k+ t' N) `: f+ i$ |----------------------------------------------: G! ?# c& E: I

; ?; W/ E1 A5 c6 H% F6楼代码注释  I& @+ ?! p9 s5 O5 c! x$ s! s
----------------------------------------------! M3 |0 u8 b! P' B( r( r- ?# @6 _$ K
Sub A()6 j. g; P( T9 i
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象1 I$ Y: P3 ]7 F: v$ b3 e+ y( {
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
( T! a# T/ w) I( X    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
7 f* N# C# ?" t! B    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令$ l3 C+ M$ }% d# x* X8 v/ L# c
End Sub3 N) t3 S" C4 z1 _: S
----------------------------------------------
+ {9 ~+ q" c: a1 o
) R# _" `' Q1 z0 Z5 n9 X10楼代码注释
, Z8 x& U7 e! S----------------------------------------------
$ l& i3 |9 ]3 n; F3 m5 Y8 \4 uSub A()3 b# ^" [$ ?6 y8 s" D* ]
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
  u5 W0 g/ h7 J% U! b    Set CAD = New AcadApplication '运行一个新的AutoCAD进程) w" |) C1 A) R* I6 G
    CAD.Visible = True '使运行的AutoCAD程序可见
4 f, F" b5 g; H, m$ Z# i    I = 1 '从工作表的第一行开始计数
! Z  L0 x( [" g; P    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空' P! N; u8 ~6 ^4 ]" x
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
2 D% M+ R: ]' R' p        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令3 A4 M6 V6 j. y0 P% u' ], e
        DOC.Save '保存文件
  V5 h/ Q7 x, {: _! h        DOC.Close '关闭文件* q4 g, J5 g* Y" d& |4 \
        I = I + 1 '计数加1
8 d! v) i$ [0 S# z/ G4 ]) G2 s    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。7 U  b6 T) i$ o% R( D# D  H' N
    '如果检查结果为单元格内容为空,就执行下面的语句
1 {$ j+ W1 L1 K+ i    CAD.Quit '退出(关闭)CAD程序6 |9 J" g+ }5 s& s( r4 f
End Sub  f; U! ^! W$ m2 e, u+ {
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
. p: t3 O# v5 L. k( Y6 Q* j版主说说看vba、lisp这两个到底怎么个差别3 c) c- n$ i3 {% t

4 J9 N0 Z' d0 S$ y[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子; h$ m5 y% m2 k4 ^' H6 V
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif6 @' H$ j2 C5 \+ N" j. ]
2楼代码注释7 c; Z! T( \( t
----------------------------------------------
7 J; ~7 g9 J. Z0 k" t# `( tSub A()
. V. c/ j8 \  }1 D$ f; J% O    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象- U6 i/ q1 F' r3 z+ t5 c6 F  J
    Dim DOC As AcadDocument '声明AutoCAD文档对象3 H  e5 N# E& L/ z6 C# w6 W- _
    Set CAD = New A ...

7 k. \9 U, L4 ~1 h如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
9 P# I) @' u7 M6 `$ _7 g实际上字符串中的空格(实际也是回车的意思)也可以这样。
) p6 O" b, a8 ^" u. F8 j$ ^另外,按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
" L$ ]/ M0 U' V  S5 C2 c' P0 m# p  F) u0 C' l

' r+ B& T# Y2 A8 u学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。

' I" i4 F( G) H( e* T+ V" y/ d1 A: w
. {, [+ ]. F, U4 Q* q2 D$ B' ~
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
! P. i; e  H( T
6 \) \% |5 ?! _* I5 H) C2 V# J如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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