Arrange.bas 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. Attribute VB_Name = "Arrange"
  2. '// For more information, please refer to https://github.com/hongwenjun
  3. '// Attribute VB_Name = "物件排列拼版" Arrange 2023.12.20
  4. '// CorelDRAW 物件排列拼版简单代码
  5. Public Function Arrange()
  6. On Error GoTo ErrorHandler
  7. #If VBA7 Then
  8. API.BeginOpt
  9. #Else
  10. '// CorelDRAW X4 刷新缓冲区有问题
  11. ActiveDocument.Unit = cdrMillimeter
  12. #End If
  13. row = 3 ' 拼版 3 x 4
  14. List = 4
  15. sp = 0 '间隔 0mm
  16. Dim str, arr, n
  17. str = API.GetClipBoardString
  18. ' 替换 mm x * 换行 TAB 为空格
  19. str = VBA.Replace(str, "mm", " ")
  20. str = VBA.Replace(str, "x", " ")
  21. str = VBA.Replace(str, "X", " ")
  22. str = VBA.Replace(str, "*", " ")
  23. '// 换行转空格 多个空格换成一个空格
  24. str = API.Newline_to_Space(str)
  25. arr = Split(str)
  26. Dim s1 As Shape
  27. Dim x As Double, Y As Double
  28. If 0 = ActiveSelectionRange.Count Then
  29. x = Val(arr(0)): Y = Val(arr(1))
  30. row = Int(ActiveDocument.Pages.First.SizeWidth / x)
  31. List = Int(ActiveDocument.Pages.First.SizeHeight / Y)
  32. If UBound(arr) > 2 Then
  33. row = Val(arr(2)): List = Val(arr(3))
  34. If row * List > 8000 Then
  35. GoTo ErrorHandler
  36. ElseIf UBound(arr) > 3 Then
  37. sp = Val(arr(4)) '间隔
  38. End If
  39. End If
  40. '// 建立矩形 Width x Height 单位 mm
  41. Set s1 = ActiveLayer.CreateRectangle(0, 0, x, Y)
  42. '// 填充颜色无,轮廓颜色 K100,线条粗细0.3mm
  43. s1.Fill.ApplyNoFill
  44. s1.Outline.SetProperties 0.3, OutlineStyles(0), CreateCMYKColor(0, 100, 0, 0), ArrowHeads(0), _
  45. ArrowHeads(0), cdrFalse, cdrFalse, cdrOutlineButtLineCaps, cdrOutlineMiterLineJoin, 0#, 100, MiterLimit:=5#
  46. '// 如果当前选择物件,按当前物件拼版
  47. ElseIf 0 < ActiveSelectionRange.Count Then
  48. Set s1 = ActiveSelection
  49. x = s1.SizeWidth: Y = s1.SizeHeight
  50. row = Int(ActiveDocument.Pages.First.SizeWidth / x)
  51. List = Int(ActiveDocument.Pages.First.SizeHeight / Y)
  52. End If
  53. sw = x: sh = Y
  54. '// StepAndRepeat 方法在范围内创建多个形状副本
  55. Dim dup1 As ShapeRange, dup2 As ShapeRange
  56. If row > 1 Then
  57. Set dup1 = s1.StepAndRepeat(row - 1, sw + sp, 0#)
  58. If List > 1 Then Set dup2 = ActiveDocument.CreateShapeRangeFromArray(dup1, s1).StepAndRepeat(List - 1, 0#, (sh + sp))
  59. End If
  60. If List > 1 And row < 2 Then Set dup1 = s1.StepAndRepeat(List - 1, 0#, (sh + sp))
  61. ErrorHandler:
  62. API.EndOpt
  63. End Function
  64. '***************** 之前旧的代码 不能处理 row 和 list 等于1 的 **********************
  65. ' Dim dup1 As ShapeRange
  66. ' Set dup1 = s1.StepAndRepeat(row - 1, sw + sp, 0#)
  67. ' Dim dup2 As ShapeRange
  68. ' Set dup2 = ActiveDocument.CreateShapeRangeFromArray(dup1, s1).StepAndRepeat(List - 1, 0#, (sh + sp))