2016-12-02 7 views
0

私は、セクションが隠しテキストタグ<アンサー> ...いくつかのテーブル... </Answers>で囲まれたWord文書を持っています。 Wordマクロは、これらのタグ間のテキストの範囲を返すことができます(ブックマークに使用されましたが、移動する必要がありました)。Wordテーブルから情報を取得する

ExcelからWord文書を開き、タグ間の範囲を取得し、そのブロック内のテーブルを繰り返し、各行からいくつかのセルを取得します。これらのセルデータは、新しいExcelシートの一部の行に書き込まれます。

多くのWord/Excelのオートメーションが見られましたが、2つのテキストの間にその範囲を取得するよう促したものはありませんでした。最良の方法は、WordのマクロRetrieveRange(strTagName、rngTextBlock)を実行してrngTextBlockの範囲を「回答」に返すことですが、これは不可能です。

バックグラウンドとして:.docmファイルは、各生徒の採点を含むようにExcelに転送したい回答と最大点を持つ試験用紙です。

答えて

0

さらにいくつかのサイトがありますが、WordのSELECTIONスティックを使用して何かを検索するのではなく、私が必要としていたC#の例が発生しました。私は今、2つのタグ間のテキストブロックを見つけることができますが、そのテーブルとテーブルの行を横断しても失敗します。コンパイラエラー(Word自体で作業中)はありませんが、外部リンクがありません。

Function CreateSEWorksheet() As Boolean 
    ' Find <ANSWERS> in Word Document, and traverse all tables and write them as rows in worksheet 

    Dim wdrngStart As Word.Range 
    Dim wdrngEnd As Word.Range 
    Dim wdrngAnswers As Word.Range 
    Dim wdTable As Word.Table 
    Dim wdRow As Word.Row 
    Dim strStr As String 
    Dim bGoOn As Boolean 

' Following set elsewhere: 
' Set WDApp = GetObject(class:="Application.Word") 
' Set WDDoc = WDApp.Documents.Open(filename:="filespec", visible:=True) 

    Set wdrngStart = WDDoc.Range ' select entire document - will shrink later 
    Set wdrngEnd = WDDoc.Range 
    Set wdrngAnswers = WDDoc.Range 

    ' don't use Word SELECT/SELECTION but use ranges instead when finding tags. 
    If wdrngStart.Find.Execute(findText:="<ANSWERS>", MatchCase:=False) Then 
    ' found! 
    wdrngAnswers.Start = wdrngStart.End 
    If wdrngEnd.Find.Execute(findText:="</ANSWERS>", MatchCase:=False) Then 
     wdrngAnswers.End = wdrngEnd.Start 
     bGoOn = True 
    Else 
     ' no closing tag found 
     bGoOn = False 
    End If 
    Else 
    'no opening tag found 
    bGoOn = False 
    End If 

If bGoOn Then 
    For Each wdTable In wdrngAnswers.Tables 
     ' ** below doesn't work anymore: object doesn't support this method ** 
     For Each wdRow In wdTable 
     ' as example, take column 4 of each row 
     strStr = wdRow.Cells(4).Range.Text 
     strStr = Left(strStr, Len(strStr) - 2) ' remove end of cell markers 
     Debug.Print strStr 
     Next 
    Next 
    CreateSEWorksheet = True 
Else 
    CreateSEWorksheet = False 
End If 

End Function 
関連する問題