QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
2天前
查看: 19892|回复: 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 ]! H2 M: e# f$ l1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1
9 d& i9 e& G+ f, @# l% R. B1 \ Untitled-1.gif
, o$ t8 ^) P1 I
. ]% ]. G$ F$ l) x, l2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
* q- D, @8 `# k2 G2 ]# C3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
3 P8 |, I% I+ `- |% [; F Untitled-2.gif
8 |. {: [: z0 C/ g8 i% t: ~
( Q( C5 u- v# T- S5 G2 c, O; |8 \4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码: h0 p1 d; V1 N+ E
-------------------------------------------------------------------------
" z+ Z  E% y3 O2 h' V* T; RSub A()
1 o: Q8 E1 M/ b    Dim CAD As AcadApplication, DOC As AcadDocument' [" A# h6 G& h& b- y* O  Q
    Set CAD = New AcadApplication
# I- S0 q8 X# M* r% z+ |: h" ~    CAD.Visible = True. [- h( ?& J5 P
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)
6 k( O; ]4 c: q( D$ d5 H    DOC.SendCommand Sheet1.Cells(1, 2).Value
5 k6 T9 K5 j" BEnd Sub
/ d. v+ d: B$ F$ E, j-------------------------------------------------------------------------
! s# m# s) S& N见图35 O4 X+ O+ `7 U- J) E# e; K5 }3 {
Untitled-3.gif $ O. r. A1 H5 K: R5 L  ~5 H1 A
- Q6 l) r& s4 m+ z
5、在EXCEL界面运行宏,见图4
5 t: W. @; w- I5 |7 f5 [ Untitled-4.gif
7 `+ @( i, [0 \  D7 I" a& e  J  K3 q. @$ L6 \: @/ b' i
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
+ v! g* D- p& j' _ 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# 的帖子

上面的代码改一下
4 H9 ~/ L% R" k/ _4 c+ z$ @0 k0 P---------------------------------------------. j; T* t2 ?3 i5 h) x% [
Sub A()
1 O+ j* y. p5 {2 w    Dim CAD As AcadApplication, DOC As AcadDocument; P1 c6 s1 o0 [7 F0 E0 `2 Z2 c
    Set CAD = GetObject(, "Autocad.Application"); h- U/ o8 h# N( G
    Set DOC = CAD.ActiveDocument
; G5 L# q1 X+ J) R, o: S3 D    DOC.SendCommand Sheet1.Cells(1, 2)
1 z7 m  o2 q- B4 j- nEnd Sub3 G. W1 \# ?# T  Z
---------------------------------------------! n( |! V& f* V# j. D8 N
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
5 |* |% F# N2 R/ o( ?( M  c9 n& K4 ~4 Q$ ?1 F- b" O! T
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?( r$ C0 ~% m+ u- @. E$ ^) I! t
* }; \: s3 V& a  Z6 ]; M. l
[ 本帖最后由 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.gif9 u* h- ]2 m' i
不太理解你的意图,能否再说得详细些?
4 g  W' q4 ~' Y( p- G  t
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~; ^, k8 Z& V% [+ F
- U9 @1 U8 i+ L8 i0 F* }: l1 k
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写7 ^( F7 U% l6 q' Y
-----------------------------------------------------) B2 x/ h7 x! D0 P9 C  R- x& q, ]
Sub A()
9 H5 W% J& f: T2 d    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
$ k: V4 X  {1 o* \- `. I! ?    Set CAD = New AcadApplication
: j) g5 e) z- Y4 _    CAD.Visible = True
) [0 A5 Y' ~% k5 K* h7 r0 v0 y4 C    I = 1# I) m: W  t" s/ T9 {( @
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
5 A( ^2 g' Z" p# s3 j        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)0 Q# p) l* \2 g2 L% t- Q
        DOC.SendCommand Sheet1.Cells(I, 2).Value
3 M) n; S9 C9 I+ i6 m        DOC.Save
( K  T! j- `' U: P, R        DOC.Close( `* a0 I5 |$ J8 ^# J0 W% U: f; _
        I = I + 1
6 V- [) Q% L3 M4 l4 H9 M% s    Loop" z' [7 X% j6 V6 z4 c
    CAD.Quit
3 c$ q4 F- Y5 J" MEnd Sub
" h7 h& I- \" h! H: k-----------------------------------------------------------------) m# a6 K+ }: G  r0 x
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。
7 M, k$ e2 d2 T! v+ g4 r6 G& V- ^本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif
4 A) N) }# q+ {# ~代码可以这样写9 U' W1 S: P$ ^; y$ e/ T1 x# \
-----------------------------------------------------
6 d4 w( Z& Z5 l6 \; p' [& QSub A()% ?3 W$ R$ s, V  p' _
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer- d, {0 l! R! {& F. [+ m1 |
    Set CAD = New AcadApplication
9 e4 R3 y0 z6 {( ]# B: _  O    CAD.Visible =  ...

* Y3 h: g6 h% M* F: r* P" I3 u2 _0 F& m3 Y8 z2 P1 M
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
% y8 [7 u6 g$ a* U- @1 v因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
; e5 _+ X1 b0 ^3 o9 A2 P, L$ O----------------------------------------------
- r+ u" d( Y1 r1 S% Y4 USub A()  |; ~0 Q# `2 C  ~6 G( u
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
& b: ^8 S- g+ a7 [/ U% U    Dim DOC As AcadDocument '声明AutoCAD文档对象
; A6 J7 e# l' h& R2 z# }; e/ O" R    Set CAD = New AcadApplication '运行一个新的AutoCAD进程: E& i) }* m! J% w# K* O
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
" T" H( F- U! `8 r    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件. v1 `5 V3 O; I. c
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
( t; T) |7 x8 W$ S# AEnd Sub7 l: z0 X2 o" ]! W
----------------------------------------------
& V9 k2 _0 _; w7 {0 b. T! c
: Q+ R$ w$ D# J$ M$ \6楼代码注释
  b1 e7 O- A4 H----------------------------------------------
* [- ^) E6 P) {+ gSub A()0 n9 V! _& k1 L4 J* U' X" }0 m8 c
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
$ \- q, s$ c4 m& A    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)% D: {7 m! ], G
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作6 R7 Z" ]4 |: t4 k) R+ Z. q! {
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
# R) b/ d! b4 w% s9 ?End Sub
+ j7 @( O- }3 X" y$ d----------------------------------------------
; r- L1 e1 W" a/ B# f* @' S$ P( C3 F, R; o
10楼代码注释
# \3 n/ P% d+ @7 {) d----------------------------------------------7 j, a7 L% Q) i8 e
Sub A(), [4 ?; L" q% P9 C: M  y& ^6 B
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
4 i& R3 K$ t4 w7 \    Set CAD = New AcadApplication '运行一个新的AutoCAD进程" E( x  y% m; m7 \# H
    CAD.Visible = True '使运行的AutoCAD程序可见
* e2 `) @6 [6 S    I = 1 '从工作表的第一行开始计数* b1 N/ v- j8 @+ v% `- X, H
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
1 b9 v! H' Y! [) K0 Q' O& i        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
$ ^. J# h- G0 j+ R3 n        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
. z% N( i& ?0 F. g        DOC.Save '保存文件* K0 l9 h. s3 }% V
        DOC.Close '关闭文件; U7 M5 A+ s& n8 |# Y3 A
        I = I + 1 '计数加1& }$ J8 ^  k& w' g
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
5 L1 Q& Y3 ^: t    '如果检查结果为单元格内容为空,就执行下面的语句8 T, c1 b# \5 D
    CAD.Quit '退出(关闭)CAD程序
' O' t3 f$ e' wEnd Sub
) W8 \* h8 I. ?+ ~----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
9 S1 k4 I3 `  m. K) g+ H5 K版主说说看vba、lisp这两个到底怎么个差别" [( ?& `5 @" `9 \! C0 r! m

& a- ^0 {5 T& j# l% u1 n[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
: n- |- o( J5 d" J选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
- b% Z5 @7 S# e& w7 J4 k0 o2楼代码注释& M; [& c9 K# [. I  K
----------------------------------------------: Z* T* o( ~) j- @- \
Sub A()
$ C! \1 c8 `" \& i9 S$ N    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
; F: P7 f! u* r2 n    Dim DOC As AcadDocument '声明AutoCAD文档对象  s5 `' Q+ T0 j  r. q! l6 o
    Set CAD = New A ...

" o0 I0 N" _( K# h( R如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。. `3 R) O& A" B6 O" i
实际上字符串中的空格(实际也是回车的意思)也可以这样。7 i6 V$ V9 E* i- H/ U0 ]
另外,按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( r- O2 P4 `& x7 {

1 Z$ b: l$ |. c- f3 ~% @* ]8 A1 B& ^8 _- j5 o+ J5 }
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
, `0 U8 {( O7 ^+ f

( Z2 K8 L6 u1 h( [
( O$ a6 h9 B" u1 [2 _  l真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
/ h7 t- u4 Y& ^+ r  N3 ~+ D: A% ^3 q$ O
8 W; D! E- c. J3 D" U如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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