使用VBA从Word中的特定列中选择文本

时间:2016-09-27 21:35:43

标签: vba ms-word

我有一个由分节符分隔的文档。 在每个部分中,我可能有零个或一个列断点。 我想从每个包含2列的部分的第一列中提取文本,如下所示:

For Each oSec In ActiveDocument.Sections
    iSectionStart = oSec.Range.Start
    iSectionEnd = oSec.Range.End
    i = oSec.PageSetup.TextColumns.Count
    If (2 = i) Then
      ' Update the range to only contain the text in textcolumn 1
      ' then select and copy it to a destination string
    End If
 Next oSec

但是,TextColumns对象似乎没有返回列内容的方法。

2 个答案:

答案 0 :(得分:0)

TextColums.Count实际上不是由列分隔数指定的。您可以有2列(即TextColumns.Count = 2)而没有单个列中断。

如果您要创建新文档,请通过键入

将其填入随机文本

=Rand(100)

然后按Enter键并从“布局”选项卡中选择“两列”。您会注意到,您在8页左右的内​​容中得到两列,其中没有任何页面具有列分隔符。

Office对象模型未提供自动选择节中特定页面上的特定列的选项。如果文档实际上具有“列分隔符”,则可以使用“查找”选项查找“列分隔符”,然后从该处选择“范围”,从“页面”开始到使用“查找”选项找到的“列分隔符”字符的开头。你可以看到,这不是一件容易的事。

答案 1 :(得分:0)

由于分栏标记由ASCII值14表示,我所要做的就是查看该部分中的每个单词,直到找到预期的标记

Sub ExtractColumnText()
'
' On pages with no columns, the text is copied to both output files
' On pages with two columns, the column1 text is copied to "C:\DocTemp\Italian.doc"
'                            and column2 text is copied to "C:\DocTemp\English.doc"
'
Dim DestFileNum1 As Long
Dim DestFileNum2 As Long
Dim strDestFile1 As String
Dim strDestFile2 As String
Dim strCol1 As String
Dim strCol2 As String
Dim i As Integer

Dim oSec As Section
Dim oRngCol1 As Range
Dim oRngCol2 As Range
Dim oRngWord As Range

strDestFile1 = "C:\DocTemp\Italian.doc" 'Location of external file
DestFileNum1 = FreeFile()
strDestFile2 = "C:\DocTemp\English.doc" 'Location of external file
DestFileNum2 = DestFileNum1 + 1
Open strDestFile1 For Output As DestFileNum1 
Open strDestFile2 For Output As DestFileNum2

For Each oSec In ActiveDocument.Sections
    Set rngWorking = oSec.Range.Duplicate
    Set oRngCol1 = rngWorking.Duplicate
    oRngCol1.End = rngWorking.End - 1   ' exclude the page break
    Set oRngCol2 = oRngCol1.Duplicate
    If 2 <= oSec.PageSetup.TextColumns.Count Then
        'examine each word in the section until we switch columns
        For Each rngWord In rngWorking.Words
            ' 14 = column break marker
            If 14 = AscW(rngWord.Text) Then             
                oRngCol1.End = rngWord.Start
                oRngCol2.Start = rngWord.End
                GoTo Xloop
            End If
        Next rngWord
    End If
Xloop:   
    oRngCol1.Select
    Print #DestFileNum1, oRngCol1.Text
    oRngCol2.Select
    Print #DestFileNum2, oRngCol2.Text
Next oSec
Close #DestFileNum1
Close #DestFileNum2
MsgBox "Done!"
End Sub