将Word表数据传输到Excel表

时间:2016-02-17 07:41:32

标签: excel vba ms-word word-vba

我已经使用多种来源和我自己的知识编写/编译了代码,但是它一直给我错误。我是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

1 个答案:

答案 0 :(得分:1)

当然,你不一致地得到错误并没有帮助,但是你如何整合Excel和Word对象模型有很多问题。我可以看出为什么有人会像你那样试图接近它。 VBA试图非常宽容并猜测人们的意思,但它并不总是正确,这可能是代码间歇性而不是一致性失败的原因。

  1. 一个基本问题是,当您需要文本内容时,应该使用Word.Range的Text属性。 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中的文本分配给Excel中的单元格/范围,您需要更像这样的内容:oCell.Text = rText.Text(也许也可能是oCell.Value = rText.Text

  5. 我认为如果你在整个代码执行过程中进行这些更改应该更加一致。