Я написал/скомпилировал код, используя несколько источников и свои собственные знания, однако он продолжает давать мне ошибки. Я новичок в 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
Часть (или, может быть, все) вашей проблемы исходит из того, что VBA не может отличить, к какой объектной модели относятся объекты Range, Cell и, возможно, Table. И Word, и Excel используют эти термины, поэтому вам нужно четко указать VBA. Это делается в операторах «Dim». Вместо Dim x as Range используйте Dim x как Word.Range или как Excel.Range, в зависимости от ситуации. То же самое для ячейки и для таблицы. На самом деле, это хорошая привычка всегда полностью квалифицировать объявления объектов. Кроме того, убедитесь, что вы установили ссылку на библиотеку Excel (Инструменты/Ссылки). –
@cindy Я действительно пробовал это так же, но, к сожалению, я все еще получаю ошибку 5941. Кроме того, еще одно замечание, я не получаю ошибку сразу, код проходит через цикл несколько раз, но дает 5941 после 4-го запуска. –
Вы не можете установить Excel. Изменить на Word.Range - это одно и то же, поэтому оно заманчиво, но объекты не соответствуют. Вам нужен текст из Excel в ячейке Word? Покажите нам другое изменение кода с oCell.Value, чтобы мы могли видеть, что вы там делаете. Я думаю, что вы хотите что-то вроде rText.Text = oCell.Value2 ... –