0
votes

My Task

Split a Word document into multiple parts based on a delimiter while preserving the text format.

Where I am?

I tried a basic example with one document but without an array and it worked.

Option Explicit

Public Sub CopyWithFormat()
    Dim docDestination As Word.Document
    Dim docSource      As Word.Document

    Set docDestination = ActiveDocument
    Set docSource      = Documents.Add

    docSource.Range.FormattedText = docDestination.Range.FormattedText
    docSource.SaveAs "C:\Temp\" & "test.docx"
    docSource.Close True             
End Sub

Where do I stuck?

I put the whole document into an array and loop through it. Right not I get an error 424 - Object necessary on this line: docDestination.Range.FormattedText = arrNotes(I).

I also tried these four variants without luck:

docDestination.Range.FormattedText = arrNotes(I).Range.FormattedText
docDestination.Range.FormattedText = arrNotes(I).FormattedText
docDestination.Range.FormattedText = arrNotes.Range.FormattedText(I)
docDestination.Range.FormattedText = arrNotes.FormattedText(I)

Could you please help and point me into the right direction on how to access the array properly?

My Code

Option Explicit

Sub SplitDocument(delim As String, strFilename As String)
    Dim docSource      As Word.Document
    Dim docDestination As Word.Document
    Dim I              As Long
    Dim X              As Long
    Dim Response       As Integer
    Dim arrNotes

    Set docSource = ActiveDocument
    arrNotes      = Split(docSource.Range, delim)

    For I = LBound(arrNotes) To UBound(arrNotes)
        If Trim(arrNotes(I)) <> "" Then
            X = X + 1
            Set docDestination = Documents.Add
            docDestination.Range.FormattedText = arrNotes(I) 'throws error 424
            docDestination.SaveAs ThisDocument.Path & "\" & strFilename & Format(X, "0000")
            docDestination.Close True
        End If
    Next I
End Sub

Sub test()
    'delimiter & filename
    SplitDocument "###", "Articles "
End Sub
1

1 Answers

1
votes

Range.FormattedText returns a range object. The Split function, on the other hand, returns an array of strings which don't include formatting. Therefore your code should find the portion of the document you wish to copy and assign that part's FormattedText to a variable declared as Range. That variable could then be inserted into another document.

Private Sub CopyRange()

    Dim Src As Range, Dest As Range
    Dim Arr As Range

    Set Src = Selection.Range
    Set Arr = Src.FormattedText

    Set Dest = ActiveDocument.Range(1, 1)
    Dest.FormattedText = Arr
End Sub

The above code actually works. All you would need to do is to find a way to replace the Split function in your concept with a method that identifies ranges in the source document instead of strings.