明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2416|回复: 9

VBA提取CAD的表格,别人做了很多类似的

[复制链接]
发表于 2020-8-2 11:42:45 | 显示全部楼层 |阅读模式
因为没有代码可供复制,某宝上面买了个教程,刚好抄了一段判断选择集是否存在得我函数代码。
没什么说的,需要注意的是要保存为DVB文件,然后再DVB的所在路径下新建一个Excel文件(名为“提取表格”后缀改为xlsm,工作表名为“提取表格”)
直接粘贴代码吧:
  1. Option Explicit
  2. Public excelapp As Object
  3. Public excel As Object
  4. Public lj As String
  5. Public Function createSSet() As AcadSelectionSet
  6.     On Error Resume Next
  7.     If Not IsNull(ThisDrawing.SelectionSets.Item("mySelectionSet")) Then
  8.         Set createSSet = ThisDrawing.SelectionSets.Item("mySelectionSet")
  9.         createSSet.Delete
  10.     End If
  11.     Set createSSet = ThisDrawing.SelectionSets.Add("mySelectionSet")
  12. End Function
  13. Public Sub tqbg()
  14. Dim lj As String
  15. Dim ex As Object
  16.     lj = VBA.Left(ThisDrawing.Application.VBE.ActiveVBProject.FileName, InStr(ThisDrawing.Application.VBE.ActiveVBProject.FileName, "\提取") - 1) & "\提取表格.xlsm"
  17. Set excel = GetObject(lj)
  18. Dim SSet As AcadSelectionSet '线条
  19. Dim SSet1 As AcadSelectionSet '文字
  20. MsgBox "请注意:" & vbCr & "1、本功能仅仅支持由直线(Line)和单行文字(Text)构成的表格,如有其它图元,请重复分解命令(Explode),直到无法再次分解为止" & vbCr & vbCr & "2、表格必须横平竖直,不能有斜线" & vbCr & vbCr & "3、格子里面的单行文字插入点必须在格子以内,不然会计算错误" & vbCr & vbCr & "以上任意一个条件不满足均会导致提取表格错位或者失败,请严格按要求提取!!!"
  21. Dim pt1 As Variant
  22. Dim pt2 As Variant
  23.     pt1 = ThisDrawing.Utility.GetPoint(, "选择要提取的区域角点1:")
  24.     pt2 = ThisDrawing.Utility.GetCorner(pt1, "选择要提取的区域角点2:")
  25.    
  26. Dim fType(0) As Integer
  27. Dim fData(0) As Variant

  28.     fType(0) = 0: fData(0) = "LINE"
  29.     Set SSet = createSSet()
  30.         If pt1(0) < pt2(0) Then
  31.             SSet.Select acSelectionSetWindow, pt1, pt2, fType, fData
  32.         Else
  33.             SSet.Select acSelectionSetCrossing, pt1, pt2, fType, fData
  34.         End If
  35.         
  36.             Dim ent As AcadLine
  37.             Dim hzx() As Double '定义横向直线存放的数组
  38.             Dim szx() As Double '定义竖向直线存放的数组
  39.             Dim hi As Long '定义横直线数组数
  40.             Dim si As Long '定义竖直线数组数
  41.             hi = 1
  42.             si = 1
  43.             '------------获取每条直线的X,Y坐标
  44.                 For Each ent In SSet
  45.                     If Round(ent.StartPoint(0), 3) = Round(ent.EndPoint(0), 3) Then '直线X值相等则为竖直线
  46.                     ReDim Preserve szx(1 To si)
  47.                     szx(si) = (ent.StartPoint(0) + ent.EndPoint(0)) / 2
  48.                     si = si + 1
  49.                     End If
  50.                     
  51.                     If Round(ent.StartPoint(1), 3) = Round(ent.EndPoint(1), 3) Then '直线Y值相等则为横直线
  52.                     ReDim Preserve hzx(1 To hi)
  53.                     hzx(hi) = (ent.StartPoint(1) + ent.EndPoint(1)) / 2
  54.                     hi = hi + 1
  55.                     End If
  56.                 Next
  57.                 SSet.Delete
  58. Dim i0 As Long
  59. Dim j0 As Long
  60. Dim temp As Double

  61. For i0 = 1 To UBound(szx) - 1 '竖直线从左到右排序
  62.     For j0 = i0 + 1 To UBound(szx)
  63.         If szx(i0) > szx(j0) Then
  64.             temp = szx(j0)
  65.             szx(j0) = szx(i0)
  66.             szx(i0) = temp
  67.         End If
  68.     Next j0
  69. Next i0

  70. For i0 = 1 To UBound(hzx) - 1 '横直线从上往下排序
  71.     For j0 = i0 + 1 To UBound(hzx)
  72.         If hzx(i0) < hzx(j0) Then
  73.             temp = hzx(j0)
  74.             hzx(j0) = hzx(i0)
  75.             hzx(i0) = temp
  76.         End If
  77.     Next j0
  78. Next i0

  79. '-------剔除坐标相同的线,重新组成纵横线坐标
  80. Dim szx1() As Double
  81. Dim hzx1() As Double
  82. ReDim szx1(1 To 1)
  83.     szx1(1) = szx(1)
  84.     j0 = 1
  85.     For i0 = 2 To UBound(szx)
  86.         If szx1(j0) <> szx(i0) Then
  87.         j0 = j0 + 1
  88.         ReDim Preserve szx1(1 To j0)
  89.         szx1(j0) = szx(i0)
  90.         End If
  91.     Next i0
  92.    
  93.     ReDim hzx1(1 To 1)
  94.     hzx1(1) = hzx(1)
  95.     j0 = 1
  96.     For i0 = 2 To UBound(hzx)
  97.         If hzx1(j0) <> hzx(i0) Then
  98.         j0 = j0 + 1
  99.         ReDim Preserve hzx1(1 To j0)
  100.         hzx1(j0) = hzx(i0)
  101.         End If
  102.     Next i0
  103.    
  104. '------------逐个判断文字插入点是否在纵横直线范围内
  105.     fType(0) = 0: fData(0) = "TEXT"
  106.         Set SSet1 = createSSet()
  107.         If pt1(0) < pt2(0) Then
  108.             SSet1.Select acSelectionSetWindow, pt1, pt2, fType, fData
  109.         Else
  110.             SSet1.Select acSelectionSetCrossing, pt1, pt2, fType, fData
  111.         End If
  112.             Dim ent1 As AcadText
  113.             Dim wz() As String '定义文字存放的数组
  114.             Dim wzsz() As Double '定义文字坐标的数组
  115.             Dim i As Long
  116.             Dim j As Long
  117.             ReDim wz(0 To (SSet1.Count) - 1) As String
  118.             ReDim wzsz(1 To (SSet1.Count) * 2) As Double
  119.             i = 0
  120.             j = 1
  121.             '获取文字插入点,以便于判断文字的位置
  122.                 For Each ent1 In SSet1
  123.                     wz(i) = ent1.TextString
  124.                     wzsz(j) = ent1.InsertionPoint(0)
  125.                     wzsz(j + 1) = ent1.InsertionPoint(1)
  126.                     i = i + 1
  127.                     j = j + 2
  128.                 Next
  129.             SSet1.Delete

  130. Dim ii As Long
  131. Dim zhh As Long

  132. zhh = excel.sheets("提取表格").range("A65536").End(3).row + 1
  133. excel.sheets("提取表格").range("A" & zhh) = "提取时间:" & Now()
  134. Stop
  135. For i = 1 To UBound(hzx1) - 1
  136.     For j = 1 To UBound(szx1) - 1
  137.         For ii = 0 To UBound(wz) '循环文字
  138.             If wzsz(ii * 2 + 1) > szx1(j) And wzsz(ii * 2 + 1) < szx1(j + 1) And wzsz(ii * 2 + 2) < hzx1(i) And wzsz(ii * 2 + 2) > hzx1(i + 1) Then
  139.                 If excel.sheets("提取表格").cells(i + zhh, j) <> "" Then
  140.                     excel.sheets("提取表格").cells(i + zhh, j) = wz(ii) & " " & excel.sheets("提取表格").cells(i + zhh, j)
  141.                 Else
  142.                     excel.sheets("提取表格").cells(i + zhh, j) = wz(ii)
  143.                 End If
  144.             End If
  145.         Next ii
  146.     Next j
  147. Next i
  148. Set excel = Nothing
  149. MsgBox "提取完毕" & vbCr & "本小软件由绛花洞主设计" & vbCr & "如有疑问请联系QQ:672277923"

  150. End Sub



本帖子中包含更多资源

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

x
发表于 2020-8-3 08:37:34 | 显示全部楼层
你好怎么使用啊????
 楼主| 发表于 2020-8-3 11:34:06 | 显示全部楼层
664571221 发表于 2020-8-3 08:37
你好怎么使用啊????

vbarun 就开始使用了啊,VBA做的都没有命令,一律运行vbarun
发表于 2020-8-5 20:52:00 | 显示全部楼层
不错的插件
发表于 2020-9-20 22:27:09 | 显示全部楼层
感谢楼主分享
发表于 2020-9-21 14:49:20 | 显示全部楼层
感谢楼主分享
发表于 2021-10-29 18:50:35 | 显示全部楼层
2010加载不了
 楼主| 发表于 2021-11-1 09:39:04 | 显示全部楼层

2010以后的版本就要安装vba的扩展包了,具体下载链接搜一下论坛
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-22 18:42 , Processed in 0.170114 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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