2016-12-02 4 views
0

У меня есть документ Word с разделом, окруженным скрытыми текстовыми тегами < Ответы> ... некоторые таблицы ... </Answers>. Макрос Word может возвращать диапазон текста между этими тегами (обычно это закладки, но они должны были идти).Извлечь информацию из таблиц Word

Я хочу, чтобы сделать из Excel, открыть документ Word, получить диапазон между тегами, перебрать таблицы в этом блоке и получить некоторые ячейки из каждой строки. Эти данные ячейки затем записываются в некоторые строки на новом листе Excel.

Я видел много автоматизации Word/Excel, но никто не вдохновлял меня на то, чтобы получить этот диапазон между двумя частями текста. Лучше всего было бы запустить макрос Word RetrieveRange (strTagName, rngTextBlock) в Word, чтобы вернуть диапазон в rngTextBlock для «Ответы», но это кажется невозможным.

В качестве фона: .docm-файл - это экзаменационная бумага с ответами и максимальными точками, которые я бы хотел передать в Excel, чтобы содержать градации для каждого ученика.

ответ

0

Просмотрев еще несколько сайтов, я столкнулся с примером C#, который частично сделал то, что мне нужно: вместо того, чтобы использовать палочку SELECTION от Word, чтобы найти что-то. Теперь я могу найти текстовый блок между двумя тегами, но все равно не удается выполнить его таблицы и строки таблицы. Отсутствие ошибки компилятора (и работа в самом 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 
Смежные вопросы