明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 16733|回复: 37

[VBA]块属性导入到Excel。

    [复制链接]
发表于 2003-11-30 22:05:00 | 显示全部楼层 |阅读模式

  1. 'frmBlock代码

  2. Private Sub CommandButton1_Click()
  3.     If ListBox1.Text = "" Then Exit Sub
  4.     If ListBox2.ListCount = 0 Then Exit Sub
  5.     '返回选中的属性列表
  6.     Dim s() As String
  7.     Dim i As Integer
  8.     Dim n As Integer
  9.     For i = 0 To ListBox2.ListCount - 1
  10.         If ListBox2.Selected(i) Then
  11.             ReDim Preserve s(n)
  12.             s(n) = ListBox2.List(i)
  13.             n = n + 1
  14.         End If
  15.     Next
  16.     If n = 0 Then Exit Sub
  17.    
  18.     On Error Resume Next
  19.     '启动Excel
  20.     Dim xlApp As Excel.Application
  21.     Set xlApp = GetObject(, "Excel.Application")
  22.     If Err Then
  23.         Err.Clear
  24.         Set xlApp = CreateObject("Excel.Application")
  25.         If Err Then
  26.             MsgBox "无法启动Excel,请检查系统!"
  27.             Err.Clear
  28.             Exit Sub
  29.         End If
  30.     End If
  31.     xlApp.Visible = True
  32.    
  33.     On Error GoTo ErrTrap
  34.     '创建工作簿
  35.     Dim xlBook As Excel.Workbook
  36.     If xlApp.Workbooks.Count = 0 Then xlApp.Workbooks.Add
  37.     Set xlBook = xlApp.ActiveWorkbook
  38.    
  39.     '设置工作表
  40.     Dim xlSheet As Excel.Worksheet
  41.     Set xlSheet = xlBook.Worksheets(1)
  42.     xlSheet.Range(xlSheet.UsedRange.Address).ClearContents
  43.    
  44.     On Error Resume Next
  45.     '创建选择集
  46.     Dim SSetObj As Object
  47.     Set SSetObj = ThisDrawing.SelectionSets("BlockCount")
  48.     If Err.Number <> 0 Then
  49.         Err.Clear
  50.         Set SSetObj = ThisDrawing.SelectionSets.Add("BlockCount")
  51.     End If
  52.     SSetObj.Clear
  53.    
  54.     On Error GoTo ErrTrap
  55.     '创建过滤机制
  56.     Dim fType(0 To 1) As Integer
  57.     Dim fData(0 To 1) As Variant
  58.     fType(0) = 0: fData(0) = "INSERT"
  59.     fType(1) = 2: fData(1) = ListBox1.Text
  60.     '选择名称为Name的所有块
  61.     SSetObj.Select acSelectionSetAll, , , fType, fData
  62.     '删除数组
  63.     Erase fType: Erase fData
  64.     If SSetObj.Count = 0 Then Exit Sub
  65.     '输出块信息
  66.     xlSheet.Cells(1, 1) = "块名"
  67.     xlSheet.Cells(1, 2) = ListBox1.Text
  68.     xlSheet.Cells(1, 3) = "数目"
  69.     xlSheet.Cells(1, 4) = SSetObj.Count
  70.     '输出属性标题
  71.     For i = 0 To UBound(s)
  72.         xlSheet.Cells(2, i + 1) = s(i)
  73.     Next
  74.    
  75.     '枚举选择集
  76.     Dim BlockRefObj As AcadBlockReference
  77.     Dim EntObj As AcadEntity
  78.     Dim AttRefs As Variant
  79.     Dim j As Integer
  80.     n = 3
  81.     For Each EntObj In SSetObj
  82.         If TypeOf EntObj Is AcadBlockReference Then
  83.             Set BlockRefObj = EntObj
  84.             If BlockRefObj.HasAttributes Then
  85.                 AttRefs = BlockRefObj.GetAttributes
  86.                 For i = 0 To UBound(AttRefs)
  87.                     For j = 0 To UBound(s)
  88.                         If AttRefs(i).TagString = s(j) Then
  89.                             xlSheet.Cells(n, j + 1) = AttRefs(i).TextString
  90.                             Exit For
  91.                         End If
  92.                     Next
  93.                 Next
  94.             End If
  95.             n = n + 1
  96.         End If
  97.     Next
  98.    
  99.     '删除选择集
  100.     SSetObj.Clear
  101.     SSetObj.Delete
  102.     Set EntObj = Nothing
  103.     Set BlockRefObj = Nothing
  104.     Set SSetObj = Nothing
  105.     Set xlSheet = Nothing
  106.     Set xlApp = Nothing
  107.     MsgBox "转换完毕! ", vbInformation
  108.     Exit Sub
  109.    
  110. ErrTrap:
  111.     MsgBox "出错了,请检查程序!"
  112.     On Error GoTo 0
  113. End Sub

  114. Private Sub CommandButton2_Click()
  115.     Unload Me
  116. End Sub

  117. Private Sub ListBox1_Click()
  118.     If ListBox1.Text = "" Then Exit Sub
  119.     ListBox2.Clear
  120.     '列表框的当前位置
  121.     Dim idx As Integer
  122.     idx = ListBox1.ListIndex
  123.     '计算块的数目
  124.     If IsNull(ListBox1.List(idx, 1)) Then
  125.         ListBox1.List(idx, 1) = BlockCount(ListBox1.Text)
  126.     End If
  127.     '返回块
  128.     Dim BlockObj As AcadBlock
  129.     Set BlockObj = ThisDrawing.Blocks(ListBox1.Text)
  130.     '枚举属性
  131.     Dim AttObj As AcadAttribute
  132.     Dim EntObj As AcadEntity
  133.     For Each EntObj In BlockObj
  134.         If TypeOf EntObj Is AcadAttribute Then
  135.             Set AttObj = EntObj
  136.             ListBox2.AddItem AttObj.TagString
  137.         End If
  138.     Next
  139.     Set AttObj = Nothing
  140.     Set EntObj = Nothing
  141.     Set BlockObj = Nothing
  142. End Sub

  143. Private Sub UserForm_Initialize()
  144.     Dim v As Variant
  145.     Dim i As Integer
  146.     Dim j As Integer
  147.    
  148.     On Error GoTo ErrTrap
  149.     '块名、数目
  150.     ListBox1.ColumnWidths = "50,25"
  151.     '枚举块名
  152.     Dim BlockObj As AcadBlock
  153.     For Each BlockObj In ThisDrawing.Blocks
  154.         '排除匿名块
  155.         If Left(BlockObj.Name, 1) <> "*" Then
  156.             ListBox1.AddItem BlockObj.Name
  157.         End If
  158.     Next
  159.     Set BlockObj = Nothing
  160.     Exit Sub

  161. ErrTrap:
  162.     On Error GoTo 0
  163. End Sub

  164. '计算块的数目
  165. Private Function BlockCount(ByVal Name As String) As Integer
  166.     BlockCount = 0
  167.     If Name = "" Then Exit Function
  168.     On Error Resume Next
  169.     '创建选择集
  170.     Dim SSetObj As Object
  171.     Set SSetObj = ThisDrawing.SelectionSets("BlockCount")
  172.     If Err.Number <> 0 Then
  173.         Err.Clear
  174.         Set SSetObj = ThisDrawing.SelectionSets.Add("BlockCount")
  175.     End If
  176.     SSetObj.Clear
  177.    
  178.     On Error GoTo ErrTrap
  179.     '创建过滤机制
  180.     Dim fType(0 To 1) As Integer
  181.     Dim fData(0 To 1) As Variant
  182.     fType(0) = 0: fData(0) = "INSERT"
  183.     fType(1) = 2: fData(1) = Name
  184.     '选择名称为Name的所有块
  185.     SSetObj.Select acSelectionSetAll, , , fType, fData
  186.     '返回块的数目
  187.     BlockCount = SSetObj.Count
  188.     '删除数组
  189.     Erase fType: Erase fData
  190.     '删除选择集
  191.     SSetObj.Clear
  192.     SSetObj.Delete
  193.     Set SSetObj = Nothing
  194.     Exit Function
  195.    
  196. ErrTrap:
  197.     MsgBox "出错了,请检查程序!"
  198.     On Error GoTo 0
  199. End Function


