Consulting

Results 1 to 2 of 2

Thread: Merging Portions of Word Documents

  1. #1
    VBAX Newbie
    Joined
    Jan 2017
    Posts
    1
    Location

    Post Merging Portions of Word Documents

    Quote Originally Posted by macropod View Post
    Merging multiple documents is often rather more complex than simply copying & pasting content from one document to another. Problems arise when the documents have different page layouts, headers, footers, page numbering, bookmarks & cross-references, Tables of Contents, Indexes, etc., etc., and especially when those documents have used the same Style names with different definitions. The compromises can be mitigated, though.

    The following macro handles the more common issues that arise when merging documents; it does not attempt to resolve page numbering, Tables of Contents or Indexes. Neither does it attempt to deal with the effects on footnote or endnote numbering & positioning or with the consequences of duplicated bookmarks (only one of which can exist in the merged document) and any corresponding cross-references.

    The macro includes a folder browser. Simply select the folder to process and all documents from that folder will be merged into the active document.
    Sub MergeDocuments()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = wdAlertsNone
    Dim strFolder As String, strFile As String
    Dim DocSrc As Document, DocTgt As Document
    Dim strDocNm As String, Rng As Range, HdFt As HeaderFooter
    strFolder = GetFolder
    If strFolder = "" Then Exit Sub
    Set DocTgt = ActiveDocument
    strDocNm = DocTgt.FullName
    strFile = Dir(strFolder & "\*.doc")
    While strFile <> ""
      If strFolder & "\" & strFile <> strDocNm Then
        Set DocSrc = Documents.Open(FileName:=strFolder & "\" & strFile, AddToRecentFiles:=False, Visible:=False)
        With DocTgt
          Set Rng = .Range.Characters.Last
          With Rng
            .Collapse wdCollapseEnd
            Call LayoutTransfer(DocSrc, DocTgt)
            .FormattedText = DocSrc.Range.FormattedText
            .Collapse wdCollapseEnd
            .InsertBreak Type:=wdSectionBreakNextPage
          End With
          For Each HdFt In .Sections.Last.Headers
            HdFt.LinkToPrevious = False
          Next
          For Each HdFt In .Sections.Last.Footers
            HdFt.LinkToPrevious = False
          Next
          For Each HdFt In .Sections(.Sections.Count - 1).Headers
            With HdFt.Range
              .FormattedText = DocSrc.Sections.Last.Headers(HdFt.Index).Range.FormattedText
              .Characters.Last.Delete
            End With
          Next
          For Each HdFt In .Sections(.Sections.Count - 1).Footers
            With HdFt.Range
              .FormattedText = DocSrc.Sections.Last. Footers(HdFt.Index).Range.FormattedText
              .Characters.Last.Delete
            End With
          Next
        End With
        DocSrc.Close False
      End If
      strFile = Dir()
    Wend
    Set Rng = Nothing: Set DocTgt = Nothing: Set DocSrc = Nothing
    Application.DisplayAlerts = wdAlertsAll
    Application.ScreenUpdating = True
    End Sub
    Sub LayoutTransfer(DocSrc As Document, DocTgt As Document)
    'Document Body variables
    Dim sPageHght As Single, sPageWdth As Single
    Dim sHeaderDist As Single, sFooterDist As Single
    Dim sTMargin As Single, sBMargin As Single
    Dim sLMargin As Single, sRMargin As Single
    Dim sGutter As Single, sGutterPos As Single
    Dim lPaperSize As Long, lGutterStyle As Long
    Dim lMirrorMargins As Long, lVerticalAlignment As Long
    Dim lScnStart As Long, lScnDir As Long
    Dim lOddEvenHdFt As Long, lDiffFirstHdFt As Long
    Dim bTwoPagesOnOne As Boolean, bBkFldPrnt As Boolean
    Dim bBkFldPrnShts As Boolean, bBkFldRevPrnt As Boolean
    Dim bOrientation As Boolean
    'Get Page Setup parameters
    With DocSrc.Sections.First.PageSetup
      lPaperSize = .PaperSize
      lGutterStyle = .GutterStyle
      bOrientation = .Orientation
      lMirrorMargins = .MirrorMargins
      lScnStart = .SectionStart
      lScnDir = .SectionDirection
      lOddEvenHdFt = .OddAndEvenPagesHeaderFooter
      lDiffFirstHdFt = .DifferentFirstPageHeaderFooter
      lVerticalAlignment = .VerticalAlignment
      sPageHght = .PageHeight
      sPageWdth = .PageWidth
      sTMargin = .TopMargin
      sBMargin = .BottomMargin
      sLMargin = .LeftMargin
      sRMargin = .RightMargin
      sGutter = .Gutter
      sGutterPos = .GutterPos
      sHeaderDist = .HeaderDistance
      sFooterDist = .FooterDistance
      bTwoPagesOnOne = .TwoPagesOnOne
      bBkFldPrnt = .BookFoldPrinting
      bBkFldPrnShts = .BookFoldPrintingSheets
      bBkFldRevPrnt = .BookFoldRevPrinting
    End With
    'Set Page Setup parameters
    With DocTgt.Sections.Last.PageSetup
      .GutterStyle = lGutterStyle
      .MirrorMargins = lMirrorMargins
      .SectionStart = lScnStart
      .SectionDirection = lScnDir
      .OddAndEvenPagesHeaderFooter = lOddEvenHdFt
      .DifferentFirstPageHeaderFooter = lDiffFirstHdFt
      .VerticalAlignment = lVerticalAlignment
      .PageHeight = sPageHght
      .PageWidth = sPageWdth
      .TopMargin = sTMargin
      .BottomMargin = sBMargin
      .LeftMargin = sLMargin
      .RightMargin = sRMargin
      .Gutter = sGutter
      .GutterPos = sGutterPos
      .HeaderDistance = sHeaderDist
      .FooterDistance = sFooterDist
      .TwoPagesOnOne = bTwoPagesOnOne
      .BookFoldPrinting = bBkFldPrnt
      .BookFoldPrintingSheets = bBkFldPrnShts
      .BookFoldRevPrinting = bBkFldRevPrnt
      .PaperSize = lPaperSize
      .Orientation = bOrientation
    End With
    End Sub
    Function GetFolder() As String
    Dim oFolder As Object
    GetFolder = ""
    Set oFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Choose a folder", 0)
    If (Not oFolder Is Nothing) Then GetFolder = oFolder.Items.Item.Path
    Set oFolder = Nothing
    End Function
    Is there a way to combine parts of the word documents into the same headings if they both exist in the documents? For example if 2 word documents have section 1.1 and section 2.1 then text from both of them be placed under the same section?

    Thank you,
    George
    Last edited by macropod; 01-24-2017 at 01:30 PM. Reason: Split from http://www.vbaexpress.com/forum/showthread.php?51797-Macro-to-merge-mulitple-word-doc-into-one-word-doc

  2. #2
    Knowledge Base Approver VBAX Guru macropod's Avatar
    Joined
    Jul 2008
    Posts
    4,435
    Location
    That would required something quite different - code that would search through both documents for portions related to a common numbering scheme. This could quickly get quite complex - or quite unreliable - especially when multiple levels are involved and their not exactly paralleled in both documents. Plus there's the question of which portion should come first in the merged document - it might not be the same for every portion.

    By the time a reliable macro was written (for what would have to be a once-off exercise for each scenario), you'd probably have long since completed the job manually.
    Cheers
    Paul Edstein
    [Fmr MS MVP - Word]

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •