2017-11-15 17 views
0

항목 수를 기반으로 Excel 통합 문서를 동적으로 만들고 있는데, 실제로 각 통합 문서에 동일한 머리글을 쓰려고합니다. 내 아래 구문은 첫 번째 통합 문서에서 작동하지만 두 번째 새 통합 문서가 만들어지면 오류가 발생합니다.여러 WOrkbos에 대한 머리글 쓰기

이것은 내 구문입니다. 헤더 행이 만들어지는 각 통합 문서에 기록되도록하려면 어떻게해야합니까?

Set xlApp = CreateObject("Excel.Application") 
xlApp.Visible = True 
Do While Not rs1.EOF 
    i = 0 
    x = 1 
    name = rs1.Fields(0).Value 
    Set xlWb = xlApp.Workbooks.Add 
    row = 1 
    xyz = 0  
    Set HeaderWrite = xlWb.Worksheets(1)  
    HeaderWrite.Cells(row, xyz + 1).Value = "Header 1" 
    xyz = xyz + 1 
    HeaderWrite.Cells(row, xyz + 1).Value = "Header 2" 
    xyz = xyz + 1 
    HeaderWrite.Cells(row, xyz + 1).Value = "Header 3" 
    xyz = xyz + 1 
    HeaderWrite.Cells(row, xyz + 1).Value = "Header 4" 
    xyz = xyz + 1 
    HeaderWrite.Cells(row, xyz + 1).Value = "Header 5" 
    xyz = xyz + 1 
    HeaderWrite.Cells(row, xyz + 1).Value = "Header 6" 
    xyz = xyz + 1 
    HeaderWrite.Cells(row, xyz + 1).Value = "Header 7" 
    xyz = xyz + 1 
    HeaderWrite.Cells(row, xyz + 1).Value = "Header 8" 
    xyz = xyz + 1 
    HeaderWrite.Cells(row, xyz + 1).Value = "Header 9" 
    xyz = xyz + 1  
    xlWb.Worksheets(1).Range("$A$2") = name 
    Set xlR = xlWb.Worksheets(1).Range("$N$2") 
    Set rs2 = Db.OpenRecordset("SELECT * FROM MasterDB", dbOpenDynaset) 
    With rs2 
    .MoveLast 
    .MoveFirst 
    Do While Not .EOF 
     xlR.Value = .Fields(0).Value 
     xlR.Offset(ColumnOffset:=1).Value = .Fields(2).Value 
     xlR.Offset(ColumnOffset:=2).Value = "Mainstreem" 
     HeaderWrite.Cells(row, xyz + 1).Value = "Dept_" & i 
     xyz = xyz + 1 
     HeaderWrite.Cells(row, xyz + 1).Value = "Item" & i 
     xyz = xyz + 1 
     HeaderWrite.Cells(row, xyz + 1).Value = "CRN" & i 
     xyz = xyz + 1 
     i = i + 1 
     Debug.Print i 
     If i = 50 Then 
      i = 0 
      x = x + 1 
      xlWb.SaveAs FileName:=sPath & sFile, FileFormat:=xlOpenXMLWorkbook 
      xlWb.Close SaveChanges:=True 
      Set xlWb = xlApp.Workbooks.Add 
      sFile = name & "_" & "SalesLog" & x & ".xlsx" 
      xlWb.Worksheets(1).Range("$C$2") = name 
      Set xlR = xlWb.Worksheets(1).Range("$Q$2") 
     Else 
      Set xlR = xlR.Offset(ColumnOffset:=3) 
     End If 
     .MoveNext 
    Loop 
    .Close 
    End With 
+0

그런 다음이 내에있는 통합 문서를 닫고, 루프 외부에서 워크 시트 개체'HeaderWrite'를 설정하는 루프 ('xlWb.Close SaveChanges : = True') 때문에 워크 시트 객체를 다시 사용할 때 더 이상 사용할 수 없습니다. – YowE3K

+0

