明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 17100|回复: 61

分享一个自己CAD表格转EXCEL源程序

    [复制链接]
发表于 2018-8-22 09:34:12 | 显示全部楼层 |阅读模式
本人水平有限,大部分CAD编程技能从明经论坛学习的,刚刚写了个CAD表格转EXCEL源程序,分享大家,一起进步!
程序说明:把PT1和pT2范围内的文字转换成数组,输出到excel表格1里面,所以一定要打开EXCEL才行。具体用法可以根据自己的需求修改。
  1. Option Explicit

  2. Public Sub Cad表格转Excel()
  3. Dim objEntArr() As Object, i As Long
  4. Dim objSset As AcadSelectionSet
  5. Dim Y As AcadSelectionSet
  6. Dim pt1(2) As Double, pt2(2) As Double, na$
  7. Dim p, j, A(1 To 990, 1 To 7), B(), C(), D(), n, m, k

  8. 'pt1,pt2是表格的位置,左下,右上
  9. pt1(0) = -1500
  10. pt1(1) = -1500
  11. pt1(2) = 0
  12. pt2(0) = 43200
  13. pt2(1) = 43200
  14. pt2(2) = 0
  15. na = "QQQ"
  16. On Error Resume Next
  17. If Not IsNull(ThisDrawing.SelectionSets.Item(na)) Then
  18.     Set Y = ThisDrawing.SelectionSets.Item(na)
  19.     Y.Delete
  20. End If
  21. Set Y = ThisDrawing.SelectionSets.Add(na)
  22.       Dim gpCode(0) As Integer
  23.       Dim dataValue(0) As Variant
  24.       gpCode(0) = 0
  25.       dataValue(0) = "text,mtext"
  26.       Dim groupCode As Variant, dataCode As Variant
  27.       groupCode = gpCode
  28.       dataCode = dataValue
  29. Y.Select acSelectionSetCrossing, pt1, pt2, groupCode, dataCode
  30.     For i = 0 To Y.Count - 1
  31.         A(i + 1, 1) = i
  32.         A(i + 1, 2) = Y.Item(i).TextString
  33.         p = Y.Item(i).InsertionPoint
  34.         A(i + 1, 3) = p(0)
  35.         A(i + 1, 4) = p(1)
  36.     Next i
  37. Y.Delete
  38. k = 50     'k是过滤间隙
  39. B = 过滤数组(A, 4, k)
  40. C = 过滤数组(A, 3, k + 5)
  41. ReDim D(1 To UBound(B) + 1, 1 To UBound(C) + 1)
  42. For i = 1 To UBound(A)
  43.     If A(i, 2) = "" Then Exit For
  44.     For n = 0 To UBound(B)
  45.         '行的位置
  46.         If Abs(B(n) - A(i, 4)) < k Then
  47.             Exit For
  48.         End If
  49.     Next n
  50.     For m = 0 To UBound(B)
  51.         '列的位置
  52.         If Abs(C(m) - A(i, 3)) < k Then
  53.             Exit For
  54.         End If
  55.     Next m
  56.     D(UBound(B) + 1 - n, 1 + m) = A(i, 2)
  57. Next i
  58. Dim exlh As Object
  59. Set exlh = GetObject(, "excel.application")
  60. With exlh
  61.     .workbooks(1).worksheets(1).Select
  62.     .cells(1, 1).resize(UBound(B) + 1, UBound(C) + 1) = D
  63. End With
  64. End Sub

  65. Function 过滤数组(ByVal A, ByVal n, ByVal k) As Variant
  66. 'A是数组,n是过滤的列,k是过滤的间隙
  67. Dim B(), i, j, p, m
  68. j = 0
  69. ReDim B(0)
  70. B(0) = A(1, n)
  71. For i = 2 To UBound(A)
  72.     m = 0
  73.     If A(i, n) = "" Then Exit For
  74.     For p = 0 To j
  75.         If Abs(A(i, n) - B(p)) < k Then
  76.             m = 1
  77.             Exit For
  78.         End If
  79.     Next p
  80.     If m = 0 Then
  81.         j = j + 1
  82.         ReDim Preserve B(j)
  83.         B(j) = A(i, n)
  84.     End If
  85. Next i
  86. 过滤数组 = 冒泡排序(B)

  87. End Function
  88. Function 冒泡排序(ByVal A) As Variant
  89. '从小到大
  90. Dim i, j, n
  91. For i = 0 To UBound(A) - 1
  92.     For j = 0 To UBound(A) - 1 - i
  93.         If A(j) > A(j + 1) Then
  94.             n = A(j + 1)
  95.             A(j + 1) = A(j)
  96.             A(j) = n
  97.         End If
  98.     Next j
  99. Next i
  100. 冒泡排序 = A
  101. End Function



