Home > Software engineering >  When using vba TextColumns method to split two column a part of a word document, it will affect the
When using vba TextColumns method to split two column a part of a word document, it will affect the

Time:01-13

I have a problem when using vba for column operation.

I want to select an area in a word document that contains several paragraphs, and then I want to split them from one column into two.

My vba code is as follows:

Public Sub testSplitColumn()
    Dim targetDoc As Document
    Dim sourceFileName As String
    
    sourceFileName = "file path"
    Set targetDoc = Documents.Open(sourceFileName, , True)
    targetDoc.Paragraphs(503).range.Select

    'Splitting column on word
    With targetDoc.Paragraphs(503).range.PageSetup.TextColumns
        .SetCount NumColumns:=2
        .EvenlySpaced = True
        .LineBetween = False
    End With
End Sub

It's can run,but the result is wrong.

It will columnize the paragraphs in the entire document, not just the selected paragraphs in the code.

I got a macro code that can achieve the correct effect through the method of word macro recording:

Sub split()
    If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
        ActiveWindow.Panes(2).Close
    End If
    If ActiveWindow.ActivePane.View.Type <> wdPrintView Then
        ActiveWindow.ActivePane.View.Type = wdPrintView
    End If
    With Selection.PageSetup.TextColumns
        .SetCount NumColumns:=2
        .EvenlySpaced = True
        .LineBetween = False
    End With
End Sub

But it's no different from mine.

I'm very confused right now and I don't know what to do, hope you can help me.

CodePudding user response:

As @JerryJeremiah said: you need section breaks before and after your selection. When recording a macro - they will be inserted as well.

I would create a generic sub to insert the section breaks:


Public Sub test_splitTo2Columns()

'your original code
Dim targetDoc As Document
Dim sourceFileName As String

sourceFileName = "file path"
Set targetDoc = Documents.Open(sourceFileName, , True)

'calling the generic function to test with specific paragraph
splitTo2Columns targetDoc.Paragraphs(503).Range

'this will work too - splitting the selected range
splitTo2Columns ActiveDocument.Selection.Range

End Sub


Public Sub splitTo2Columns(rg As Range, Optional fSplitWholeParagraphs As Boolean = True)

Dim rgToSplit As Range
Set rgToSplit = rg.Duplicate

If fSplitWholeParagraphs = True Then
    'in case rg = selection and selection is only a single character
    rgToSplit.Start = rgToSplit.Paragraphs.First.Range.Start
    rgToSplit.End = rgToSplit.Paragraphs.Last.Range.End
End If

insertSectionBreakContinous rgToSplit, wdCollapseStart
insertSectionBreakContinous rgToSplit, wdCollapseEnd

rgToSplit.Start = rgToSplit.Start   1   'move behind first section break
With rg.PageSetup.TextColumns
    .SetCount NumColumns:=2
    .EvenlySpaced = True
    .LineBetween = False
End With

End Sub

Private Sub insertSectionBreakContinous(rg As Range, startEnd As WdCollapseDirection)
Dim rgBreak As Range
Set rgBreak = rg.Duplicate
With rgBreak
    .Collapse startEnd
    .InsertBreak wdSectionBreakContinuous
End With
End Sub


  •  Tags:  
  • Related