明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1632|回复: 8

[求助]AutoCAD & Excel Excel运行AutoCAD 的代码

[复制链接]
发表于 2010-12-15 14:55:43 | 显示全部楼层 |阅读模式
我要做一个Excel和AutoCAD连接的问题,用excel打开cad并替换一些cad中的文字和标注文字。Excel和CAD各自的代码已经写好,但是不知道如何用excel运行cad的代码,看了一些帖子没弄清楚。
于是我把cad的代码弄到了excel里面,做了一些修改(在thisdrawing前面加了autocad.application.),但却无法运行。红色的代码提示“对象不支持该属性或方法”,刚接触vba不久,清楚的朋友可否指点一下?

代码如下:
Public Sub DrawingTextReplace()
    '尺寸修改
    Dim strResult As String
    Dim Obj As AcadEntity
    Dim oDim As AcadDimension
    For Each Obj In AutoCAD.Application.ThisDrawing.ModelSpace
        If (Obj.ObjectName = "AcDbAlignedDimension" Or Obj.ObjectName = "AcDbRotatedDimension") Then
            Set oDim = Obj
            If InStr(oDim.TextOverride, "L=") > 0 Then oDim.TextOverride = "L=1000"
        End If
    Next Obj
    '文字修改
    Dim TextSelect As AcadSelectionSet
    Dim FilterType(0 To 3) As Integer
    Dim FilterData(0 To 3)
    Dim adText As Object
    On Error Resume Next
    FilterType(0) = -4
    FilterData(0) = "<or"
    FilterType(1) = 0
    FilterData(1) = "text"
    FilterType(2) = 0
    FilterData(2) = "mtext"
    FilterType(3) = -4
    FilterData(3) = "or>"
    If Not IsNull(AutoCAD.Application.ThisDrawing.SelectionSets.Item("TextSelect")) Then
        Set TextSelect = AutoCAD.Application.ThisDrawing.SelectionSets.Item("TextSelect")
        TextSelect.Delete
    End If
    Set TextSelect = AutoCAD.Application.ThisDrawing.SelectionSets.Add("TextSelect")
    TextSelect.Select acSelectionSetAll, , , FilterType, FilterData
    For Each adText In TextSelect
            If InStr(adText.TextString, "大庆") Then adText.TextString = "克拉玛依"
    Next
End Sub

发表于 2010-12-15 20:29:18 | 显示全部楼层
不知道你有没有在VBA IDE里面将有关的类库导入,CAD和EXCEL的VBA类库是不同的,互相使用时一定要先导入。
发表于 2010-12-15 20:34:41 | 显示全部楼层
程序开始处应先建立一个CAD应用程序级的实例,再通过这个实例引用其子类方法或属性等操作。
 楼主| 发表于 2010-12-15 21:06:15 | 显示全部楼层
多谢你的关注~
和CAD相关的库我已经导入了,你说的“程序开始处应先建立一个CAD应用程序级的实例”指的是要用类似于
Dim App As Object
  Set App = GetObject(, "AutoCad.Application")
的语句么?
 楼主| 发表于 2010-12-15 21:10:38 | 显示全部楼层
回复 cuiweimei 的帖子

有点模糊的理解~那和下面的,比如说
For Each Obj In AutoCAD.Application.ThisDrawing.ModelSpace
怎么“连接”呢
发表于 2010-12-17 11:09:14 | 显示全部楼层
晕了,Thisdrawing在VBA里是可以作为独立对象直接使用的,但是作为子对象应该这么写
autocad.application.activedocument.modelspace
 楼主| 发表于 2010-12-17 15:40:56 | 显示全部楼层
本帖最后由 紫罗兰 于 2010-12-17 15:41 编辑

回复 xinghesnak 的帖子

多谢指点!程序按照你说得改了一下,但还是达不到预期的目的,真是不知道怎么回事,能再帮着看一下么?~ 下面是改之后的部分代码:
Public Sub DrawingTextReplace()
    '尺寸修改
    Dim Obj As AcadEntity
    Dim oDim As AcadDimension
    For Each Obj In AutoCAD.Application.ActiveDocument.ModelSpace      
            If (Obj.ObjectName = "AcDbRotatedDimension"  Then
            Set oDim = Obj
            If InStr(oDim.TextOverride, "L=") > 0 Then oDim.TextOverride = "L=1000"
        End If
End Sub
发表于 2010-12-17 21:08:23 | 显示全部楼层
把所有的thisdrawing换成activedocument
并且请注意Mtext的.textstring返回值并不一定是你想要的
他还含有字体数据需要进一步过滤具体参见CAD帮助
 楼主| 发表于 2011-1-7 16:53:26 | 显示全部楼层
这两天回头看看大家的回帖才明白一些,应该是这样的:
Public Sub DrawingTextReplace()
    Dim App As AcadApplication
    On Error Resume Next
    Set App = CreateObject("AutoCad.Application")

    。。。。

    。。。。
    Dim Obj As AcadEntity
    Dim oDim As AcadDimension
    For Each Obj In App.ActiveDocument.ModelSpace      
        If (Obj.ObjectName = "AcDbRotatedDimension"  Then
            Set oDim = Obj
            If InStr(oDim.TextOverride, "L=") > 0 Then oDim.TextOverride = "L=1000"
        End If
End Sub

真是才疏学浅。。多谢cuiweimei,chmenf087 和xinghesnak 的帮助!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 20:16 , Processed in 0.158378 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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