QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
10天前
查看: 19801|回复: 28
收起左侧

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
  m, d$ \/ E. v" \. y1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1) I! J! h% H( I. A: Y9 L
Untitled-1.gif
0 f2 K. s( |# v- \  q7 C  N0 e% J- U! g1 ^
2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。: t0 D$ j8 [6 ?; v
3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
) C7 |* P' M% o: v; R. ?# }$ t Untitled-2.gif
1 S( r) G1 L! @, f0 m1 k, j, P- x# `: o6 C" i. M$ _
4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
) l+ d5 u' n: ?/ E7 `# B& q-------------------------------------------------------------------------
' Y: U( Q" _/ S- z9 @, s; O& ESub A()
8 G4 Y7 a: t4 \" [7 X) T( i! i    Dim CAD As AcadApplication, DOC As AcadDocument
- f  Z) p5 d- F; V, l: W    Set CAD = New AcadApplication* j0 y& N3 G$ [2 z, g
    CAD.Visible = True
+ Y& }* R3 ^0 p% C, p7 v5 b1 C9 A    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)% Z, A7 ?# ~% r) p+ Z( L9 d
    DOC.SendCommand Sheet1.Cells(1, 2).Value; W2 f8 ~/ ~3 E; Y5 n
End Sub
. p5 H2 v/ p/ x: A-------------------------------------------------------------------------
1 g( e8 D8 s# E0 a3 [见图3
0 j3 E/ d  D" Q7 L, ] Untitled-3.gif 7 o4 [  ?9 [* ]/ F

# t& L, i% @9 u' D4 \5、在EXCEL界面运行宏,见图4
, Y' W! _  V) h5 S$ F- f! Z Untitled-4.gif
4 C. U) G+ i& M! z- P& m* E) x) H" t7 k! M4 Q
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
% j0 s/ m4 n% m! \ 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; }) O: m  u6 f---------------------------------------------* m: B9 m7 [! T! \1 S7 u0 R
Sub A()
# d: ]1 @2 I' B- k' l    Dim CAD As AcadApplication, DOC As AcadDocument
9 E) H2 x$ N2 i+ I    Set CAD = GetObject(, "Autocad.Application")
! B) Q3 w9 C/ m6 K    Set DOC = CAD.ActiveDocument9 h' w' J# b1 q! I$ w
    DOC.SendCommand Sheet1.Cells(1, 2)
