2016-02-17 4 views
0

Я написал/скомпилировал код, используя несколько источников и свои собственные знания, однако он продолжает давать мне ошибки. Я новичок в Word VBA, поэтому пытаюсь его отладить. Таблицы в Word содержат заголовки, а шаблон excel, который я использую, имеет разный формат, чем таблицы слов, поэтому мне нужно сортировать значения в соответствии с заголовками и вставлять их в соответствующий столбец в шаблоне excel. Шаблон в конце должен быть сохранен как обычная книга, а значения в шаблоне должны быть очищены.Перенос данных таблицы Word в таблицу Excel

Ошибка, которую я получаю: я получаю ошибки компиляции в частях «oCell.Value», если я устанавливаю oCell как диапазон, однако, когда я устанавливаю oCell как объект, я получаю ошибку 5941 на «Set rText = oTable.Cell (в диапазоне". Я не могу понять, как это сделать. Кроме того, если вы скажете мне, что реализовать такой код в Excel VBA было бы проще, я с удовольствием сделаю ту же процедуру и в Excel.

Редактировать: Я добавил «Application.Templates.LoadBuildingBlocks», однако он по-прежнему дает ту же ошибку.

Sub Word2ExcelRTM() 
    Dim oDoc As Word.Document, oXlm As Excel.Workbook 
    Dim oTable As Word.Table 
    Dim oRng As Word.Range 
    Dim sFname As String 
    Dim rText As Word.Range 
    Dim rHeader As Word.Range 
    Dim oWrks As Excel.Worksheet 
    Dim oCell As Excel.Range 

    Application.Templates.LoadBuildingBlocks 

    'Change the path in the line below to reflect the name and path of the table document 

    sFname = "C:\Users\KarakaMe\Desktop\transfer requirements into RTM  excel\transfer requirements into RTM excel\RTM Template.xlsx" 
    Set oDoc = ActiveDocument 
    Set oXlm = Workbooks.Open(FileName:=sFname) 
    Set oWrks = oXlm.Worksheets("RTM_FD") 

    'Searches each table in Word Doc 

    For Each oTable In oDoc.Tables 
     If oTable.Rows.Count > 1 And oTable.Columns.Count > 1 Then 
      For i = 2 To oTable.Rows.Count - 1 
       For n = 1 To oTable.Columns.Count - 1 
        Set oRng = oDoc.Range 
        Set rText = oTable.Cell(i, n).Range 
        rText.End = rText.End - 1 
        Set rHeader = oTable.Cell(1, n).Range 
        rHeader = rHeader.End - 1 
        If rHeader = "Position" Then 
         Set oWrks.Cells(oWrks.Rows.Count, 1) = rText 
        ElseIf rHeader = "Anforderung Lastenheft" Then 
         Set oWrks.Cells(oWrks.Rows.Count, 2) = rText 
        ElseIf rHeader = "Kommentar zum Lastenheft" Then 
         Set oWrks.Cells(oWrks.Rows.Count, 3) = rText 
        ElseIf rHeader = "Q TA P t.b.d.*" Then 
         If rText = "P" Then 
          Set oCell = oWrks.Cells(oWrks.Rows.Count, 9) 
          oCell.Value = "X" 
          oCell.Range.HighlightColorIndex = wdDarkYellow 
         ElseIf rText = "Q" Then 
          Set oCell = oWrks.Cells(oWrks.Rows.Count, 7) 
          oCell.Value = "X" 
          oCell.Range.HighlightColorIndex = wdDarkYellow 
         ElseIf rText = "TA" Then 
          Set oCell = oWrks.Cells(oWrks.Rows.Count, 8) 
          oCell.Value = "X" 
          oCell.Range.HighlightColorIndex = wdDarkYellow 
         Else 
         End If 
        Else 
        End If 
       Next n 
      Next i 
     End If 
    Next oTable 
    oXlm.SaveAs (InputBox("Please enter the name of the new file")) 
    MsgBox "Your file is saved" 
    oXlm.Close (False) 
End Sub 
+0

Часть (или, может быть, все) вашей проблемы исходит из того, что VBA не может отличить, к какой объектной модели относятся объекты Range, Cell и, возможно, Table. И Word, и Excel используют эти термины, поэтому вам нужно четко указать VBA. Это делается в операторах «Dim». Вместо Dim x as Range используйте Dim x как Word.Range или как Excel.Range, в зависимости от ситуации. То же самое для ячейки и для таблицы. На самом деле, это хорошая привычка всегда полностью квалифицировать объявления объектов. Кроме того, убедитесь, что вы установили ссылку на библиотеку Excel (Инструменты/Ссылки). –

+0

@cindy Я действительно пробовал это так же, но, к сожалению, я все еще получаю ошибку 5941. Кроме того, еще одно замечание, я не получаю ошибку сразу, код проходит через цикл несколько раз, но дает 5941 после 4-го запуска. –

+0

Вы не можете установить Excel. Изменить на Word.Range - это одно и то же, поэтому оно заманчиво, но объекты не соответствуют. Вам нужен текст из Excel в ячейке Word? Покажите нам другое изменение кода с oCell.Value, чтобы мы могли видеть, что вы там делаете. Я думаю, что вы хотите что-то вроде rText.Text = oCell.Value2 ... –

ответ

1

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

  1. Основная проблема заключается в том, что вы должны использовать свойство Text для Word.Range, если хотите текстовое содержимое. VBA часто будет делать это за вас, по крайней мере, пока все в Word, но вы не должны считать это само собой разумеющимся. Например: If rHeader.Text = "Position" Then

  2. Вы пытаетесь: Set oWrks.Cells(oWrks.Rows.Count, 1) = rText

    Используйте Set ключевое слово, чтобы присвоить объект переменной объекта. Вы могли бы это сделать: Set oCell = oWrks.Cells(oWrks.Rows.Count, 1).Range. Увидеть разницу? oCell - это переменная объекта. Это позволяет вам работать с oCell, а не всегда печатать oWrks.Cells(oWrks.Rows.Count, 1).

  3. Как указано в комментариях, вы не можете назначить объект Word.Range объекту в Excel. Основание на (2), это не вам может это сделать: Set oCell = rText. В то время как оба являются объектами Range, один - Excel, а другой - Word - это не то же самое, хотя имя отображается одинаково.

  4. Для того, чтобы присвоить текст в Word.Range к ячейке/Range в Excel вам нужно что-то больше, как это: oCell.Text = rText.Text (Он, возможно, также будет oCell.Value = rText.Text)

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

+0

Спасибо за ответ, однако даже с этими изменениями он дает ошибки, поэтому я решил перенести таблицы в новый рабочий лист excel как есть и отсортировать их в excel. –

Смежные вопросы