本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
VBALISPER + 1 赞一个!

查看全部评分

 楼主| 发表于 2018-8-23 16:40:56 | 显示全部楼层
mikewolf2k 发表于 2018-8-23 16:01
如何判断是同一个单元格的?代码看起来太累,能说说么。粗略扫了一下,似乎是如果XY在前后行列的值之间,就 ...

是的,先如果某行某列全空,是被删除掉的。如果要精准判断,后续可以加入线条的坐标进行定位判断。
本程序流程

本帖子中包含更多资源

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

x

评分

参与人数 2金钱 +60 收起 理由
zzyong00 + 30 赞一个!
mikewolf2k + 30 很给力!

查看全部评分

回复 支持 2 反对 0

使用道具 举报

发表于 2018-8-23 16:53:02 | 显示全部楼层
qwh923820 发表于 2018-8-23 16:40
是的,先如果某行某列全空,是被删除掉的。如果要精准判断,后续可以加入线条的坐标进行定位判断。
本程 ...

无论怎么判断,总能找出破绽,做不出通用的。只要能胜任要处理的表格就可以了。现在已经很不错了。

点评

Gu_xl版主有一个通过表格四角坐标判断的vlx插件,真的很不错  发表于 2018-8-26 14:06
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-9-17 09:39:33 | 显示全部楼层
已经改成新建一个sheet,放入其中了
  1. Option Explicit
  2. Public Sub Cad表格转Excel()
  3. Dim objEntArr() As Object, i As Long
  4. Dim objSset As AcadSelectionSet
  5. Dim y As AcadSelectionSet
  6. 'Dim pt1(2) As Double, pt2(2) As Double
  7. Dim p, j, A(1 To 990, 1 To 7), B(), C(), D(), n, m, k, ky, kx, m1, m2, na$
  8. Dim E()
  9. 'pt1,pt2是表格的位置,左下,右上
  10. 'pt1(0) = -1500
  11. 'pt1(1) = -1500
  12. 'pt1(2) = 0
  13. 'pt2(0) = 43200
  14. 'pt2(1) = 43200
  15. 'pt2(2) = 0
  16. Dim pt1, pt2
  17. pt1 = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  18. pt2 = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  19. na = "QQQ"
  20. k = 0
  21. On Error Resume Next
  22. If Not IsNull(ThisDrawing.SelectionSets.Item(na)) Then
  23.     Set y = ThisDrawing.SelectionSets.Item(na)
  24.     y.Delete
  25. End If
  26. Set y = ThisDrawing.SelectionSets.Add(na)
  27.       Dim gpCode(0) As Integer
  28.       Dim dataValue(0) As Variant
  29.       gpCode(0) = 0
  30.       dataValue(0) = "text,mtext"
  31.       Dim groupCode As Variant, dataCode As Variant
  32.       groupCode = gpCode
  33.       dataCode = dataValue
  34.   '    pt1 = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  35.   '    pt2 = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  36. y.Select acSelectionSetCrossing, pt1, pt2, groupCode, dataCode

  37.     For i = 0 To y.Count - 1
  38.         A(i + 1, 1) = i
  39.         A(i + 1, 2) = y.Item(i).TextString
  40.         p = y.Item(i).InsertionPoint
  41.         k = IIf(y.Item(i).Height - k > 0, y.Item(i).Height, k)       'k是过滤间隙
  42.         y.Item(i).GetBoundingBox m1, m2
  43.         A(i + 1, 3) = p(0)
  44.         A(i + 1, 4) = p(1)
  45.         A(i + 1, 5) = (m1(0) + m2(0)) / 2          '文字中心坐标
  46.         A(i + 1, 6) = (m2(0) - m1(0)) / 2          '文字长度的一半
  47.         A(i + 1, 7) = (p(0) + A(i + 1, 5)) / 2     '插入点与文字中心坐标的中心点
  48.         A(i + 1, 5) = A(i + 1, 5) + A(i + 1, 6) / 2.5    '文字中心坐标往右偏
  49.     Next i
  50. y.Delete
  51. ' Stop
  52. 'k = 50     'k是过滤间隙
  53. ky = k
  54. kx = k * 1.2
  55. B = 过滤数组(A, 4, ky)
  56. C = 过滤数组(A, 7, kx)
  57. 'Stop
  58. ReDim D(1 To UBound(B) + 1, 1 To UBound(C) + 1)
  59. For i = 1 To UBound(A)
  60.     If A(i, 2) = "" Then Exit For
  61.     For n = 0 To UBound(B)
  62.         '行的位置
  63.         If Abs(B(n) - A(i, 4)) < ky Then
  64.             Exit For
  65.         End If
  66.     Next n
  67.     For m = 0 To UBound(C)
  68.         '列的位置
  69.         If Abs(C(m) - A(i, 7)) < kx Then
  70.             Exit For
  71.         End If
  72.     Next m
  73.     If D(UBound(B) + 1 - n, 1 + m) = "" Then
  74.         D(UBound(B) + 1 - n, 1 + m) = i
  75.     Else
  76.         D(UBound(B) + 1 - n, 1 + m) = i & "~~" & D(UBound(B) + 1 - n, 1 + m)
  77.     End If
  78. Next i
  79. E = 整合数组列(A, D, 1)
  80. E = 替换文字内容(A, E)
  81. Call EXCEL输出(E)
  82. 'Dim exlh As Object
  83. 'Set exlh = GetObject(, "excel.application")
  84. 'With exlh
  85. '    .workbooks(1).worksheets(1).Select
  86. '    .cells.Select
  87. '    .Selection.Clear
  88. '    '.cells(1, 1).resize(990, 7) = A
  89. '    '.cells(1, 9).resize(UBound(B) + 1, UBound(C) + 1) = D
  90. '    .cells(1, 1).resize(UBound(E), UBound(E, 2)) = E
  91. '
  92. 'End With
  93. End Sub

  94. Function 过滤数组(ByVal A, ByVal n, ByVal k) As Variant
  95. 'A是数组,n是过滤的列,k是过滤的间隙
  96. Dim B(), i, j, p, m
  97. j = 0
  98. ReDim B(0)
  99. B(0) = A(1, n)
  100. For i = 2 To UBound(A)
  101.     m = 0
  102.     If A(i, n) = "" Then Exit For
  103.     For p = 0 To j
  104.         If Abs(A(i, n) - B(p)) < k Then
  105.             m = 1
  106.             Exit For
  107.         End If
  108.     Next p
  109.     If m = 0 Then
  110.         j = j + 1
  111.         ReDim Preserve B(j)
  112.         B(j) = A(i, n)
  113.     End If
  114. Next i
  115. 过滤数组 = 冒泡排序(B)
  116. End Function
  117. Function 冒泡排序(ByVal A) As Variant
  118. '从小到大
  119. Dim i, j, n
  120. For i = 0 To UBound(A) - 1
  121.     For j = 0 To UBound(A) - 1 - i
  122.         If A(j) > A(j + 1) Then
  123.             n = A(j + 1)
  124.             A(j + 1) = A(j)
  125.             A(j) = n
  126.         End If
  127.     Next j
  128. Next i
  129. 冒泡排序 = A
  130. End Function
  131. Function 整合数组列(ByVal A, ByVal D, ByVal n)
  132. '以中心点和插入点间距为判断
  133. '当相连两列n列与n+1列比较,n+1列文字插入点或中心点在n列的插入点与中心点之间时,合并
  134. 'n列的插入点与中心点之间距离取该列最大值
  135. Dim i, j, L, p, q, x1, x2, y, B, x3, x4
  136. Dim C()
  137. L = 0
  138. If n >= UBound(D, 2) Then
  139.     整合数组列 = D
  140.     Exit Function
  141. End If
  142. 'n列的插入点与中心点之间距离取该列最大值L及插入点和中心点X坐标
  143. For i = 1 To UBound(D)
  144.     If D(i, n) <> "" Then
  145.         If InStr(D(i, n), "~~") > 0 Then
  146.             B = Split(D(i, n), "~~")
  147.             For j = 0 To UBound(B)
  148.                 y = Abs(A(B(j), 5) - A(B(j), 3))
  149.                 If L < y Then
  150.                     L = y
  151.                     x1 = A(B(j), 3): x2 = A(B(j), 5)
  152.                 End If
  153.             Next j
  154.             Erase B
  155.         Else
  156.             y = Abs(A(D(i, n), 5) - A(D(i, n), 3))
  157.             If L < y Then
  158.                 L = y
  159.                 x1 = A(D(i, n), 3): x2 = A(D(i, n), 5)
  160.             End If
  161.         End If
  162.     End If
  163. Next i
  164. 'Stop
  165. For i = 1 To UBound(D)
  166. p = 0
  167.     If D(i, n + 1) <> "" Then
  168.     'Stop
  169.         If InStr(D(i, n + 1), "~~") > 0 Then
  170.             B = Split(D(i, n + 1), "~~")
  171.             For j = 0 To UBound(B)
  172.                 x3 = A(B(j), 3): x4 = A(B(j), 5)
  173.                 If IIf(x3 > x4, x4, x3) < IIf(x2 > x1, x2, x1) Then
  174.                     p = 1
  175.                     Exit For
  176.                 End If
  177.             Next j
  178.             Erase B
  179.         Else
  180.             x3 = A(D(i, n + 1), 3): x4 = A(D(i, n + 1), 5)
  181.             If IIf(x3 > x4, x4, x3) < IIf(x2 > x1, x2, x1) Then p = 1
  182.         End If
  183.         If p = 1 Then
  184.             If D(i, n) = "" Then
  185.                 D(i, n) = D(i, n + 1)
  186.             Else
  187.                 D(i, n) = 纵向排列同一单元格文字(A, D(i, n) & "~~" & D(i, n + 1))
  188.             End If
  189.             D(i, n + 1) = ""
  190.         End If
  191.     End If
  192. Next i
  193. 'Call excelqingchu(n)
  194. 'Call EXCEL输出(D)
  195. C = 去除数组第N列空列(D, n + 1)
  196. If UBound(C, 2) < UBound(D, 2) Then n = n - 1
  197. 'If n = 10 Then Stop
  198. 'Call EXCEL输出(C)
  199. 'Stop
  200. 整合数组列 = 整合数组列(A, C, n + 1)
  201. End Function
  202. Function 纵向排列同一单元格文字(ByVal A, ByVal t)
  203. Dim B, i, j, k, C(), D(), E()
  204. B = Split(t, "~~")
  205. k = ""
  206. ReDim C(UBound(B))
  207. ReDim E(0 To UBound(B), 1 To 2)
  208. For i = 0 To UBound(C)
  209.     C(i) = A(B(i), 4)
  210.     E(i, 1) = C(i)
  211.     E(i, 2) = B(i)
  212. Next i
  213. Erase B
  214. D = 冒泡排序(C)
  215. For i = UBound(D) To 0 Step -1
  216.     For j = 0 To UBound(D)
  217.         If Abs(D(i) - E(j, 1)) < 0.001 Then
  218.             If k = "" Then
  219.                 k = E(j, 2)
  220.             Else
  221.                 k = k & "~~" & E(j, 2)
  222.             End If
  223.             E(j, 1) = -1235.778
  224.         End If
  225.     Next j
  226. Next i
  227. 纵向排列同一单元格文字 = k
  228. End Function
  229. Function 去除数组第N列空列(ByVal D, ByVal n)
  230. Dim B(), i, j
  231. For i = 1 To UBound(D)
  232.     If D(i, n) <> "" Then 去除数组第N列空列 = D: Exit Function
  233. Next i
  234. ReDim C(1 To UBound(D), 1 To UBound(D, 2) - 1)
  235. For i = 1 To UBound(D)
  236.     For j = 1 To UBound(C, 2)
  237.         If j < n Then
  238.             C(i, j) = D(i, j)
  239.         ElseIf j >= n Then
  240.             C(i, j) = D(i, j + 1)
  241.         End If
  242.     Next j
  243. Next i
  244. 去除数组第N列空列 = C
  245. End Function
  246. Function 替换文字内容(ByVal A, ByVal D)
  247. Dim B, i, j, k, n, m
  248. For i = 1 To UBound(D)
  249.     For j = 1 To UBound(D, 2)
  250.         m = ""
  251.         If D(i, j) <> "" Then
  252.             If InStr(D(i, j), "~~") > 0 Then
  253.                 B = Split(D(i, j), "~~")
  254.                 For k = 0 To UBound(B)
  255.                     If m = "" Then m = A(B(k), 2) Else m = m & Chr(10) & A(B(k), 2)
  256.                 Next k
  257.                 Erase B
  258.             Else
  259.                 m = A(D(i, j), 2)
  260.             End If
  261.             D(i, j) = m
  262.         End If
  263.     Next j
  264. Next i
  265. 替换文字内容 = D
  266. End Function
  267. Sub EXCEL输出(ByVal D)
  268. Dim i, j, r
  269. i = UBound(D)
  270. j = UBound(D, 2)
  271. Dim exlh As Object
  272. Set exlh = GetObject(, "excel.application")
  273. With exlh
  274.     .workbooks(1).worksheets(1).Select
  275.     .Sheets.Add
  276.     'r = .cells(9999, 1).End(3).row + 2
  277.     'If r < 3 Then r = 1
  278.     r = 1
  279.     .cells(r, 1).resize(i, j) = D
  280.     .Range(.cells(1, 1), .cells(i, j)).Select
  281.     .Selection.VerticalAlignment = 2
  282.     .Selection.HorizontalAlignment = 3
  283.     .Selection.Borders().LineStyle = 1
  284. End With

  285. End Sub
  286. Sub excelqingchu(n)
  287. Dim exlh As Object
  288. Set exlh = GetObject(, "excel.application")
  289. With exlh
  290.     .workbooks(1).worksheets(1).Select
  291.     .cells.Select
  292.     .Selection.Clear
  293. End With
  294. End Sub


