QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 19880|回复: 28
收起左侧

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

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

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

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

x
各位大侠好,我就是想在EXCEL VBA里面运用了一个小程序,可以找开一个.DWG文件,想在文件里面画一条直线,具体操作就是想在EXCEL里面写命令,自动拷贝到CAD命令行运行,有什么方法吗,最麻烦的方法就是在EXCEL写好命令后再手动复制粘贴到CAD命令行中运行
发表于 2008-9-9 10:47:34 | 显示全部楼层 来自: 中国辽宁营口
请参考下面的步骤:
* Y" J1 A+ U! _) @: V6 ^1、在EXCEL VBA编辑器的“工具”菜单中点“引用”,在“引用”对话框中找到ACAD类库,勾选它,确定。见图1* H$ V5 J* t! i* Q" }( ]
Untitled-1.gif
' Q( x: f+ J3 n" ^+ p
. |* k" R7 F0 f$ L5 ]2、用CAD创建一个新文件并保存为以下路径“E:\drawing1.dwg”,关闭CAD程序。
9 C# l. k% v; f/ V- \3、在EXCEL工作表Sheet1的A1单元格写入CAD文件路径“E:\drawing1.dwg”(没有引号),在B1单元格写入准备发送到CAD命令行的字符串“L 0,0 100,100  ”(没有引号,注意其中有四个半角空格)见图2。
6 d# q* }/ ^9 f! v, S1 K5 p Untitled-2.gif
* s; D+ w. Y) y
  P" P1 i7 e  a5 \% B% _4、在EXCEL VBA编辑器Sheet1对象代码窗口写如下代码
# D5 w" [9 g9 d-------------------------------------------------------------------------# z& Y& U& G0 Q  w
Sub A()
2 b. q8 M: g; ~+ x) \/ L; g    Dim CAD As AcadApplication, DOC As AcadDocument% D9 U3 z0 G0 }9 j
    Set CAD = New AcadApplication
7 _0 j& _5 d: Y    CAD.Visible = True
; ]0 j5 ^6 z4 j1 Q8 d, _    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value)% h% ^2 a* I: u9 T" r, l5 p
    DOC.SendCommand Sheet1.Cells(1, 2).Value
- }7 r/ p6 s" x; P7 h! wEnd Sub
  D" ~( Q% j8 F-------------------------------------------------------------------------6 t% E4 m/ x& I7 A
见图3; K3 n1 m- h" z& q6 [
Untitled-3.gif
. I. I7 r0 c4 ?1 L) I! m
0 u$ f4 T% p- L3 G5、在EXCEL界面运行宏,见图4! {% H9 ~/ R$ H3 |/ X) V9 I
Untitled-4.gif
' q5 {- ^/ M& D) P% Z
9 H; O& v6 |& I6、EXCEL按A1单元格中的文件路径打开了CAD文件并按B1单元格的命令在其上画了一条线。见图5
' U! M/ A+ H% E% x5 y; O: 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# 的帖子

