循环通过Excel单元格并将它们写入Word

时间:2016-09-07 15:54:14

标签: excel vba excel-vba loops ms-word

我在Excel中使用宏来遍历单元格并将数据写入Word中的模板。一切都运行得很好,直到我想添加更多单元格来从中获取数据。一切仍然工作正常,除非我的名称“j”的变量值为25,我得到一个错误说“运行时错误'5941':集合中请求的成员不存在。”

我玩过不同的行和列,每个组合都有效。只有当“j”达到25时才会发生错误。当它到达wrd.ActiveDocument.Tables(1).Rows(j) ...行时失败。

Sub Label_ExcelToWord_Single()
    'Variable that stores file path for
    'word template
    Dim strpath As String
    strpath = Cells(28, 8)

    'opens Microsoft Word to edit template
    Call OpenWord

    Set wrd = GetObject(, "Word.Application")
    wrd.Visible = True
    wrd.Activate

    wrd.ActiveDocument.Close savechanges:=False
    wrd.Documents.Open strpath

    'Variables used for loop data manipulation
    Dim k As Integer
    Dim j As Integer
    k = 1
    j = 1

    'Primary loop responsible for exporting Excel
    'data to word template
    For Col = 1 To 3
        For Row = 3 To 32
            wrd.ActiveDocument.Tables(1).Rows(j).Cells(((Row - 3) Mod 7) + k).Range.Text = Cells(Row, Col) & vbCrLf & Cells(Row, Col)
            If k = 7 Then
                k = 0
                j = j + 2
            End If
            If Col = 3 Then
                If Row = 32 Then
                    'When we reach the last cell containing data exit routine
                    Exit Sub
                End If
            End If
            k = k + 1
        Next
    Next
End Sub

2 个答案:

答案 0 :(得分:1)

我认为在Word中使用DocVariables并将数据从Excel单元格推送到DocVariables中要容易得多。最终游戏大致相同,但我认为代码设置和维护更容易。

Sub PushToWord()

Dim objWord As New Word.Application
Dim doc As Word.Document
Dim bkmk As Word.Bookmark
sWdFileName = Application.GetOpenFilename(, , , , False)
Set doc = objWord.Documents.Open(sWdFileName)
'On Error Resume Next

objWord.ActiveDocument.variables("FirstName").Value = Range("FirstName").Value
objWord.ActiveDocument.variables("LastName").Value = Range("LastName").Value
objWord.ActiveDocument.variables("AnotherVariable").Value = Range("AnotherVariable").Value

objWord.ActiveDocument.Fields.Update

'On Error Resume Next
objWord.Visible = True

End Sub

设置MS Word对象库的参考。

答案 1 :(得分:0)

看起来该表可能没有足够的行。如果是这样,蛮力的方法是根据需要添加行:

#ticks .tick:last-child:before {
  content: '$0';
  position: absolute;
  left: -5em; 
  bottom: -5px;
  margin: 0 0 0 0.5em;
}

我还建议将... For Col = 1 To 3 For Row = 3 To 32 ' vvv new lines vvv Do While wrd.ActiveDocument.Tables(1).Rows.Count < j wrd.ActiveDocument.Tables(1).Rows.Add Loop ' ^^^ new lines ^^^ ... jkRow重命名为更具描述性的名称。你有Excel行/列索引和Word表行/列索引,除非名称清楚,否则很容易让它们混淆。

(注意:是的,上面的代码很慢,很笨重,没有优化,yadda yadda。希望它能帮助OP。:))