回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-8-23 13:58:42 | 显示全部楼层
zzyong00 发表于 2018-8-23 12:38
我十多年前就有类似的程序,还设置了容差对话框,但发现在实际使用时,问题太多了,才知道,当时的出发点就 ...

又修修改改,那个上标次方实在搞不定,其他帮忙鉴定下,后面附上源码




  1. Option Explicit

  2. Public Sub Cad表格转Excel()
  3. Dim objEntArr() As Object, i As Long
  4. Dim objSset As AcadSelectionSet
  5. Dim y As AcadSelectionSet
  6. Dim pt1(2) As Double, pt2(2) As Double
  7. Dim p, j, A(1 To 990, 1 To 7), B(), C(), D(), n, m, k, ky, kx, m1, m2, na$
  8. Dim E()
  9. 'pt1,pt2是表格的位置,左下,右上
  10. pt1(0) = -1500
  11. pt1(1) = -1500
  12. pt1(2) = 0
  13. pt2(0) = 43200
  14. pt2(1) = 43200
  15. pt2(2) = 0
  16. na = "QQQ"
  17. k = 0
  18. On Error Resume Next
  19. If Not IsNull(ThisDrawing.SelectionSets.Item(na)) Then
  20.     Set y = ThisDrawing.SelectionSets.Item(na)
  21.     y.Delete
  22. End If
  23. Set y = ThisDrawing.SelectionSets.Add(na)
  24.       Dim gpCode(0) As Integer
  25.       Dim dataValue(0) As Variant
  26.       gpCode(0) = 0
  27.       dataValue(0) = "text,mtext"
  28.       Dim groupCode As Variant, dataCode As Variant
  29.       groupCode = gpCode
  30.       dataCode = dataValue
  31.   '    pt1 = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  32.   '    pt2 = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  33. y.Select acSelectionSetCrossing, pt1, pt2, groupCode, dataCode

  34.     For i = 0 To y.Count - 1
  35.         A(i + 1, 1) = i
  36.         A(i + 1, 2) = y.Item(i).TextString
  37.         p = y.Item(i).InsertionPoint
  38.         k = IIf(y.Item(i).Height - k > 0, y.Item(i).Height, k)       'k是过滤间隙
  39.         y.Item(i).GetBoundingBox m1, m2
  40.         A(i + 1, 3) = p(0)
  41.         A(i + 1, 4) = p(1)
  42.         A(i + 1, 5) = (m1(0) + m2(0)) / 2          '文字中心坐标
  43.         A(i + 1, 6) = (m2(0) - m1(0)) / 2          '文字长度的一半
  44.         A(i + 1, 7) = (p(0) + A(i + 1, 5)) / 2     '插入点与文字中心坐标的中心点
  45.     Next i
  46. y.Delete
  47. ' Stop
  48. 'k = 50     'k是过滤间隙
  49. ky = k
  50. kx = k * 1.2
  51. B = 过滤数组(A, 4, ky)
  52. C = 过滤数组(A, 7, kx)
  53. ReDim D(1 To UBound(B) + 1, 1 To UBound(C) + 1)
  54. For i = 1 To UBound(A)
  55.     If A(i, 2) = "" Then Exit For
  56.     For n = 0 To UBound(B)
  57.         '行的位置
  58.         If Abs(B(n) - A(i, 4)) < ky Then
  59.             Exit For
  60.         End If
  61.     Next n
  62.     For m = 0 To UBound(B)
  63.         '列的位置
  64.         If Abs(C(m) - A(i, 7)) < kx Then
  65.             Exit For
  66.         End If
  67.     Next m
  68.     If D(UBound(B) + 1 - n, 1 + m) = "" Then
  69.         D(UBound(B) + 1 - n, 1 + m) = i
  70.     Else
  71.         D(UBound(B) + 1 - n, 1 + m) = i & "~~" & D(UBound(B) + 1 - n, 1 + m)
  72.     End If
  73. Next i
  74. E = 整合数组列(A, D, 1)
  75. E = 替换文字内容(A, E)
  76. Dim exlh As Object
  77. Set exlh = GetObject(, "excel.application")
  78. With exlh
  79.     .workbooks(1).worksheets(1).Select
  80.     .cells.Select
  81.     .Selection.Clear
  82.     '.cells(1, 1).resize(990, 7) = A
  83.     '.cells(1, 9).resize(UBound(B) + 1, UBound(C) + 1) = D
  84.     .cells(1, 1).resize(UBound(E), UBound(E, 2)) = E
  85.    
  86. End With
  87. End Sub

  88. Function 过滤数组(ByVal A, ByVal n, ByVal k) As Variant
  89. 'A是数组,n是过滤的列,k是过滤的间隙
  90. Dim B(), i, j, p, m
  91. j = 0
  92. ReDim B(0)
  93. B(0) = A(1, n)
  94. For i = 2 To UBound(A)
  95.     m = 0
  96.     If A(i, n) = "" Then Exit For
  97.     For p = 0 To j
  98.         If Abs(A(i, n) - B(p)) < k Then
  99.             m = 1
  100.             Exit For
  101.         End If
  102.     Next p
  103.     If m = 0 Then
  104.         j = j + 1
  105.         ReDim Preserve B(j)
  106.         B(j) = A(i, n)
  107.     End If
  108. Next i
  109. 过滤数组 = 冒泡排序(B)
  110. End Function
  111. Function 冒泡排序(ByVal A) As Variant
  112. '从小到大
  113. Dim i, j, n
  114. For i = 0 To UBound(A) - 1
  115.     For j = 0 To UBound(A) - 1 - i
  116.         If A(j) > A(j + 1) Then
  117.             n = A(j + 1)
  118.             A(j + 1) = A(j)
  119.             A(j) = n
  120.         End If
  121.     Next j
  122. Next i
  123. 冒泡排序 = A
  124. End Function
  125. Function 整合数组列(ByVal A, ByVal D, ByVal n)
  126. '以中心点和插入点间距为判断
  127. '当相连两列n列与n+1列比较,n+1列文字插入点或中心点在n列的插入点与中心点之间时,合并
  128. 'n列的插入点与中心点之间距离取该列最大值
  129. Dim i, j, L, p, q, x1, x2, y, B, x3, x4
  130. Dim C()
  131. L = 0
  132. If n >= UBound(D, 2) Then
  133.     整合数组列 = D
  134.     Exit Function
  135. End If
  136. 'n列的插入点与中心点之间距离取该列最大值L及插入点和中心点X坐标
  137. For i = 1 To UBound(D)
  138.     If D(i, n) <> "" Then
  139.         If InStr(D(i, n), "~~") > 0 Then
  140.             B = Split(D(i, n), "~~")
  141.             For j = 0 To UBound(B)
  142.                 y = Abs(A(B(j), 5) - A(B(j), 3))
  143.                 If L > y Then
  144.                     L = y
  145.                     x1 = A(B(j), 3): x2 = A(B(j), 5)
  146.                 End If
  147.             Next j
  148.             Erase B
  149.         Else
  150.             y = Abs(A(D(i, n), 5) - A(D(i, n), 3))
  151.             If L < y Then
  152.                 L = y
  153.                 x1 = A(D(i, n), 3): x2 = A(D(i, n), 5)
  154.             End If
  155.         End If
  156.     End If
  157. Next i
  158. 'Stop
  159. For i = 1 To UBound(D)
  160. p = 0
  161.     If D(i, n + 1) <> "" Then
  162.         If InStr(D(i, n + 1), "~~") > 0 Then
  163.             B = Split(D(i, n + 1), "~~")
  164.             For j = 0 To UBound(B)
  165.                 x3 = A(B(j), 3): x4 = A(B(j), 5)
  166.                 If IIf(x3 > x4, x4, x3) < IIf(x2 > x1, x2, x1) Then
  167.                     p = 1
  168.                     Exit For
  169.                 End If
  170.             Next j
  171.             Erase B
  172.         Else
  173.             x3 = A(D(i, n + 1), 3): x4 = A(D(i, n + 1), 5)
  174.             If IIf(x3 > x4, x4, x3) < IIf(x2 > x1, x2, x1) Then p = 1
  175.         End If
  176.         If p = 1 Then
  177.             If D(i, n) = "" Then
  178.                 D(i, n) = D(i, n + 1)
  179.             Else
  180.                 D(i, n) = 纵向排列同一单元格文字(A, D(i, n) & "~~" & D(i, n + 1))
  181.             End If
  182.             D(i, n + 1) = ""
  183.         End If
  184.     End If
  185. Next i
  186. C = 去除数组第N列空列(D, n + 1)
  187. If UBound(C, 2) < UBound(D, 2) Then n = n - 1
  188. 整合数组列 = 整合数组列(A, C, n + 1)
  189. End Function
  190. Function 纵向排列同一单元格文字(ByVal A, ByVal t)
  191. Dim B, i, j, k, C(), D(), E()
  192. B = Split(t, "~~")
  193. k = ""
  194. ReDim C(UBound(B))
  195. ReDim E(0 To UBound(B), 1 To 2)
  196. For i = 0 To UBound(C)
  197.     C(i) = A(B(i), 4)
  198.     E(i, 1) = C(i)
  199.     E(i, 2) = B(i)
  200. Next i
  201. Erase B
  202. D = 冒泡排序(C)
  203. For i = UBound(D) To 0 Step -1
  204.     For j = 0 To UBound(D)
  205.         If Abs(D(i) - E(j, 1)) < 0.001 Then
  206.             If k = "" Then
  207.                 k = E(j, 2)
  208.             Else
  209.                 k = k & "~~" & E(j, 2)
  210.             End If
  211.             E(j, 1) = -1235.778
  212.         End If
  213.     Next j
  214. Next i
  215. 纵向排列同一单元格文字 = k
  216. End Function
  217. Function 去除数组第N列空列(ByVal D, ByVal n)
  218. Dim B(), i, j
  219. For i = 1 To UBound(D)
  220.     If D(i, n) <> "" Then 去除数组第N列空列 = D: Exit Function
  221. Next i
  222. ReDim C(1 To UBound(D), 1 To UBound(D, 2) - 1)
  223. For i = 1 To UBound(D)
  224.     For j = 1 To UBound(C, 2)
  225.         If j < n Then
  226.             C(i, j) = D(i, j)
  227.         ElseIf j >= n Then
  228.             C(i, j) = D(i, j + 1)
  229.         End If
  230.     Next j
  231. Next i
  232. 去除数组第N列空列 = C
  233. End Function
  234. Function 替换文字内容(ByVal A, ByVal D)
  235. Dim B, i, j, k, n, m
  236. For i = 1 To UBound(D)
  237.     For j = 1 To UBound(D, 2)
  238.         m = ""
  239.         If D(i, j) <> "" Then
  240.             If InStr(D(i, j), "~~") > 0 Then
  241.                 B = Split(D(i, j), "~~")
  242.                 For k = 0 To UBound(B)
  243.                     If m = "" Then m = A(B(k), 2) Else m = m & Chr(10) & A(B(k), 2)
  244.                 Next k
  245.                 Erase B
  246.             Else
  247.                 m = A(D(i, j), 2)
  248.             End If
  249.             D(i, j) = m
  250.         End If
  251.     Next j
  252. Next i
  253. 替换文字内容 = D
  254. End Function




