Word / 使用VBA分割word內的表格

最近收到一個有審查意見的word檔

從內容看起來,老師應該是從excel複製貼上的

(圖示裡面的個資都是來自假文產生器,並不是實際檔案)

但是因為要分別給不同的人員

當然可以純手工分割這些表格(我一開始也是這樣)

不過由於這個過程還蠻規律的

1.複製第1列+第2列

2.開新檔案

3.用其中一個欄位的內容為檔案名稱

4.存檔

5.回到原檔案

6.刪掉第2列資料

7.然後再複製第1列 跟 新的第2列資料

重複1~6

所以在純手工之後,嘗試以VBA來處理這個流程

版本1,將原始檔案另存成docm 啟用巨集的格式,編輯與執行VBA

備註:因為程式是直接寫在檔案內,所以在測試時很容易忘記先存檔

然後最後就關閉檔案…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Public Sub 表格分割()
    '取得工作檔案名稱
    Dim workFile As String
    workFile = ActiveDocument.Name
    pathFile = ActiveDocument.Path & Application.PathSeparator & ActiveDocument.Name
    
    '指定文件夾
    'ChangeFileOpenDirectory "C:\Users\edu\Documents\"
    Dim fDialog As FileDialog
    
    ' 建立選擇目錄的對話方塊
    Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
    
    If fDialog.Show Then
    ' 顯示選擇的目錄
        'MsgBox fDialog.SelectedItems(1)
        ChangeFileOpenDirectory fDialog.SelectedItems(1)
    End If

    'ActiveDocument.Tables(1).Select
    Dim mytable As Table
    Set mytable = ActiveDocument.Tables(1)
   
    'Debug.Print mytable.Rows.Count
    
    ' for loop start
    Dim i As Integer
    
    For i = 2 To mytable.Rows.Count
        ActiveDocument.Range(mytable.Rows(1).Range.Start, mytable.Rows(2).Range.End).Select
        
        Selection.Copy
        
        '新增檔案
        Documents.Add Template:="Normal", NewTemplate:=False, DocumentType:=0
        
        '橫式頁面
        If ActiveDocument.PageSetup.Orientation = wdOrientPortrait Then
            ActiveDocument.PageSetup.Orientation = wdOrientLandscape
        Else
            ActiveDocument.PageSetup.Orientation = wdOrientPortrait
        End If
        
        '使用在目的文件中所使用的樣式
        Selection.PasteAndFormat (wdUseDestinationStylesRecovery)
        
        'Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
        
        '指定的表格 在頁面置中
        ActiveDocument.Tables(1).Rows.Alignment = wdAlignRowCenter
        
        '取得儲存格資料 並移除特殊符號
        Dim sName As String
        Dim nName As String
        
        sName = ActiveDocument.Tables(1).Cell(2, 1).Range.Text
        
        '移除表格儲存格最後面的2個特殊符號 ASCII 13 Carriage Return, ASCII 7 Bell
        nName = Left(sName, Len(sName) - 2)
        
        'Debug.Print nName
        'Debug.Print Len(nName)
        
        ActiveDocument.SaveAs2 FileName:=nName & ".docx"
                
        ActiveDocument.Close
        
        '將視窗切換到 工作檔案
        Documents(workFile).Activate
                    
        '刪除表格的第2列資料
        ActiveDocument.Tables(1).Rows(2).Delete
        
     Next i:
    'for loop end
    
     MsgBox "完成,即將關閉檔案"
     
     '不存檔 關閉整個word程式
     Application.Quit SaveChanges:=wdDoNotSaveChanges
    
End Sub

 


版本2,新增一個docm檔案,將原始檔案作為資料來源

部分程式碼是取自 VBA / 使用Word VBA批次轉換成PDF

主要是修改”開始分割表格”的程式碼

備註:ActivaX按鈕的程式碼必須綁定按鈕,也就是程式碼是觸動事件要執行的內容,這在excel也是一樣的用法

(excel還多了2個可以設定執行程式的方式:1.用舊表單的按鈕、2.圖形,都可以指定巨集)

