2016-09-27 49 views
0

我有一个文档,以分节符分隔。 在每个部分中,我可能有零个或一个分栏符。 我想从一个包含两列,像这样每个部分的第一列中提取文本:使用VBA从Word中的特定列中选择文本

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对象似乎不具备返回列内容的方法。

回答

0

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

如果您例如创建一个新文档,通过键入

=Rand(100)

与随机文本填充它,并打从布局选项卡输入和选择两列。你会注意到,你会得到超过8页左右的两列,其中没有任何页面有列中断。

Office对象模型没有提供一个选项来自动选择一节中特定页面上的特定列。如果文档实际上有分栏符,您可以使用“查找”选项来查找分栏符,然后从页面的开始处选择“范围”,直到您刚刚使用“查找”选项找到的“分栏符”的开始位置。你可以看到,这不是一件小事。

+0

少很多琐碎的比我预期的! – pnswdv

+0

但是,我不需要担心您描述的列中断歧义。在草稿模式下查看时,源文档保证格式为Language1 + ColumnBreak + Language2 + SectionBreak。 – pnswdv

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 
相关问题