Browse Source

零基础CorelVBA教程 合集 2022.12.14 源码更新

Hongwenjun 2 years ago
parent
commit
c39fa340eb
5 changed files with 341 additions and 36 deletions
  1. 10 0
      README.md
  2. 300 32
      Tools.bas
  3. 13 4
      VBA_FORM.frm
  4. BIN
      VBA_FORM.frx
  5. 18 0
      快捷键.bas

+ 10 - 0
README.md

@@ -8,6 +8,16 @@
 ![](https://raw.githubusercontent.com/hongwenjun/img/master/VBA/002.gif)
 
 
+# 零基础CorelVBA教程 合集  2022.12.14 源码更新
+
+## [【Part01_CorelDRAW软件安装和GMS文件简单使用】](https://www.bilibili.com/video/BV16G4y1o7u4/?share_source=copy_web&vd_source=8e94edd08d369c0c217cdec8f041fd18)
+
+## [【Part02_CorelDRAW_GMS插件安装和设置_批量多页居中功能演示】](https://www.bilibili.com/video/BV1TD4y1a7Mb/?share_source=copy_web&vd_source=8e94edd08d369c0c217cdec8f041fd18)
+
+## [【Part03_CorelDRAW_GMS插件设置快捷键】](https://www.bilibili.com/video/BV13A41197H2/?share_source=copy_web&vd_source=8e94edd08d369c0c217cdec8f041fd18)
+
+## [【Part04_CorelDRAW_敏捷化编程编写功能自动旋转角度】](https://www.bilibili.com/video/BV1F8411p7TY/?share_source=copy_web&vd_source=8e94edd08d369c0c217cdec8f041fd18)
+
 
 ### [捐赠 蘭雅CorelVBA工具 开源软件](https://github.com/hongwenjun/corelvba/blob/main/donate.md)
 # [CorelDRAW VBA](https://262235.xyz/index.php/tag/vba/)

+ 300 - 32
Tools.bas

@@ -2,23 +2,23 @@ Attribute VB_Name = "Tools"
 Public Sub 填入居中文字(Str)
   Dim s As Shape
   Set s = ActiveSelection
-  x = s.CenterX
+  X = s.CenterX
   Y = s.CenterY
   
   Set s = ActiveLayer.CreateArtisticText(0, 0, Str)
-  s.CenterX = x
+  s.CenterX = X
   s.CenterY = Y
 End Sub
 
 Public Sub 尺寸标注()
   ActiveDocument.Unit = cdrMillimeter
   Set s = ActiveSelection
-  x = s.CenterX: Y = s.TopY
+  X = s.CenterX: Y = s.TopY
   sw = s.SizeWidth: sh = s.SizeHeight
         
   Text = Int(sw) & "x" & Int(sh) & "mm"
   Set s = ActiveLayer.CreateArtisticText(0, 0, Text)
-  s.CenterX = x: s.BottomY = Y + 5
+  s.CenterX = X: s.BottomY = Y + 5
 End Sub
 
 Public Sub 批量居中文字(Str)
@@ -26,10 +26,10 @@ Public Sub 
   Set sr = ActiveSelectionRange
   
   For Each s In sr.Shapes
-    x = s.CenterX: Y = s.CenterY
+    X = s.CenterX: Y = s.CenterY
     
     Set s = ActiveLayer.CreateArtisticText(0, 0, Str)
-    s.CenterX = x: s.CenterY = Y
+    s.CenterX = X: s.CenterY = Y
   Next
 End Sub
 
@@ -38,12 +38,12 @@ Public Sub 
   Set sr = ActiveSelectionRange
   
   For Each s In sr.Shapes
-    x = s.CenterX: Y = s.TopY
+    X = s.CenterX: Y = s.TopY
     sw = s.SizeWidth: sh = s.SizeHeight
           
     Text = Int(sw + 0.5) & "x" & Int(sh + 0.5) & "mm"
     Set s = ActiveLayer.CreateArtisticText(0, 0, Text)
-    s.CenterX = x: s.BottomY = Y + 5
+    s.CenterX = X: s.BottomY = Y + 5
   Next
 End Sub
 
@@ -53,39 +53,18 @@ Public Sub 
 
   For Each s In brk1
     Set sh = ActivePage.SelectShapesFromRectangle(s.LeftX, s.TopY, s.RightX, s.BottomY, True)
-    sh.Shapes.All.Group
+    sh.Shapes.All.group
     s.Delete
   Next
 End Sub
 
-Private Function 对角线角度(x1 As Double, y1 As Double, x2 As Double, y2 As Double) As Double
-  pi = 4 * VBA.Atn(1) ' 计算圆周率'
-  对角线角度 = VBA.Atn((y2 - y1) / (x2 - x1)) / pi * 180
-End Function
-
-Public Sub 角度转平()
-  ActiveDocument.ReferencePoint = cdrCenter
-  Dim sr As ShapeRange '定义物件范围
-  Set sr = ActiveSelectionRange
-
-  Dim x1 As Double, y1 As Double, x2 As Double, y2 As Double
-  Dim Shift As Long
-  Dim b As Boolean
-
-  b = ActiveDocument.GetUserArea(x1, y1, x2, y2, Shift, 10, False, 306)
-  If Not b Then
-    a = 对角线角度(x1, y1, x2, y2)
-    sr.Rotate -a
-  End If
-End Sub
-
 
 ' 实践应用: 选择物件群组,页面设置物件大小,物件页面居中
 Public Function 群组居中页面()
   ActiveDocument.Unit = cdrMillimeter
   Dim OrigSelection As ShapeRange, sh As Shape
   Set OrigSelection = ActiveSelectionRange
-  Set sh = OrigSelection.Group
+  Set sh = OrigSelection.group
   
   ' MsgBox "选择物件尺寸: " & sh.SizeWidth & "x" & sh.SizeHeight
   ActivePage.SetSize Int(sh.SizeWidth + 0.9), Int(sh.SizeHeight + 0.9)
@@ -203,7 +182,10 @@ Public Function 
   Debug.Print Str
 
   Dim s1 As Shape
-  Set s1 = ActiveLayer.CreateParagraphText(0, 0, 100, 150, Str, Font:="华文中宋")
+' Set s1 = ActiveLayer.CreateParagraphText(0, 0, 100, 150, Str, Font:="华文中宋")
+  X = ssr.FirstShape.LeftX - 100
+  Y = ssr.FirstShape.TopY
+  Set s1 = ActiveLayer.CreateParagraphText(X, Y, X + 90, Y - 150, Str, Font:="华文中宋")
 End Function
  
 '// 实现Excel里分类汇总功能
@@ -237,4 +219,290 @@ Private Function 
 End Function
 
 
+' 两个端点的坐标,为(x1,y1)和(x2,y2) 那么其角度a的tan值: tana=(y2-y1)/(x2-x1)
+' 所以计算arctan(y2-y1)/(x2-x1), 得到其角度值a
+' VB中用atn(), 返回值是弧度,需要 乘以 PI /180
+Private Function lineangle(x1, y1, x2, y2) As Double
+  pi = 4 * VBA.Atn(1) ' 计算圆周率
+  If x2 = x1 Then
+    lineangle = 90: Exit Function
+  End If
+  lineangle = VBA.Atn((y2 - y1) / (x2 - x1)) / pi * 180
+End Function
+
+Public Function 角度转平()
+  On Error GoTo ErrorHandler
+'  ActiveDocument.ReferencePoint = cdrCenter
+  Set sr = ActiveSelectionRange
+  Set nr = sr.LastShape.DisplayCurve.Nodes.All
+
+  If nr.Count = 2 Then
+    x1 = nr.FirstNode.PositionX: y1 = nr.FirstNode.PositionY
+    x2 = nr.LastNode.PositionX: y2 = nr.LastNode.PositionY
+    a = lineangle(x1, y1, x2, y2): sr.Rotate -a
+    ' sr.LastShape.Delete   '// 删除参考线
+  End If
+ErrorHandler:
+End Function
+
+Public Function 自动旋转角度()
+  On Error GoTo ErrorHandler
+'  ActiveDocument.ReferencePoint = cdrCenter
+  Set sr = ActiveSelectionRange
+  Set nr = sr.LastShape.DisplayCurve.Nodes.All
+
+  If nr.Count = 2 Then
+    x1 = nr.FirstNode.PositionX: y1 = nr.FirstNode.PositionY
+    x2 = nr.LastNode.PositionX: y2 = nr.LastNode.PositionY
+    a = lineangle(x1, y1, x2, y2): sr.Rotate 90 + a
+    sr.LastShape.Delete   '// 删除参考线
+  End If
+ErrorHandler:
+End Function
+
 
+Public Function 交换对象()
+  Set sr = ActiveSelectionRange
+  If sr.Count = 2 Then
+    X = sr.LastShape.CenterX: Y = sr.LastShape.CenterY
+    sr.LastShape.CenterX = sr.FirstShape.CenterX: sr.LastShape.CenterY = sr.FirstShape.CenterY
+    sr.FirstShape.CenterX = X: sr.FirstShape.CenterY = Y
+  End If
+End Function
+
+
+'//  ===================================================
+Private Sub btn_autoalign_byrow_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
+    If get_events("btn_autoalign_byrow", Shift, Button) = "exit" Then Exit Sub
+    autogroup("group_lines", 16 + Shift).CreateSelection
+End Sub
+Private Sub btn_autoalign_bycolumn_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
+    If get_events("btn_autoalign_bycolumn", Shift, Button) = "exit" Then Exit Sub
+    autogroup("group_lines", 13 + Shift).CreateSelection
+End Sub
+Private Sub btn_autogroup_byrow_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
+    If get_events("btn_autogroup_byrow", Shift, Button) = "exit" Then Exit Sub
+    autogroup("group_lines", 6).CreateSelection
+End Sub
+Private Sub btn_autogroup_bycolumn_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
+    If get_events("btn_autogroup_bycolumn", Shift, Button) = "exit" Then Exit Sub
+    autogroup("group_lines", 3).CreateSelection
+End Sub
+Private Sub btn_autogroup_bysquare_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
+    If get_events("btn_autogroup_bysquare", Shift, Button) = "exit" Then Exit Sub
+    autogroup("group").CreateSelection
+End Sub
+Private Sub btn_autogroup_byshape_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
+    If get_events("btn_autogroup_byshape", Shift, Button) = "exit" Then Exit Sub
+    autogroup("group", 1).CreateSelection
+End Sub
+
+Public Sub begin_func(Optional undoname = "nul", Optional units = cdrMillimeter, Optional undogroup = True, Optional optimize = True, Optional sett = "before")
+        ActiveDocument.SaveSettings sett
+        ActiveDocument.Unit = units
+        If undogroup Then ActiveDocument.BeginCommandGroup undoname
+        Application.Optimization = optimize
+        EventsEnabled = Not optimize
+End Sub
+
+Public Sub end_func(Optional undogroup = True, Optional sett = "before")
+    cure_app undogroup
+    ActiveDocument.RestoreSettings sett
+End Sub
+
+Sub cure_app(Optional undogroup = True)
+    EventsEnabled = True
+    Application.Optimization = False
+    Application.Refresh
+    DoEvents
+    If undogroup Then ActiveDocument.EndCommandGroup
+End Sub
+
+Public Function collect_arr(arr, ci, ki)
+    lim = UBound(arr)
+    For k = 1 To lim
+        If arr(ki, k) > 0 Then
+            arr(ci, k) = k
+            If ki <> ci Then arr(ki, k) = Empty
+            If ci <> k And ki <> k Then arr = collect_arr(arr, ci, k)
+        End If
+    Next k
+    'If ki <> ci Then arr(ki, ki) = Empty
+    collect_arr = arr
+End Function
+
+Public Function autogroup(Optional group As String = "group", Optional shft = 0, Optional sss As Shapes = Nothing, Optional undogroup = True) As ShapeRange
+    Dim sr As ShapeRange, sr_all As ShapeRange, os As ShapeRange
+    Dim sp As SubPaths
+    Dim arr()
+    Dim s As Shape
+    If sss Is Nothing Then Set os = ActiveSelectionRange Else Set os = sss.All
+'On Error GoTo errn
+    If ActiveSelection.Shapes.Count > 0 Then
+        begin_func "autogroup" & group, cdrMillimeter, undogroup
+        gcnt = os.Shapes.Count
+        ReDim arr(1 To gcnt, 1 To gcnt)
+        Set sr_all = ActiveSelectionRange
+        sr_all.RemoveAll
+        If group = "group_lines" Then
+            For i = 1 To gcnt
+                If shft = 3 Or shft = 13 Or shft = 14 Then
+                    coord = Int(os.Shapes(i).CenterX)
+                Else
+                    coord = Int(os.Shapes(i).CenterY)
+                End If
+                fnd = False
+                For k = 1 To gcnt
+                    If arr(k, 1) > 0 Then
+                        If arr(k, 2) = coord Then
+                            arr(k, 1) = arr(k, 1) + 1
+                            arr(k, 2 + arr(k, 1)) = i
+                            fnd = True
+                            Exit For
+                        End If
+                    Else
+                        Exit For
+                    End If
+                Next k
+                If Not fnd Then
+                    arr(k, 1) = 1
+                    arr(k, 2) = coord
+                    arr(k, 3) = i
+                End If
+            Next i
+            Set sr = ActiveSelectionRange
+            For i = 1 To gcnt
+                If arr(i, 1) > 0 Then
+                    sr.RemoveAll
+                    For k = 3 To gcnt
+                        If arr(i, k) > 0 Then sr.Add os.Shapes(arr(i, k))
+                    Next k
+                    If sr.Shapes.Count > 0 Then
+                        sr.CreateSelection
+                        If shft = 13 Then
+                            sr.AlignAndDistribute cdrAlignDistributeHNone, cdrAlignDistributeVDistributeSpacing
+                        ElseIf shft = 14 Then
+                            sr.AlignAndDistribute cdrAlignDistributeHNone, cdrAlignDistributeVDistributeCenter
+                        ElseIf shft = 16 Then
+                            sr.AlignAndDistribute cdrAlignDistributeHDistributeSpacing, cdrAlignDistributeVNone
+                        ElseIf shft = 17 Then
+                            sr.AlignAndDistribute cdrAlignDistributeHDistributeCenter, cdrAlignDistributeVNone
+                        Else
+                            sr.group
+                        End If
+                        sr_all.AddRange sr
+                    End If
+                End If
+            Next i
+        Else
+            ReDim arr(1 To gcnt, 1 To gcnt)
+            ActiveDocument.Unit = cdrTenthMicron
+            sgap = 10
+            If shft = 2 Or shft = 3 Or shft = 6 Or shft = 7 Then
+                os.RemoveAll
+                For Each s In ActiveSelectionRange.Shapes
+                    os.Add ActivePage.SelectShapesFromRectangle(s.LeftX - sgap, s.BottomY - sgap, s.RightX + sgap, s.TopY + sgap, True)
+                Next s
+            End If
+            
+            For i = 1 To os.Shapes.Count
+                Set s1 = os.Shapes(i)
+                arr(i, i) = i
+                For j = 1 To os.Shapes.Count
+                    Set s2 = os.Shapes(j)
+                    If s2.LeftX < s1.RightX + sgap And s2.RightX > s1.LeftX - sgap And s2.BottomY < s1.TopY + sgap And s2.TopY > s1.BottomY - sgap Then
+                        If shft = 1 Or shft = 3 Or shft = 5 Or shft = 7 Then
+                            Set isec = s1.Intersect(s2)
+                            If Not isec Is Nothing Then
+                                arr(i, j) = j
+                                isec.CreateSelection
+                                isec.Delete
+                            End If
+                        Else
+                            arr(i, j) = j
+                        End If
+                    End If
+                Next j
+            Next i
+            
+            For i = 1 To gcnt
+                arr = collect_arr(arr, i, i)
+            Next i
+            
+            Set sr = ActiveSelectionRange
+
+            For i = 1 To gcnt
+                sr.RemoveAll
+                inar = 0
+                For j = 1 To gcnt
+                    If arr(i, j) > 0 Then
+                        sr.Add os.Shapes(j)
+                        inar = inar + 1
+                    End If
+                Next j
+                If inar > 1 Then
+                    If group = "group" Then
+                        If shft < 4 Then sr_all.Add sr.group
+                    Else
+                        If group = "front" Then
+                            sr.Sort "@shape1.com.zOrder > @shape2.com.zOrder"
+                        ElseIf group = "back" Then
+                            sr.Sort "@shape1.com.zOrder < @shape2.com.zOrder"
+                        Else
+                            sr.Sort "@shape1.width*@shape1.height < @shape2.width*@shape2.height"
+                        End If
+                        Set fs = sr.FirstShape
+                        Set ls = sr.LastShape
+                        For Each s In sr.Shapes
+                            If Not s Is ls And Not s Is fs Then
+                                If group = "autocut" Then
+                                    Set isec = ls.Intersect(s)
+                                    If Not isec Is Nothing Then
+                                        If isec.Curve.Area = s.Curve.Area Then
+                                            Set ls = fs.Trim(ls, False)
+                                        Else
+                                            Set ls = fs.Weld(ls, False)
+                                        End If
+                                        isec.Delete
+                                    End If
+                                Else
+                                    Set fs = s.Weld(fs, False, False)
+                                End If
+                            End If
+                        Next s
+                        If group = "weld" Then
+                            Set ls = fs.Weld(ls, False)
+                        Else
+                            Set ls = fs.Trim(ls, False)
+                        End If
+                        sr_all.Add ls
+                    End If
+                Else
+                    If sr.Shapes.Count > 0 Then sr_all.AddRange sr
+                End If
+            Next i
+        End If
+        Set autogroup = sr_all
+    End If
+errn:
+    end_func undogroup
+End Function
+
+Sub auto_cut()
+    autogroup("autocut").CreateSelection
+End Sub
+Sub auto_big_small()
+    autogroup("big").CreateSelection
+End Sub
+Sub auto_group()
+    autogroup.CreateSelection
+End Sub
+Sub auto_weld()
+    autogroup("weld").CreateSelection
+End Sub
+Sub auto_group_lines()
+    autogroup("group_lines", 6).CreateSelection
+End Sub
+Sub auto_group_columns()
+    autogroup("group_lines", 3).CreateSelection
+End Sub

+ 13 - 4
VBA_FORM.frm

@@ -4,7 +4,7 @@ Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} VBA_FORM
    ClientHeight    =   4830
    ClientLeft      =   45
    ClientTop       =   390