3 o0 @) d. ]2 r5 N7 h, tEnd Sub& f& z4 r, S/ T# d. [6 A
---------------------------------------------* o$ {5 u# y3 `4 b  w/ e! o- h& {
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
' Z. P+ a8 V/ `1 ~0 e$ W# {
' C3 R- D! l. O: C[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?+ l: B" H+ x0 \. y, a3 [

! m# ^# z* X5 l* B( p3 \$ H1 ^+ 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.gif
* ~2 ^8 p, P' c7 a% Z# w! a不太理解你的意图,能否再说得详细些?

: f# V; S- Q3 w, N0 _6 r. F6 o就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
. e7 n) ]6 F5 S$ }6 U; Y; K/ {" I, n& h. k( S9 l% Y* A" w6 q
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写
, o& i& L! Z" ?6 |) }-----------------------------------------------------
9 `; v. z* z. ]7 M+ Q# DSub A()% W* Z4 u, _; J/ e
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer' d" k8 Y% @$ Y8 D3 @2 b, ^) b
    Set CAD = New AcadApplication/ J: R. S) y( L5 n
    CAD.Visible = True
% j$ z8 D% |! _' l! u+ _; T' `    I = 1/ S, O5 g5 X5 N1 [6 x2 @  s# Y
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""
8 w& d5 {$ j5 i3 R2 G3 @( W        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
% o3 K0 _# J% X: r$ D4 N        DOC.SendCommand Sheet1.Cells(I, 2).Value
. @, Z- |- n+ e8 t+ P( |+ Y/ D        DOC.Save0 |( ]9 G7 S/ J5 K* ~- o  V
        DOC.Close
, n8 {0 o) E6 c; x3 @        I = I + 1
( ~  a* ^8 b0 Q; P' T    Loop8 {. `2 B4 n- G) \5 q
    CAD.Quit& d5 g9 ^9 P* E. Y3 F* L
End Sub
& P+ v4 x! l2 J# e9 z% ]6 \-----------------------------------------------------------------
9 ?* i. F0 h. q6 b6 A运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。  K6 G' Y- D+ X, y% [5 l5 j
本程序仅供参考,其运行的前提条件是A*单元格中的DWG文件必须是真实存在并且不能是只读的;B*单元格中的命令和参数字符串必须是完整、准确的。否则应该在程序中添加错误处理内容。
发表于 2008-9-16 12:50:34 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-16 11:35 发表 http://www.3dportal.cn/discuz/images/common/back.gif
8 N& {- K  G# B& e1 K$ x& D1 N代码可以这样写
- H" e1 L  U* Z& X+ Z7 E& m- r/ |-----------------------------------------------------& }- Z$ O9 u3 z0 p' g5 m
Sub A(); `# m4 C$ C6 D2 f& k- O7 b" n1 c( S
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
# Q( _3 l: @1 ?( L! E    Set CAD = New AcadApplication
! l3 F+ I) H; w3 D- q1 b0 s    CAD.Visible =  ...

, M) X+ z' K$ }& P$ V' I' y, L2 q* v" w* c* W8 ~* }& n9 K
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
; d6 s$ B9 }# z因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释
- ~) {: J" i8 |# m  \----------------------------------------------9 O! _* p! R) W7 C9 m
Sub A()
5 e0 n* ^4 v: J* U1 U4 ^8 ?4 A    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象. k: o$ |" L2 S6 _$ T! R
    Dim DOC As AcadDocument '声明AutoCAD文档对象! L( |/ p: F4 ?- U$ ?% |
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程. D6 z! N3 o+ W: l
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。4 c( Z( [6 J7 F7 m
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件9 H" z: R, _& r1 _
    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
$ X2 h* Q0 l5 n0 @0 w  b4 u" REnd Sub
. ]) s" @, ]) E8 r5 ~----------------------------------------------
. f" Q3 M+ Q+ ]
9 g) M. H/ g2 i5 c6楼代码注释
2 s4 B5 q7 M6 N, z. ^9 Z& D----------------------------------------------
$ H0 ^- x7 ~' V7 W7 {4 GSub A()$ }/ Y# h0 _; e# f
    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象! P4 w! X! d6 _& f8 u7 Y
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)7 r& E/ }0 u- w' m8 r2 V- ^
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作. Y+ ~# p$ l  a6 W- L
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
3 a1 d- N7 B$ f2 l: u& w6 dEnd Sub& m5 @* D2 i0 v
----------------------------------------------. c8 v6 {$ Q2 ]( u) W+ \$ i
3 y4 j# M1 l3 u) e- H5 E) |
10楼代码注释* a% t# f5 i3 C& A2 {
----------------------------------------------/ j# G9 z; F" G, Y. }, Q7 D+ F9 \
Sub A()
3 a' K3 [, p1 n" L4 B    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)- ^5 |1 _; y! e5 k/ a* k
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
/ N9 h" m4 ]+ E    CAD.Visible = True '使运行的AutoCAD程序可见
. h' R, K, v! ?0 m# F" I% E& l( o    I = 1 '从工作表的第一行开始计数4 m/ @4 }. x# _: X( }
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空* I/ S. \: M2 [; C6 K5 r- M
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件( ~: |. y( |# n) p: l1 I* M6 y
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令% a8 ]1 P; `0 m0 }
        DOC.Save '保存文件% l! `/ X% P! _9 y* E
        DOC.Close '关闭文件
$ r9 L; p9 D, I        I = I + 1 '计数加1" c  c0 ~. ~% c' {
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。
* ~' J+ }: ?3 ]* R    '如果检查结果为单元格内容为空,就执行下面的语句
# O5 V! D- q8 m6 O  {9 \5 p! F4 G    CAD.Quit '退出(关闭)CAD程序
/ r# A7 [* t5 _7 P) N6 }) ?End Sub& B5 U; l  h# g
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!
1 P  y) D3 E5 U* f; ?3 H. Z版主说说看vba、lisp这两个到底怎么个差别
& n, @, w) V: y6 m/ B, J9 \. I) I- i1 p. e3 y/ ^( H
[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子; Z& `$ P, N( x* j' h+ }4 a& N% t
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif
  ~- v9 n, H- s* `- P( X3 F: x" J2楼代码注释; z5 q7 e/ g  a- n4 d& u9 {6 i8 H7 F
----------------------------------------------
6 O% X3 G5 _3 e' N8 W1 I" JSub A()- c( i$ z/ a$ l! |; p' _1 W1 T
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象$ n: F7 h& y  \1 J& G/ y3 A2 q9 }
    Dim DOC As AcadDocument '声明AutoCAD文档对象
6 l8 o+ @2 Q" V1 U    Set CAD = New A ...
0 S2 \. a. Q7 @: j: J1 K% X- r' w
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
7 O2 l" m% z8 C6 L实际上字符串中的空格(实际也是回车的意思)也可以这样。' d- s; Z$ W" J/ g4 K- N& G! 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* a1 F! y' z) r) l

! u4 a6 ~0 T0 V" y. t1 [7 \3 o& h( C0 ], u
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
9 |' V( R: m) U( U; I" l2 i0 i6 @
+ K% H  N. h5 }' z

" e: E3 u# x+ q8 V# [真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
2 K3 Z9 ?0 F4 R! S2 G: s# f% F( X; H: k2 X( R
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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