DVB文件,请使用R2000以上版本打开。


FRM文件


截图

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
jfxia + 1 赞一个!有VLISP版的更好

查看全部评分

本帖被以下淘专辑推荐:

发表于 2023-10-31 10:15:56 | 显示全部楼层
挺好的。楼主是做什么工作的?
发表于 2003-11-30 22:44:00 | 显示全部楼层
呵呵,好玩,不过看得还不大懂。
发表于 2003-12-1 09:15:00 | 显示全部楼层
程序写得挺好懂的。看程序也是学习啊。而且这个导出属性块有时还是能用到的。
发表于 2003-12-1 13:19:00 | 显示全部楼层
挺好的。楼主是做什么工作的?

我做室内覆盖。前段时间(还有你不少帮助呢)在写的时候,也想做成属性块。不过最后写了之后,文件规范化太难。(就是像耦合器,功分器均需按属性块来做,同事们不愿意,觉得麻烦。)最后用其它方法解决,但不准确。
 楼主| 发表于 2003-12-1 13:32:00 | 显示全部楼层
呵呵,是我以前开发的一套有线电视方面的软件,这只是它的一个样图。
用属性块的好处是一个部件连同标注就是一个块,简单,属性修改方便。但是它也有缺点,属性的对齐、位置修改比较困难。
当然具体的应用场合不同,使用的方法也不一样。像这套软件,因为用户的标注样式简单、而且标注的文字位置就这几种,因而可以使用这种方式,我是通过程序全部控制。它自动计算前一连接设备的输出,这一设备的衰耗以及输出,最后自动生成标注,因而人工干预的情况比较少,适合于简单、大量录入的图纸。
发表于 2003-12-1 14:15:00 | 显示全部楼层
efan2000发表于2003-12-1 13:32:00当然具体的应用场合不同,使用的方法也不一样。像这套软件,“因为用户的标注样式简单、而且标注的文字位置就这几种,因而可以使用这种方式”,我是通过程序全部控制。“它自动计算前一连接设备