本帖子中包含更多资源

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

x

点评

其实,用判断文字坐标,能做到这种程序,算很不错的了  发表于 2018-8-26 14:07
回复 支持 1 反对 0

使用道具 举报

发表于 2018-8-22 09:56:42 | 显示全部楼层
有没有测试一下,如果这个CAD表格中有空数据的时候,输出到EXCEL中的对应单元格是否也是空的?
发表于 2018-8-22 10:52:39 | 显示全部楼层
靠判断单元格文字位置这种思路不太可行,实际应用会有很多问题,我以前也有过类似思路的东西,最后只能是放弃
发表于 2018-8-22 13:12:04 | 显示全部楼层
我是根据对齐点的位置,X/Y小于误差值内的算一行/列,然后遍历文本,看属于第几行第几列,然后填到相应单元格。
 楼主| 发表于 2018-8-22 13:33:50 | 显示全部楼层
dong20030432 发表于 2018-8-22 09:56
有没有测试一下,如果这个CAD表格中有空数据的时候,输出到EXCEL中的对应单元格是否也是空的?

刚刚测试,可以的。附上测试结果对比


本帖子中包含更多资源

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

x
 楼主| 发表于 2018-8-22 13:35:30 | 显示全部楼层
mikewolf2k 发表于 2018-8-22 13:12
我是根据对齐点的位置,X/Y小于误差值内的算一行/列,然后遍历文本,看属于第几行第几列,然后填到相应单元 ...