@ YowE3K - 설명하는 아. 그러나 루프 내에서 루프를 반복 할 때마다 헤더를 작성하면 헤더 정보를 한 번만 작성하려고합니다. 저것 피하는 것에 대한 생각? – BellHopByDayAmetuerCoderByNigh

+0

처음에'xlWb'를 어디에 설정했는지 그리고 처음에'i'를 설정하는 곳을 모르면 가장 쉬운 해결책이 무엇인지 확신 할 수 없습니다. 워크 북을 생성하고, HeaderWrite 객체를 설정하고, 헤더와 기타 워크 북의 초기화가 필요한 루프를 작성하는 루프 내부에'If i = 0 Then' 문을 넣는 것만 큼 간단 할 것입니다. If If i = 50 Then'블록하여 통합 문서를 닫고'i = 0'을 설정하면됩니다. (그러나 그것은 단지 "내 머리 꼭대기에서 벗어난"제안입니다.) – YowE3K

답변

0

이 완전히 테스트되지 않은,하지만 다행스럽게도 필자는 올바른 장소에 물건을 이동 한 :

Set xlApp = CreateObject("Excel.Application") 
xlApp.Visible = True 
Do While Not rs1.EOF 
    i = 0 
    x = 0 ' was 1 ?? 
    name = rs1.Fields(0).Value 
    Set rs2 = Db.OpenRecordset("SELECT * FROM MasterDB", dbOpenDynaset) 
    With rs2 
    .MoveLast 
    .MoveFirst 
    Do While Not .EOF 
     If i = 0 Then 
      Set xlWb = xlApp.Workbooks.Add 
      row = 1 ' This always stays as 1 ?!?! 
      xyz = 0  
      Set HeaderWrite = xlWb.Worksheets(1)  
      xyz = xyz + 1 : HeaderWrite.Cells(row, xyz).Value = "Header 1" 
      xyz = xyz + 1 : HeaderWrite.Cells(row, xyz).Value = "Header 2" 
      xyz = xyz + 1 : HeaderWrite.Cells(row, xyz).Value = "Header 3" 
      xyz = xyz + 1 : HeaderWrite.Cells(row, xyz).Value = "Header 4" 
      xyz = xyz + 1 : HeaderWrite.Cells(row, xyz).Value = "Header 5" 
      xyz = xyz + 1 : HeaderWrite.Cells(row, xyz).Value = "Header 6" 
      xyz = xyz + 1 : HeaderWrite.Cells(row, xyz).Value = "Header 7" 
      xyz = xyz + 1 : HeaderWrite.Cells(row, xyz).Value = "Header 8" 
      xyz = xyz + 1 : HeaderWrite.Cells(row, xyz).Value = "Header 9" 
      If x = 0 Then 
       HeaderWrite.Range("$A$2") = name 
       Set xlR = HeaderWrite.Range("$N$2") 
      Else 
       HeaderWrite.Range("$C$2") = name 
       Set xlR = HeaderWrite.Range("$Q$2") 
      End If 
     End If 
     xlR.Value = .Fields(0).Value 
     xlR.Offset(ColumnOffset:=1).Value = .Fields(2).Value 
     xlR.Offset(ColumnOffset:=2).Value = "Mainstreem" 
     xyz = xyz + 1 : HeaderWrite.Cells(row, xyz).Value = "Dept_" & i 
     xyz = xyz + 1 : HeaderWrite.Cells(row, xyz).Value = "Item" & i 
     xyz = xyz + 1 : HeaderWrite.Cells(row, xyz).Value = "CRN" & i 
     Set xlR = xlR.Offset(ColumnOffset:=3) 
     i = i + 1 
     Debug.Print i 
     If i = 50 Then 
      i = 0 
      x = x + 1 
      'I moved this up - otherwise I don't think you have a filename 
      sFile = name & "_" & "SalesLog" & x & ".xlsx" 
      xlWb.SaveAs FileName:=sPath & sFile, FileFormat:=xlOpenXMLWorkbook 
      xlWb.Close SaveChanges:=True 
     End If 
     .MoveNext 
    Loop 
    .Close 
    End With