QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:! D3 }' q9 L- w. G8 O
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1& W0 `& m& ~  y
Untitled-1.gif
+ d* E% v! \% s4 w5 j/ t% b: Z+ Q
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。. s( r, m. O! |7 k: I! M  b
3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。3 ^: t  c0 s- ]$ a+ Q
Untitled-2.gif ' \: _& T8 V( e# V4 c( Y* _4 Z

$ I: l' ]! ?  n. B9 K- a7 y8 g+ X4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码+ |" v# y" {3 \: v' `" w0 y
-------------------------------------------------------------------------
! {0 e9 I" A4 y5 d% hSub A()
9 [% W2 Y0 p! c    Dim CAD As AcadApplication, DOC As AcadDocument
0 Y+ O, W7 H* _: a9 B) H" R    Set CAD = New AcadApplication
- O" o1 r: C7 f8 a9 O+ ~    CAD.Visible = True0 o3 i$ g  \. m' g
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
, M- Y; z$ t2 _5 t    DOC.SendCommand Sheet1.Cells(1, 2).Value- C- w6 y3 U* w& F
End Sub
9 t/ ?) @# z' C-------------------------------------------------------------------------
# f. i7 n, i7 \7 J/ f见图32 T; H  T+ n0 X: e- [5 c/ ]
Untitled-3.gif 9 F7 g4 i4 b  z2 B  l' k/ m
5 h. B4 P7 q; I# w7 t
5、在EXCEL界面运行宏,见图46 r9 l( V' u0 q0 W$ R
Untitled-4.gif
& X+ T/ K, P( S8 m/ P  G: b0 e* a" r) U
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
( w0 l% x- a# r$ c  g3 r 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# 的帖子

上面的代码改一下
. x+ h3 P& c% L---------------------------------------------
4 f& b* n1 m' q' O, r5 P: }. D- C9 s) MSub A()8 ]3 p7 K  y( C  K* _# T
    Dim CAD As AcadApplication, DOC As AcadDocument
  m& i% h; |1 l5 |: z    Set CAD = GetObject(, "Autocad.Application"), e9 {4 @$ y$ @" f. L
    Set DOC = CAD.ActiveDocument
2 _1 [* I+ M* `2 K: {7 J+ t    DOC.SendCommand Sheet1.Cells(1, 2)
# g+ W( `, Y& L* Z5 \End Sub
5 T5 {$ s( ^2 |9 @---------------------------------------------
( @& `) v! |( D本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接) }/ i$ n$ V: ?; k1 N
' k' e2 w( ^: J! q% J+ J
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?5 {) q1 z+ T% w2 i

' C3 y/ ]2 F9 x' O[ 本帖最后由 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
7 _/ `1 Y+ }8 U6 |8 I) l- n不太理解你的意图,能否再说得详细些?

9 h2 G- Z3 W7 J: J8 y就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
  F+ m( R+ E0 T& z8 @  s4 {0 Z
, U3 f3 X6 k- N' b9 t[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
3 u- b4 [. U3 M: Z-----------------------------------------------------
3 a; J' C; W6 ^3 V4 HSub A()+ o# t' I3 P; C$ Z: g3 x8 p& |' a# N
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
' _; {- F4 |5 `6 ?7 O    Set CAD = New AcadApplication
, S% T7 y# U' I( L; q) \    CAD.Visible = True
- ~" }/ F# a7 ^5 n3 M& \2 I    I = 1
$ y9 @9 p3 l. t& S    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""5 z1 r9 t: o0 ~7 B' n5 R: p
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)$ i4 ~0 s* Y( u9 O
        DOC.SendCommand Sheet1.Cells(I, 2).Value
! {( {/ W- m, ^$ N! p9 n        DOC.Save
) W! p/ J3 i7 a5 C        DOC.Close" s9 `* S1 o4 P8 H0 B" M
        I = I + 1
- k8 s. f3 Y# Y    Loop
6 s2 a5 ~8 J5 D5 E( e8 Q5 D# l    CAD.Quit7 ~1 w% }. I& m5 x' v& [8 G% R6 g9 ]
End Sub
7 a. A% V9 w' l-----------------------------------------------------------------% K6 d( ^- z$ W. h" R; b
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
5 U) G) L/ T) o& 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
% {# L3 G$ H8 g- i9 C代码可以这样写1 c5 p  B8 `' u9 _$ `0 i1 t
-----------------------------------------------------2 [& h/ T) ~/ B  z: Y1 d5 n
Sub A()
7 ]6 \' H* a6 [( G) l    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
! @, M$ U# A$ F# S& k2 `    Set CAD = New AcadApplication' [1 a5 f8 V& z+ P1 j1 [
    CAD.Visible =  ...
6 Q# o2 B* M8 ?1 v% B
6 b4 Z8 W1 ^7 V0 X: O8 b5 @* L
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
9 T7 O. u6 o7 K& W; g因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
4 @* a1 i8 ~7 `8 W, E# I2 m3 ?----------------------------------------------+ a: f/ n; t0 k& U( K( c
Sub A(), v, s2 f5 O  [  a6 P5 |! _& s' {: g
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
2 V% u; L- ]/ g4 J" n- }4 U; M( D    Dim DOC As AcadDocument '声明AutoCAD文档对象
) R+ ?. c5 M( t# n2 L    Set CAD = New AcadApplication '运行一个新的AutoCAD进程9 F; r; @$ t! v3 o% ]% _
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
6 q- ?# K  R' p; d6 E) D+ E    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件: q- j5 e  ?/ ^
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令$ q1 L0 N) k) t/ j+ M3 M
End Sub. y$ q  _) B9 J0 C9 _
----------------------------------------------
8 ]% _$ @5 D. n1 J
# X" O8 d  a& q, Z6楼代码注释
! V9 z: e  b8 l$ Y; C% s----------------------------------------------
6 f1 a1 u: }9 [1 W6 RSub A()
# @. W' q4 f6 z1 X# T. R    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象. D9 R8 Z( G" X* w8 g) K
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)- v1 p5 R) i- p8 _7 [# R& N+ j$ L
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作7 y2 q* I. c2 ^7 y' t' @
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
, O1 u- m' w" M- u% G5 I  dEnd Sub
9 @  D8 X# k' H) [6 `  `----------------------------------------------# _) l& T; p% w  R+ X; ^

' V5 y3 ?0 _' f  M10楼代码注释! _* r4 [2 T, U( Q0 U- x" }
----------------------------------------------+ T. Z% \5 |0 Y% e8 o" K; B/ J
Sub A()0 c2 B; N+ ]2 ]5 y  T; f% o1 c1 n
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
- ~" x: O5 r9 A; t    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
% Z: V% |; k; m) _3 M    CAD.Visible = True '使运行的AutoCAD程序可见4 A& K( |' I5 F; ]6 I
    I = 1 '从工作表的第一行开始计数! ~8 S. H: e6 \
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空4 s& c9 l+ {' D, \- K
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件. Z4 U9 d# l/ D$ ?' T" ]. A& ~% s
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
3 K6 |% j8 V5 ^        DOC.Save '保存文件& V/ z/ U/ t4 K' [1 N( S
        DOC.Close '关闭文件
' e% @5 ], o* D8 n        I = I + 1 '计数加1; i; G9 i* \: q$ K# l
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。# n! w, }# G" x5 R- u
    '如果检查结果为单元格内容为空,就执行下面的语句
& R- F7 `! {0 s6 P8 e    CAD.Quit '退出(关闭)CAD程序
; w* H7 r  E1 _3 e$ ~) |End Sub
* v: [7 k" G- H1 p----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!& w8 F8 c" j. u3 D8 b3 V" b3 ]! f& R
版主说说看vba、lisp这两个到底怎么个差别/ k$ Y6 r3 t- ?/ Z
! u8 l! f3 u/ ]
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子' x& D) p* {4 Z7 L1 c; D1 p+ i+ h
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif9 {- H5 }- [5 f9 Q2 _1 |1 C( u9 s( y$ V
2楼代码注释# `* T: ~# N% H4 X9 P; U( v
----------------------------------------------3 n, B# `/ F" {7 H
Sub A()
+ t% ^) e% B; F* g* @9 l+ V    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象9 D' P+ R* ]. O
    Dim DOC As AcadDocument '声明AutoCAD文档对象7 ?- P3 w  k8 Q" X0 {
    Set CAD = New A ...

0 v0 `$ ^* M% R  m' z如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
, s, D0 x  ~5 [$ K* C实际上字符串中的空格(实际也是回车的意思)也可以这样。) B: X# \( P7 ~% M- g: N
另外,按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.gif1 b5 V* T$ f3 u" |" \* t
+ _+ S2 y+ `7 q4 ?2 S/ N% a6 K

2 Z1 E; T: x" U; {9 Y9 [7 ?学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
( J! G: ^, ~/ w3 i
. A" \) r% ], r/ b* e5 H

( Q8 W. V: ~0 j+ ?  b1 \% @1 z真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作# g9 g4 T! k4 A: X, F, K

/ F  e; ~" B; ?9 c$ F) ?6 U如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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