【问题标题】:Macro for one-to-many splitting of Word documents [closed]用于一对多拆分 Word 文档的宏 [关闭]
【发布时间】:2011-01-14 12:43:41
【问题描述】:

我有一个几百页长的 Word 文档。

我想用一个宏,根据一定的规则(主要是每个Section中出现一定的字符串)自动创建十几个左右的子文档。

这可能吗?我应该阅读哪些 VBA 函数?有谁知道任何代码示例,它们甚至非常相似,并且我可以根据自己的目的进行自定义?

谢谢

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    我花了一段时间才弄清楚如何做到这一点,即使是 KB 文章。

    首先,您需要将宏放入 Normal.dotm... 在 Word 中打开 C:\Users\Yourname\AppData\Roaming\Microsoft\Templates\Normal.dotm,按 Alt-F11,然后将以下内容粘贴到模块1:

        Sub BreakOnSection()
       Application.ScreenUpdating = False 'Makes the code run faster and reduces screen flicker a bit.
    
       ' Used to set criteria for moving through the document by section.
       Application.Browser.Target = wdBrowseSection
       strBaseFilename = ActiveDocument.Name
       On Error GoTo CopyFailed
    
       'A mail merge document ends with a section break next page.
       'Note: Document may or may not end with a section break,
       For I = 1 To ActiveDocument.Sections.Count
    
          'Select and copy the section text to the clipboard.
          ActiveDocument.Bookmarks("\Section").Range.Copy
    
          'Create a new document to paste text from clipboard.
          Documents.Add
          Selection.Paste
          DocNum = DocNum + 1
          strNewFileName = Replace(strBaseFilename, ".do", "_" & Format(DocNum, "000") & ".do")
         ActiveDocument.SaveAs "C:\Destination\" & strNewFileName
         ActiveDocument.Close
          ' Move the selection to the next section in the document.
         Application.Browser.Next
       Next I
       Application.Quit SaveChanges:=wdSaveChanges
       End
    
    CopyFailed:
        'MsgBox ("No final Section Break in " & strBaseFilename)
        Application.Quit SaveChanges:=wdSaveChanges
        End
    End Sub
    

    保存 Normal.dotm 文件。

    执行此代码会将一个由多个section组成的文档拆分为C:\Destination目录下的多个文档,然后关闭Word。

    您可以通过以下方式从命令行执行此操作:

    "c:\Program Files\Microsoft Office\Office12\WINWORD.EXE" /mBreakOnSection "C:\Path to Source\Document with multiple sections.doc"
    

    要处理目录中的所有 .doc 文件,请按如下方式创建一个批处理文件,然后执行它:

    @ECHO off
    set "dir1=C:\Path to Source"
    echo running
    FOR %%X in ("%dir1%\*.doc") DO "c:\Program Files\Microsoft Office\Office12\WINWORD.EXE" /mBreakOnSection "%%~X"
    echo Done
    pause
    

    【讨论】:

      【解决方案2】:
      Sub SplitFromSectionBreak()
      'use this to split document from section break
      
      
         Dim i
         Selection.HomeKey Unit:=wdStory
         Application.ScreenUpdating = False
      '------ count how much section in document---------
         MsgBox (ActiveDocument.Sections.count - 1 & " Sections Found In This Document")
      '-------set path where file to save----------------
         Dim path As String
         path = InputBox("Enter The Destination Folder You Want To Save Files. ", "Path", "C:\Users\Ashish Saini\Desktop\Section Files\")
      
         For i = 1 To ActiveDocument.Sections.count - 1
          With Selection.Find
          .Text = "^b"
          .Forward = False
          .Execute
          .Text = ""
          End With
      
          Selection.Extend
      
          With Selection.Find
          .Text = "^b"
          .Forward = True
          .Wrap = wdFindStop
          .Execute
          .Text = ""
      
          End With
              Selection.Copy
              Documents.Add
              Selection.Paste
              Call Del_All_SB
      '-----------------------------------------------------------------------
              If Dir(path) = "" Then MkDir path  'If path doesn't exist create one
      
              ChangeFileOpenDirectory path
      
              DocNum = DocNum + 1
              ActiveDocument.SaveAs filename:="Section_" & DocNum & ".doc"
              ActiveDocument.Close
      
          Next i
          path = "c:\"
          ChangeFileOpenDirectory path
      End Sub
      
      Sub Del_All_SB()
      
      ' this macro also associated with Delete_SectionBreaks()
      'TO DELETE ALL SECTIONS IN DOCUMENT
      
      Selection.HomeKey Unit:=wdStory
      Selection.Find.ClearFormatting
      Selection.Find.Replacement.ClearFormatting
      
      With Selection.Find
        .Text = "^12"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
      End With
      Selection.Find.Execute Replace:=wdReplaceAll
      
      End Sub
      

      【讨论】:

        【解决方案3】:

        按页面计数器拆分 word 文档,例如使用 50 步

        Sub Spliter(PartStep)
            If IsEmpty(PartStep) Or Not IsNumeric(PartStep) Then
                 Exit Sub
            End If
            Dim i, s, e, x As Integer
            Dim rgePages As Range
            Dim MyFile, LogFile, DocFile, DocName, MyName, MyPages, FilePath, objDoc
            Set fso = CreateObject("scripting.filesystemobject")
        
            Selection.GoTo What = wdGoToLine, Which = wdGoToFirst
        
            Application.ScreenUpdating = False
        
            ActiveDocument.Repaginate
            MyPages = ActiveDocument.BuiltInDocumentProperties(wdPropertyPages)
        
            DocFile = ActiveDocument.FullName
            intPos = InStrRev(DocFile, ".")
            MyName = Left(DocFile, intPos - 1)
        
            If Not fso.folderexists(MyName) Then
                fso.createfolder (MyName)
                FilePath = MyName
            Else
                FilePath = MyName
            End If
        
            x = 0
            'MsgBox MyPages
            For i = 0 To MyPages Step PartStep
        
                If i >= MyPages - PartStep Then
                    s = e + 1
                    e = MyPages
                Else
                    s = i
                    e = i + (PartStep - 1)
                End If
                'MsgBox (i & " | " & s & " | " & e)
                Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, count:=s
                Set rgePages = Selection.Range
                Selection.GoTo What:=wdGoToPage, Which:=wdGoToAbsolute, count:=e
                rgePages.End = Selection.Bookmarks("\Page").Range.End
                rgePages.Select
                Selection.Copy
                x = x + 1
        
                Set objDoc = Documents.Add
                Selection.GoTo What = wdGoToLine, Which = wdGoToFirst
                Selection.PasteAndFormat (wdFormatOriginalFormatting)
        
                DocName = FilePath & "/" & "part" & Format(x, "000") & ".docx"
                ActiveDocument.SaveAs2 FileName:=DocName, _
                         FileFormat:=wdFormatXMLDocument, _
                         CompatibilityMode:=14
        
                ActiveDocument.Close savechanges:=wdDoNotSaveChanges
            Next i
        
            Set objDoc = Documents.Add
            DocName = FilePath & "/" & "Merg" & ".docx"
                ActiveDocument.SaveAs2 FileName:=DocName, _
                         FileFormat:=wdFormatXMLDocument, _
                         CompatibilityMode:=14
            ActiveDocument.Close savechanges:=wdDoNotSaveChanges
        
            Windows(1).Activate
            ActiveDocument.Close savechanges:=wdDoNotSaveChanges
            Dim oData   As New DataObject 'object to use the clipboard
            oData.SetText Text:=Empty 'Clear
            oData.PutInClipboard 'take in the clipboard to empty it
            Application.Quit
        End Sub
        sub test()
          Call Spliter(50)
        end sub
        

        【讨论】:

        • 如果您多解释一下这段代码在做什么,您的答案会更好。如果你从互联网上复制代码,请确保attributeit
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-23
        • 2010-09-21
        • 2018-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多