QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:' B' ~( q2 d* `! ~* d+ K# u' ~
1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1, t9 O* N& U% m% s& l  _
Untitled-1.gif $ B" l+ L! v4 i* X% U2 q0 S

/ w/ g9 N2 \+ Q: p& q* N2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
5 v, `. x6 `9 J1 }2 E. k3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
9 t: [4 a; A2 D+ D& q3 P Untitled-2.gif
  l3 u: i0 ?4 Y7 I2 {4 v$ m* g+ t/ T
4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
1 M& {; H% }) w-------------------------------------------------------------------------$ B5 b6 L$ q3 j3 B7 {- R* X- m/ n/ {
Sub A(), o- N& d0 I+ [) i
    Dim CAD As AcadApplication, DOC As AcadDocument# Z! }% @, I( O/ z! ~/ s
    Set CAD = New AcadApplication; D. C. z2 o' ]+ L7 R6 m; J
    CAD.Visible = True! _5 G9 g; d+ f$ V- ~
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)) z' b7 N$ o4 b7 K# R; `$ N: @
    DOC.SendCommand Sheet1.Cells(1, 2).Value) H5 K" O* k& A: d# h1 e5 D
End Sub
$ f% g; a1 Q8 l, E, R-------------------------------------------------------------------------
% Z0 C9 `6 G8 e见图3
4 c: R' t) @& b Untitled-3.gif
3 ?. ~! {( N& V5 U5 D& }4 n
* q0 u: d) e1 |# H! n5、在EXCEL界面运行宏,见图4
, n6 r' i# d% ]% r  u Untitled-4.gif
& h) K' S% n1 J, V) g% A5 p, j. C: `+ Q* \
6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
4 }* s1 F3 N' y, e( x2 w! \ 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# 的帖子