而且程式碼是寫在檔案本身(ThisDocument),而不是在模組

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
Private Sub cmdGO_Click()

    Application.ScreenUpdating = False
    
    Dim i As Integer, j As Integer, f As String, r As String
    
    i = 2
    j = 2
        
    'VBA程式所在的檔案資訊
    Dim FileName As String
    FileName = ActiveDocument.Name
    
    '取出表格內的檔案
    '檔案路徑
    f = Documents(FileName).Tables(1).Cell(i, 2).Range.Text
    '新增檔案命名的依據
    r = Documents(FileName).Tables(1).Cell(i, 3).Range.Text
    
    '去掉word表格內的非列印字元
    f = Left(f, Len(f) - 2)
    r = Left(r, Len(r) - 2)
    
    If f <> "" And r <> "" Then
        While f <> "" And i <= Documents(FileName).Tables(1).Rows.Count
           '檢查檔案是否存在
            If Dir(f) <> "" Then
                '開啟表格內的檔案
                Documents.Open FileName:=f
                
                '取得檔案名稱
                Dim workFile As String
                workFile = ActiveDocument.Name
                
                '取得邊界
                tbMargin = PointsToMillimeters(ActiveDocument.PageSetup.TopMargin)
                lrMargin = PointsToMillimeters(ActiveDocument.PageSetup.RightMargin)
                
                '設定工作資料夾
                '建立選擇目錄的對話方塊
                Dim fDialog As FileDialog
                
                Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
                
                fDialog.Filters.Clear
                
                fDialog.InitialFileName = ActiveDocument.Path & Application.PathSeparator
                
                If fDialog.Show Then
                    '顯示選擇的目錄
                    'MsgBox fDialog.SelectedItems(1)
                    ChangeFileOpenDirectory fDialog.SelectedItems(1)
                End If
                            
                Dim mytable As Table
                Set mytable = ActiveDocument.Tables(1)
               
                'Debug.Print mytable.Rows.Count
                
                ' for loop start
                Dim p As Integer
                
                For p = 2 To mytable.Rows.Count
                    ActiveDocument.Range(mytable.Rows(1).Range.Start, mytable.Rows(2).Range.End).Select
                    
                    Selection.Copy
                    '建立新檔案
                    Documents.Add Template:="Normal", NewTemplate:=False, DocumentType:=0
                    
                    'Debug.Print ActiveDocument.Name
                    
                    '橫式頁面
                    If ActiveDocument.PageSetup.Orientation = wdOrientPortrait Then
                        ActiveDocument.PageSetup.Orientation = wdOrientLandscape
                    Else
                        ActiveDocument.PageSetup.Orientation = wdOrientPortrait
                    End If
                    
                    '設定邊界
                    ActiveDocument.PageSetup.TopMargin = MillimetersToPoints(tbMargin)
                    ActiveDocument.PageSetup.BottomMargin = MillimetersToPoints(tbMargin)
                    ActiveDocument.PageSetup.LeftMargin = MillimetersToPoints(lrMargin)
                    ActiveDocument.PageSetup.RightMargin = MillimetersToPoints(lrMargin)
                    
                    '使用在目的文件中所使用的樣式
                    Selection.PasteAndFormat (wdUseDestinationStylesRecovery)
                                    
                    '段落置中
                    'Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
                    
                    '指定的表格 在頁面置中 (所有資料列置中)
                    ActiveDocument.Tables(1).Rows.Alignment = wdAlignRowCenter
                                    
                    '取得儲存格資料 並移除特殊符號
                    Dim sName As String, nName As String
                    
                    Dim m As Integer
                    
                    '將數文字轉成數字
                    m = CInt(r)
                    
                    sName = ActiveDocument.Tables(1).Cell(2, m).Range.Text
                    
                    '移除表格儲存格最後面的2個特殊符號 ASCII 13 Carriage Return, ASCII 7 Bell
                    nName = Left(sName, Len(sName) - 2)
                    
                    'Debug.Print nName
                    'Debug.Print Len(nName)
                    
                    '儲存檔案
                    ActiveDocument.SaveAs2 FileName:=nName & ".docx"
                                   
                    ActiveDocument.Close
                    
                    '將視窗切換到 工作檔案
                    Documents(workFile).Activate
                    
                    '刪除表格的第2列資料
                    ActiveDocument.Tables(1).Rows(2).Delete
                    
                 Next p:
                'for loop end
                
                '將視窗切換到 工作檔案
                 Documents(workFile).Activate
                 
                 '關閉檔案 不儲存修改
                 ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges
                    
            Else
                 MsgBox "檔案:" & f & "不存在,請查看是否有拼錯字"
            End If
            
            i = i + 1
            f = Documents(FileName).Tables(1).Cell(i, 2).Range.Text
            f = Left(f, Len(f) - 2)
            
            '釋放CPU資源 可以執行其他程序
            DoEvents
                    
        Wend
        
        MsgBox "執行完成"
        
    Else
        MsgBox "請確認表格資料是否完整!!"
        
    End If
        
    Application.ScreenUpdating = True
    
End Sub