-   ClientWidth     =   4710
+   ClientWidth     =   5415
    OleObjectBlob   =   "VBA_FORM.frx":0000
    StartUpPosition =   1  '所有者中心
 End
@@ -13,7 +13,11 @@ Attribute VB_GlobalNameSpace = False
 Attribute VB_Creatable = False
 Attribute VB_PredeclaredId = True
 Attribute VB_Exposed = False
-Private Sub CB_AQX_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
+Private Sub btn_autoalign_bycolumn_Click()
+  autogroup("group", 1).CreateSelection
+End Sub
+
+Private Sub CB_AQX_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
   If Button = 2 Then
     Tools.guideangle ActiveSelectionRange, 0#   ' 右键 0距离贴紧
   ElseIf Shift = fmCtrlMask Then
@@ -35,6 +39,10 @@ Private Sub CB_JDZP_Click()
   Tools.角度转平
 End Sub
 
+Private Sub CB_JHDX_Click()
+  Tools.交换对象
+End Sub
+
 Private Sub CB_PLBZ_Click()
   Tools.批量标注
 End Sub
@@ -59,12 +67,13 @@ Private Sub CB_VBA_Click()
   MsgBox "你好 CorelVBA!"
 End Sub
 
-Private Sub CB_VBA_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
+Private Sub CB_VBA_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
   CB_VBA.BackColor = RGB(255, 0, 0)
 End Sub
 
-Private Sub CommandButton1_Click()
 
+Private Sub CB_ZDJD_Click()
+  Tools.自动旋转角度
 End Sub
 
 Private Sub ZNQZ_Click()

BIN
VBA_FORM.frx


+ 18 - 0
快捷键.bas

@@ -0,0 +1,18 @@
+Attribute VB_Name = "快捷键"
+Sub 木头人群组()
+  autogroup("group", 1).CreateSelection
+End Sub
+
+Sub 角转平()
+  Tools.角度转平
+End Sub
+
+Sub 对象交换()
+  Tools.交换对象
+End Sub
+
+Sub 安全线()
+    Tools.guideangle ActiveSelectionRange, 0#   ' 右键 0距离贴紧
+End Sub
+
+