上面的代码改一下
( l6 K7 J  t2 r1 E3 ?---------------------------------------------
( n7 Z9 Q7 e' ySub A()4 V% D3 \2 K5 h" G& Y
    Dim CAD As AcadApplication, DOC As AcadDocument: h2 n- c7 |$ |8 H4 o, C
    Set CAD = GetObject(, "Autocad.Application")+ o/ {4 b7 a/ A, g' V
    Set DOC = CAD.ActiveDocument2 M& W/ p6 C, l% J# \
    DOC.SendCommand Sheet1.Cells(1, 2)
* w7 x* F3 R9 H8 K. k( `End Sub
) M: x/ P0 W  ]4 I# r4 J) E---------------------------------------------
% }$ a: F8 f$ q+ |本版置顶帖CAD三维及二次开发子版区资料汇总--求助前请先查阅该贴(参与有奖) 中有关于CAD的VBA的资料链接
  A% U4 Q) m: f: R* y' z+ x& Z  k5 u; `. `8 F
[ 本帖最后由 woaishuijia 于 2008-9-9 15:53 编辑 ]
发表于 2008-9-16 00:03:17 | 显示全部楼层 来自: 中国江苏无锡
要是逐条读取A合B如何修改?
# Y* {5 w  \, }# I9 w/ a6 g
( C1 W2 _$ x8 T* K) r[ 本帖最后由 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
! n+ k! h1 y2 f2 r* s6 R8 p5 \不太理解你的意图,能否再说得详细些?
, E" g0 m( d" g8 E! D$ S
就是循环读取A1(图名),对应执行B1(CAD命令),直到至An和Bn, 当n+1行空时退出循环。这样就变成一个批量修改的脚本执行工具了~
2 w- @- D- r7 S# D/ a0 _
; ~: p% @1 _. ^& f. O[ 本帖最后由 www1974 于 2008-9-16 10:57 编辑 ]
发表于 2008-9-16 11:35:10 | 显示全部楼层 来自: 中国辽宁营口

回复 9# www1974 的帖子

代码可以这样写) b7 m, |8 H. A9 l7 b! W
-----------------------------------------------------5 z2 @: Y- C  L. K9 r# w9 C
Sub A()
! N, X5 Y: y4 m" ]' T    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer; _5 x! I. y1 p- x! J
    Set CAD = New AcadApplication
- Y) Z9 }( B% b- i    CAD.Visible = True
- b7 j, h  p6 b    I = 1
; A1 I  t7 R2 b) X; Y    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = ""1 ^4 Q. J' H! P" s( ^& y" ?
        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value)5 u" x* T+ U3 ^! ?5 }# k
        DOC.SendCommand Sheet1.Cells(I, 2).Value2 M: b+ F; A  z  j9 \( \1 d
        DOC.Save
* e0 s; ~5 _( |/ [1 m        DOC.Close! y, {6 X1 R: o1 u/ r2 ]( X$ M- A
        I = I + 17 o& O: \; y$ }3 @' a
    Loop
# n" A. f5 z7 L0 q$ u, h! _# o    CAD.Quit
% A* T& }. P9 @' x) uEnd Sub3 H4 O+ ]  G6 b& {0 t! c5 g$ _
-----------------------------------------------------------------! H0 O, p" |! E0 A8 I
运行宏后,EXCEL首先运行CAD程序,然后检查A1和B1单元格是否空格,如不是就按A1内容打开DWG文件,按B1内容执行CAD命令,然后保存并关闭文件,再检查A2和B2单元格。。。。。。直到An或Bn单元格出现空格为止,最后退出CAD程序。+ }7 R5 q( ~) E+ e4 @. 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/ d: V- o3 N* g8 E
代码可以这样写
3 R9 A4 T- H, V) T: o( g-----------------------------------------------------: X1 x9 f* p6 {( N" j
Sub A()
. g9 t: n3 q+ j- `9 F$ p    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer- A0 V" l$ U+ t! l# m
    Set CAD = New AcadApplication
- K4 f$ B0 K$ y2 o5 `( }    CAD.Visible =  ...
( F8 [" B" ]  s, a! A5 o

* ^/ ^: p% d# J  k: v学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
发表于 2008-9-20 16:30:10 | 显示全部楼层 来自: 中国江苏徐州
高人。学习了 )19*(
发表于 2008-9-22 14:37:01 | 显示全部楼层 来自: 中国江苏苏州
学习中,老师能在旁边写上注释嘛?我还是有不能理解的地方!0 {5 b9 H  U0 |* V
因为你们,我对二次开发越来越有兴趣了!
发表于 2008-9-22 19:05:27 | 显示全部楼层 来自: 中国

回复 13# 上山蜗牛 的帖子

2楼代码注释8 i" ^$ L' h# G% [3 w: r: C8 d; u
----------------------------------------------
4 O: M! a/ F6 G  h' A5 TSub A()
5 _6 U8 U% m4 Z* ]% S8 H    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象/ `0 X: n' q0 i6 C
    Dim DOC As AcadDocument '声明AutoCAD文档对象2 W' F" \; ^% p# z6 j: F7 A" @
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
' n* N  U% W$ N    CAD.Visible = True '使运行的AutoCAD程序可见。如果没有这行,程序将不可见,就是说看不见CAD窗口,只能在Windows任务管理器看到有CAD程序运行。
2 y, `/ b+ L1 m# h" ]. m! s& L    Set DOC = CAD.Documents.Open(Sheet1.Cells(1, 1).Value) '按照“Sheet1”工作表第一行第一列单元格的内容打开文件
) f! _: ^* O% G    DOC.SendCommand Sheet1.Cells(1, 2).Value '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令# I6 E2 @# m' p0 x; H7 r
End Sub
) R0 u0 i' E% y. x) ~----------------------------------------------
0 \; S' q3 i. p% A  D0 M. a* C# {- I; A' D  s. i
6楼代码注释8 ]1 H' Y" I" G8 M
----------------------------------------------
! |* v" _' v6 H. G3 HSub A()
& ^8 i0 F, x3 N5 t1 X' F- }9 k    Dim CAD As AcadApplication, DOC As AcadDocument '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象
, M% D+ [9 Y! X# t* _/ z) S    Set CAD = GetObject(, "Autocad.Application") '获得一个已经运行的AutoCAD程序(如果已有多个CAD程序运行,则得到第一个)
: B* h3 S6 `, ?# Z  C7 Y    Set DOC = CAD.ActiveDocument '在该CAD程序的当前文档上做下面的工作: E" Z  i' Y0 A
    DOC.SendCommand Sheet1.Cells(1, 2) '按“Sheet1”工作表第一行第二列单元格的内容向CAD命令行发送命令
: \7 K0 o' G1 fEnd Sub4 X* h* q, ^8 E9 ~
----------------------------------------------# e2 o, d/ ?. k4 X( J. }
) K! E& e6 d4 ]* Q0 j# b
10楼代码注释* i" W4 w) a: L3 W  K0 E
----------------------------------------------1 q7 t1 g! i- T9 f
Sub A()
! {6 `: `7 V: a9 r) [% e    Dim CAD As AcadApplication, DOC As AcadDocument, I As Integer '声明一个AutoCAD应用程序对象和一个AutoCAD文档对象,还有一个循环变量(就是计数用的)8 j. H- c0 m. M) p5 j& {2 t' i
    Set CAD = New AcadApplication '运行一个新的AutoCAD进程
. A2 @) u5 ]4 Q: R3 P    CAD.Visible = True '使运行的AutoCAD程序可见
5 n7 S1 {# e. ~* @    I = 1 '从工作表的第一行开始计数
% I" W% f+ g1 X( u( d    Do Until Sheet1.Cells(I, 1).Value = "" Or Sheet1.Cells(I, 2).Value = "" '下面用循环反复(逐行)检查单元格的内容,直到单元格内容为空
- ~' S+ R* s) V/ ?0 t; L        Set DOC = CAD.Documents.Open(Sheet1.Cells(I, 1).Value) '按照“Sheet1”工作表第I行第一列单元格的内容打开文件, p. G; ~( z) j8 P7 i" f# f1 O
        DOC.SendCommand Sheet1.Cells(I, 2).Value '按“Sheet1”工作表第I行第二列单元格的内容向CAD命令行发送命令
% Q% e! y- b% x        DOC.Save '保存文件8 x& o! s% d  U; j, V" g# ?
        DOC.Close '关闭文件
" a+ a1 [& N+ Q# o4 q; Y( W% i, j5 p        I = I + 1 '计数加1$ \4 _; G) X5 d" `0 f
    Loop '返回DO那行,检查下一行单元格内容是否为空,如不为空,就重复执行上面五行,按下一行的内容打开、编辑、保存、关闭文件。。。。。。+ }' Y( n1 w7 Q! ~6 ?
    '如果检查结果为单元格内容为空,就执行下面的语句3 B+ q, c  R+ Y( q; }6 Q/ h
    CAD.Quit '退出(关闭)CAD程序
0 p- C) n: n# |5 L$ ~) H9 hEnd Sub
2 ~0 S7 i) y8 w+ @* r# k----------------------------------------------
发表于 2008-9-23 07:55:40 | 显示全部楼层 来自: 中国江苏苏州
早上上班就来看有没有回复~真好!1 d7 r$ c+ J$ c$ k" H
版主说说看vba、lisp这两个到底怎么个差别( f5 s# }" D' Z

0 l' r, p/ L- v* i9 x5 g[ 本帖最后由 上山蜗牛 于 2008-9-23 07:57 编辑 ]
发表于 2008-9-23 08:11:55 | 显示全部楼层 来自: 中国辽宁营口

回复 15# 上山蜗牛 的帖子

请看这个帖子
, v0 Q( ^' A, m选择AutoLISP还是VBA?(转贴)
发表于 2008-9-24 13:00:17 | 显示全部楼层 来自: 中国江苏无锡
原帖由 woaishuijia 于 2008-9-22 19:05 发表 http://www.3dportal.cn/discuz/images/common/back.gif1 A6 o; ?) K/ C* k
2楼代码注释' w. u9 D' g3 J' a6 Z7 N
----------------------------------------------
, J. a0 N1 y# {5 P, BSub A()+ ]2 u* E/ m  Z6 X
    Dim CAD As AcadApplication '声明一个AutoCAD应用程序对象2 g3 W/ ]: X1 C" c
    Dim DOC As AcadDocument '声明AutoCAD文档对象
" ~3 Q# e% g$ K" b2 Z8 t5 l& B    Set CAD = New A ...
* M" l4 A$ T* H
如何把这个转化到VB?希望斑竹能做个gif~多谢了。
发表于 2008-11-13 21:52:43 | 显示全部楼层 来自: 中国云南昆明

请教高人

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

回复 18# piaoyun1 的帖子

文字命令不支持空格结束,就需要在EXCEL表格里加上回车,方法是Alt+Enter。6 N0 e' |5 U6 m$ P, E
实际上字符串中的空格(实际也是回车的意思)也可以这样。
: U$ Z* u! b( N) y另外,按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.gif7 B4 z# \) `) S* `

9 J% a* S) u5 N! k( q" ?/ a" B
1 V) Q5 k" I7 L2 N3 c; C6 p* D+ V学习了,多谢。这个可以简单处理文本比较合适,比如修改图纸编号等等,因为我的图纸都是一张一个文件,量比较大,不过问题也比较单一。
# `  O. s( [# T: r3 K4 S2 t

; u8 m* K$ b, ^9 v2 p
  d1 L. Z3 Y, C6 k真是太强了。我现在正有两套样机图纸的覆盖图要画,都是批量的图样编号要修改。
发表于 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程序的当前文档上做下面的工作
' M6 x, r( V9 ?2 w5 J
3 A5 j: w- V; Z4 U7 f- N: Z: [如果是多个cad文档,如何指定其中一个并赋值给DOC呢?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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