找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1306|回复: 12

[VBA程序]:块属性导入到Excel中示例程序

[复制链接]

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-11-30 22:14:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×

  1.   [FONT=courier new]
  2. 'frmBlock代码

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

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

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

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

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

  165. '计算块的数目
  166. Private Function BlockCount(ByVal Name As String) As Integer
  167.     BlockCount = 0
  168.     If Name = "" Then Exit Function
  169.     On Error Resume Next
  170.     '创建选择集
  171.     Dim SSetObj As Object
  172.     Set SSetObj = ThisDrawing.SelectionSets("BlockCount")
  173.     If Err.Number <> 0 Then
  174.         Err.Clear
  175.         Set SSetObj = ThisDrawing.SelectionSets.Add("BlockCount")
  176.     End If
  177.     SSetObj.Clear
  178.    
  179.     On Error GoTo ErrTrap
  180.     '创建过滤机制
  181.     Dim fType(0 To 1) As Integer
  182.     Dim fData(0 To 1) As Variant
  183.     fType(0) = 0: fData(0) = "INSERT"
  184.     fType(1) = 2: fData(1) = Name
  185.     '选择名称为Name的所有块
  186.     SSetObj.Select acSelectionSetAll, , , fType, fData
  187.     '返回块的数目
  188.     BlockCount = SSetObj.Count
  189.     '删除数组
  190.     Erase fType: Erase fData
  191.     '删除选择集
  192.     SSetObj.Clear
  193.     SSetObj.Delete
  194.     Set SSetObj = Nothing
  195.     Exit Function
  196.    
  197. ErrTrap:
  198.     MsgBox "出错了,请检查程序!"
  199.     On Error GoTo 0
  200. End Function
  201.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 181个

财富等级: 日进斗金

 楼主| 发表于 2003-11-30 22:14:40 | 显示全部楼层
贴图。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

 楼主| 发表于 2003-11-30 22:17:39 | 显示全部楼层
晕,竟然不能传多个图片,会覆盖前面已经上传的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

 楼主| 发表于 2003-11-30 22:18:23 | 显示全部楼层
呵呵,这招总可以了吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-1 08:39:32 | 显示全部楼层
厉害,老大,都写出来vba的了,我也拿来用用:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-9 02:00:34 | 显示全部楼层
非常感谢斑竹的帮助!我不知到要安装哪一个软件才能看到图片,请继续帮助我。我是一只非常笨的老菜鸟,请不要笑我,请帮助我。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-9 05:56:24 | 显示全部楼层

Re: [VBA程序]:块属性导入到Excel中示例程序

最初由 efan2000 发布
[B][CODE]
  
'frmBlock代码

Private Sub CommandButton1_Click()
    If ListBox1.Text = "" Then Exit Sub
    If ListBox2.ListCount = 0 Then Exit Sub
    '返回选中的属性列表
    Di... [/B]


好程序!

请楼主最好完善一下,使得块属性—Excel双向可导,即将块属性导入Excel,并在Excel中修改后再返回CAD中。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-12 00:06:09 | 显示全部楼层
真的很感谢,我正需要这些资料,感激到无言!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-25 23:27:34 | 显示全部楼层
程序好长啊,一下子真不好理解。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-28 02:10:24 | 显示全部楼层
我把程序拿回去试,不懂的来问!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-30 21:03:25 | 显示全部楼层
我正在找,实在是太感谢了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3532个

财富等级: 富可敌国

发表于 2004-1-28 18:38:56 | 显示全部楼层
感谢斑竹提供!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-1-28 21:03:58 | 显示全部楼层
虽然我不懂vba,但是也鼓励支持一下。编程真不容易啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-26 00:46 , Processed in 0.366080 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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