我也是这样的思想写的程序,根据不同情况改变文字间距的误差,小于误差属于同一行,或同一列。

本帖子中包含更多资源

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

x
 楼主| 发表于 2018-8-22 13:36:39 | 显示全部楼层
zzyong00 发表于 2018-8-22 10:52
靠判断单元格文字位置这种思路不太可行,实际应用会有很多问题,我以前也有过类似思路的东西,最后只能是放 ...

暂时没发现问题,是否可赐教,或出现问题的情况
发表于 2018-8-22 13:39:53 | 显示全部楼层

去先来个简单的表格,你先试试

本帖子中包含更多资源

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

x
发表于 2018-8-22 13:41:56 | 显示全部楼层

再来个稍差一点的,更差的,就不上了

本帖子中包含更多资源

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

x
发表于 2018-8-22 14:46:18 | 显示全部楼层
qwh923820 发表于 2018-8-22 13:35
我也是这样的思想写的程序,根据不同情况改变文字间距的误差,小于误差属于同一行,或同一列。

这一点你的思路是一样的,不过建议这个误差值不要写死在程序中,改成用户在程序运行中输入。
另外不同的对齐方式,对齐点是不一样的,有的是插入点,有的是对齐点,建议测试好后修改。
还有输出的单元格先清空下,不然如果原来sheet已经有多的数据,导出的数据改写了其中小的区域,不方便看出究竟哪些是导出的。
不断发现缺陷不断改进。加油!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-28 22:19 , Processed in 0.204400 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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