2016-09-07 23 views
1

Excelでマクロを使用してセルをループし、Wordのテンプレートにデータを書き込んでいます。私がデータを取得するためにもっと多くのセルを追加したいと思うまで、すべては完全にうまくいった。名前が "j"の変数の値が25になると、「実行時エラー '5941':コレクションの要求されたメンバーが存在しません」というエラーが表示されます。ExcelセルをループしてWordに書き込む

私はさまざまな行と列を使用して遊んできたし、すべての組み合わせが動作します。 "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

テーブル(1)には何行ありますか?テーブル(1)に24行がある場合、そのようなエラーが発生する可能性があります。 – xidgel

答えて

0

テーブルに十分な行がないように見えます。もしそうなら、ブルートフォース方法は、あなたがそれらを必要として、行を追加することです:

... 
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 ^^^ 
     ... 

私はまた、より説明的な名前にjk、、およびColの名前を変更をお勧めします。 Excelの行/列インデックスとWordテーブルの行/列インデックスがあり、名前が明確でない限り混乱させるのは簡単です。

(注:。。はい、上記のコードは、ゆっくりと不格好、最適化されていないで、yadda yaddaうまくいけば、それはOPを助ける:))

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オブジェクトライブラリへの参照を設定します。

関連する問題