我已经使用多种来源和我自己的知识编写/编译了代码,但是它一直给我错误。我是Word VBA的新手,所以很难调试它。 Word上的表包含标题,我使用的Excel模板具有与单词表不同的布局,因此我需要根据标题对值进行排序,并将它们插入到Excel模板中的相应列中。最后的模板应该保存为不同的工作簿,并且应该清除模板中的值。
我得到的错误是:如果我将oCell设置为范围,我在“oCell.Value”部分出现编译错误,但是,当我将oCell设置为对象时,我在“Set rText = oTable.Cell(i)上得到错误5941” ,n).Range“。我无法弄清楚如何。另外,如果你告诉我在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 :(得分:1)
当然,你不一致地得到错误并没有帮助,但是你如何整合Excel和Word对象模型有很多问题。我可以看出为什么有人会像你那样试图接近它。 VBA试图非常宽容并猜测人们的意思,但它并不总是正确,这可能是代码间歇性而不是一致性失败的原因。
一个基本问题是,当您需要文本内容时,应该使用Word.Range的Text属性。 VBA通常会为你做这件事,至少在一切都在Word中时,你不应该把它当作理所当然。例如:If rHeader.Text = "Position" Then
您尝试: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)
。
如评论中所述,您无法将Word.Range对象分配给Excel中的对象。在(2)的基础上,您可以 来执行此操作:Set oCell = rText
。虽然两者都是Range对象,但一个是Excel,另一个是Word - 即使名称显示相同,它们不相同。
为了将Word.Range中的文本分配给Excel中的单元格/范围,您需要更像这样的内容:oCell.Text = rText.Text
(也许也可能是oCell.Value = rText.Text
)
我认为如果你在整个代码执行过程中进行这些更改应该更加一致。