版主,你好。
      我现在也正在思考如何去完成输入一个总的功率,最后算出每层天线的输出功率。但是总觉得实现太困难。当然,主要是思路上面。您以前写过这种东东,而且和我们也挺相似的。如果可能,我想听听您当时的思路。
      在此谢谢了。

您可以先将您原来的文件(CAD图,EXCEL图)传上来一份吗?
或者发到我的邮箱里:xj_he@126.com  xj_he@163.com
 楼主| 发表于 2003-12-1 20:15:00 | 显示全部楼层
To XJ_HE: 已经发到你的邮箱xj_he@163.com,没有Excel的。

在程序中添加了工具栏,在第一行运行之后,以后启动AutoCAD之后,单击按钮就可以自动加载工程。

本帖子中包含更多资源

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

x
发表于 2003-12-2 09:21:00 | 显示全部楼层
谢谢版主。
程序还得细看。属性块用的相当不错。或者将你的东东细分析,我可以找到自动计算功率的方法。
发表于 2008-10-31 21:28:00 | 显示全部楼层
如果不是块怎么分类计算呢,我们总工做了一个用LISP算钢筋表的程序,好用要死,就是没有源程序,太可惜了,让他给弄没了!!!!!!(A1)10-23D16X1000就这样就能算出钢筋重量来,太厉害了,我是对日做配筋图,小日本的要求太严了,以前同事全是用EXCEL来算重量了,他开发这个程序出来,公司可以少顾二个员工了!!!
发表于 2008-12-19 08:32:00 | 显示全部楼层
楼上的,你们总工可真牛啊!一般总工结构技术好,电脑水平都不怎么要,毕敬年龄都大!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-27 16:49 , Processed in 0.217123 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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