上面的代码改一下" V' I5 m5 y+ i3 _
---------------------------------------------. O  I# Y; p! z4 i: ]( c
Sub A()
. u( f8 |/ K8 r    Dim CAD As AcadApplication, DOC As AcadDocument
* I" J+ n1 D+ P6 E- `    Set CAD = GetObject(, "Autocad.Application")# L! \, ]" Z  {: {: o1 P
    Set DOC = CAD.ActiveDocument
6 P2 {6 g1 E* Y/ ^' X) ~. m6 q! W    DOC.SendCommand Sheet1.Cells(1, 2)
" }1 y# ?0 b: j# _3 EEnd Sub
1 x  M# l2 u6 _4 ^, U  j0 S: J---------------------------------------------0 D4 W! }$ B! W! S
本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接2 x, L$ d8 Y. A( [" y6 f

! X8 w9 i# B$ s6 y% Q[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?  S' d4 f) X9 n* Z* O
( w5 G3 m0 c9 s- `( 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% b- {& L( l9 ~$ ~3 U: x2 E
不太理解你的意图,能否再说得详细些?

4 Y  c% C. Y: e" K; t/ t) B就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~% J  O3 F6 ]# }1 p
, _' J- L6 X! o9 W$ N: H
[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写' Z. y3 \' v$ b0 O6 p( G; i% H
-----------------------------------------------------0 m4 [, F$ P  V# O
Sub A()
' u  F3 P+ A/ A: X: L5 M    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
5 ?3 q6 p% Q: A- E+ A: j# x    Set CAD = New AcadApplication
; E! p1 W# A4 ]: m" b    CAD.Visible = True  w7 f9 |8 f2 V4 y* Z. E
    I = 1
$ S- g9 z) t: {1 w' k/ z! Z/ A) T    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "". d6 i+ i# z( D( ?8 |
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)
# r+ [; F/ b5 C% h! @8 k        DOC.SendCommand Sheet1.Cells(I, 2).Value
& M0 _8 ?6 ~" I5 p7 G/ v9 w+ w7 T& B        DOC.Save
5 i* Q: |4 `/ F# `) Y' Z        DOC.Close: C, k4 }1 ^& D3 M# L) B
        I = I + 1
5 x  |/ m4 y- G! E* h  Y; w    Loop
$ D7 f! P" @$ t2 c( q' p2 q  r/ D    CAD.Quit
! }& j( R5 N6 i1 |8 l7 CEnd Sub" a/ |# `" m1 ~% l2 d9 k
-----------------------------------------------------------------& U) V' Z4 A2 R% {
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。& T" E/ F3 ]6 g1 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
: V! C( `2 q. ?代码可以这样写4 B" G, l- @  H& x! R4 d) U
-----------------------------------------------------% d$ `. T: q6 J9 p6 X
Sub A()
7 R4 W6 y/ X8 C' O+ T/ i    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer
( {9 e/ e6 `  J; f* [1 w    Set CAD = New AcadApplication1 o7 C/ f" y% D+ M$ @9 ~% E
    CAD.Visible =  ...
5 S7 W. O5 V$ Y$ R9 K
: k# {' z; n& D1 ?
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!
  W# p0 [) t$ K! J因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释: |. L8 r. Q2 e2 ~( R5 o& O" ?
----------------------------------------------
" P* _  u9 ]7 L) P3 Z1 ~& @Sub A()
4 d/ o. w; d8 V: R    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象
; M9 H+ V: I/ ?# n) p0 p6 X    Dim DOC As AcadDocument '声明AutoCAD文档对象
) ~) k5 ]" ~! |8 k    Set CAD = New AcadApplication '运行一个新的AutoCAD进程5 Q/ M2 R" ~) p6 j+ t
    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。6 H9 |$ [* O" L+ L$ `
    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
$ ?5 \3 r' T9 q& ~2 }, Z    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令/ Z# [# A- A- I* K" s- M" C- H! w
End Sub
+ J" ~7 F. l6 l: ?----------------------------------------------! y7 ]- I9 f5 Y4 R) \. B
1 v% ~- x8 K0 e3 |  @/ k
6楼代码注释
( {5 T3 }1 U4 m3 I! l----------------------------------------------+ }0 o4 {/ ]2 v$ Q3 l% z& r& h
Sub A()
+ W8 C8 g5 x" ?$ a    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象, ^% E: E. Y1 K5 D
    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)* b5 [# V, O6 Y) F/ ~+ M5 g0 _
    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作
4 c' M$ x# h1 I- k7 _    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
3 A+ I- c' o& Y$ `End Sub  ]! u/ q3 N' K; d6 B( Q
----------------------------------------------
* l. l. E5 T9 Y5 y- N( x
- D& k3 _2 V- j2 s) w% M' m0 J10楼代码注释
( k% q" Z. @/ v! ]0 {. d* u----------------------------------------------
' ^9 A( y. F- p/ g- i* w; G7 ASub A(): n$ A" f/ T* V0 B9 @, K
    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)
8 X7 Q. w0 `! t! c5 E; P  m7 ^    Set CAD = New AcadApplication '运行一个新的AutoCAD进程0 L% h2 j+ m7 o
    CAD.Visible = True '使运行的AutoCAD程序可见
2 Z, e% H3 K! Q) _* Y. x" k6 L    I = 1 '从工作表的第一行开始计数# Q6 S- I2 n( ]% k0 e
    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空4 K0 g5 `' w( z$ U, x  S
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件
0 N: G% F: q8 ^        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令0 y7 X" T5 x/ r& E8 r- B. a7 ^
        DOC.Save '保存文件4 U7 v5 w; V* r1 B& A8 M
        DOC.Close '关闭文件( b9 B; x' Z! E1 u+ Q
        I = I + 1 '计数加1- f& X+ d" x# j
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。1 v" T$ |. a7 n6 o
    '如果检查结果为单元格内容为空,就执行下面的语句5 d$ }. T- F+ k3 H! m) _5 K
    CAD.Quit '退出(关闭)CAD程序
0 o, {6 a- h& J( |. fEnd Sub. q/ z5 Q1 I7 Z% r9 |) f+ N$ u
----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!9 U  v. ^, t1 B% M9 c& M. y& ?
版主说说看vba、lisp这两个到底怎么个差别
0 @) `+ U6 y( y" L) }2 z
- u6 \$ L0 K6 H3 F) K[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子8 y' M3 }  g) E- I% y5 N
选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif; v: C  M$ n- Z$ s4 q
2楼代码注释* O7 c7 Z+ ~* m! x1 n& ]' Z
----------------------------------------------
0 D6 f9 [3 Z) P+ FSub A()" {. ?$ |5 |& j, G* f5 M( y
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象* k" [. m% A" ~
    Dim DOC As AcadDocument '声明AutoCAD文档对象
; p" d2 s" Y* l, k( r    Set CAD = New A ...

* c9 |6 n6 Q  ~$ H( k5 c8 H& Z. g如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。
% e7 H2 D! ^- B实际上字符串中的空格(实际也是回车的意思)也可以这样。
$ k! E& y& |) F! q6 r! F( }2 n0 p) P7 k另外,按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
* e) R& }* N5 P4 f  v* m& q6 g) R5 ?5 w
* Q, g0 m# L/ u4 C( D$ |) V9 o" k: P3 R/ s
学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
5 K: l: F$ q0 G2 U9 B
* P4 ~, b6 ^: f) h- [0 K8 T
! k5 R3 B4 l9 g8 i1 {  E
真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作! {- l: D7 @* L3 @) S0 [
3 v* b8 ~. D* M8 p# [( Q5 T
如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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