2016-09-07 2 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 ^^^ 
     ... 

나는 또한 j, k, 및 Col에 대한 더 자세한 설명 이름을 이름을 변경하는 것이 좋습니다. Excel 행/열 인덱스와 Word 테이블 행/열 인덱스가 있으며 이름이 명확하지 않으면 혼동을 일으키기 쉽습니다.

(참고 : 예, 위의 코드는 느리고 투박 최적화되지 않은, 옹알 옹알 잘하면는 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 개체 라이브러리에 대한 참조를 설정하십시오.

관련 문제