2023/08/31

Word / 使用VBA分割word內的表格 番外2 使用書籤

Word / 使用VBA分割word內的表格 番外 
使用word的復原動作來回覆檔案編輯 
回覆的次數是計算編輯次數,也就是程式迴圈數 
不過缺點是如果一次迴圈內進行的編輯不只一次 
這樣迴圈數就不等於編輯次數
後來仔細研究 Can I create an undo transaction in Word or Excel? (VSTO)的程式碼 Sub EditUndo()、Sub EditRedo()、Sub SampleUsage()、Function SetCustomProp() 
總共有3個sub、1個function,發覺沒有想像中的複雜 
因為程式碼最長的 Function SetCustomProp()其實應該用不到,或者我不知道有什麼作用 
Sub EditUndo()跟 Sub EditRedo() 就是自訂的復原動作、取消復原動作 
原作者的用意好像是要透過VSTO來取代內建的快捷鍵 
Sub SampleUsage()是範例 
程式的流程:在要開始紀錄的地方建立書籤;當處理程序結束之後,再移除書籤 
這樣執行的處理就被 增加書籤------刪除書籤,這兩個動作包起來 
而在 Sub EditUndo() 使用 Do Loop While語句 
先執行一個判斷,雖然我也不知道這是在判斷什麼,大概是配合Function SetCustomProp() 
微妙的地方在於
Loop While (ActiveDocument.Undo) And ActiveDocument.Bookmarks.Exists(BM_IN_MACRO)
會先執行 ActiveDocument.Undo ,再回傳值 True 
也因為先執行了 ActiveDocument.Undo ,回復了刪除書籤的動作 
這樣ActiveDocument.Bookmarks.Exists(BM_IN_MACRO) 也變成True 
所以兩個條件都是True,這樣就可以再進入 Do Loop While 
直到 執行 ActiveDocument.Undo 復原建立書籤,也就是沒有書籤了 
於是ActiveDocument.Bookmarks.Exists(BM_IN_MACRO) 變成了False 
這樣就會結束Do Loop 
While Sub EditREdo()也是類似的流程,判斷的依據為是否存在取消復原動作
ActiveDocument.Redo = True
只是不知道我這樣的理解有沒有錯誤
  
所以依照這樣的流程修改了原來的程式 
在迴圈之前,清除已有的復原紀錄,再建立書籤 BM_IN_MACRO
'清除已有的復原動作
ActiveDocument.UndoClear
'建立書籤 
ActiveDocument.Range.Bookmarks.Add "BM_IN_MACRO"
在迴圈之後,移除自訂的書籤 BM_IN_MACRO
ActiveDocument.Bookmarks("BM_IN_MACRO").Delete
然後進入 Do Loop While 先執行 ActiveDocument.Undo,再判斷書籤是否存在 
由於Undo回復的第一個動作就是刪除書籤,復原刪除=沒有刪除,所以書籤是存在的(True) 
這樣就會重複Do Loop While,直到復原的動作進行到建立書籤,復原建立=沒有建立=False
Do 
    ActiveDocument.Undo 
Loop While ActiveDocument.Bookmarks.Exists("BM_IN_MACRO")
  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
Public Sub 表格分割3()

    Application.ScreenUpdating = False
    
    '取得工作檔案名稱
    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
    Dim u As Integer
    
    '紀錄表格初始列數
    u = mytable.Rows.Count
    
    '清除已有的復原動作
    ActiveDocument.UndoClear
    
    '建立書籤
    ActiveDocument.Range.Bookmarks.Add "BM_IN_MACRO"
    
    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
    
    '復原動作
    '移除書籤
    ActiveDocument.Bookmarks("BM_IN_MACRO").Delete
    
    Do
        ActiveDocument.Undo

    Loop While ActiveDocument.Bookmarks.Exists("BM_IN_MACRO")
    
    'Debug.Print ActiveDocument.Bookmarks.Exists("BM_IN_MACRO")
    
    Application.ScreenUpdating = True
        
End Sub
 

0 comments:

張貼留言