Code:Sub GenerateWordFiles() 'Declare Word application and document objects Dim wdApp As Object 'Word application instance Dim wdDoc As Object 'Word document instance 'Paths for template, output folder, and 2nd workbook Dim TemplatePath As String Dim SavePath As String Dim Macro2Path As String 'Excel variables Dim lastRow As Long, i As Long Dim contract_keys As String, contract_name As String 'Word Table variables Dim tbl1 As Object, tbl2 As Object Dim wb2 As Workbook Dim wsCP As Worksheet 'Connected Parties sheet Dim CP_LastRow As Long 'Last row of CP output Dim CP_Row As Long 'Loop counter Dim tbl1_Row As Long, tbl2_Row As Long 'Read paths from RUNNNN sheet ''Change below ThisWorkbook.Sheets("RUNNNN") with your Workbook1 sheet name '''Change H2,J3,J4 to your path addresses Set wb1 = ThisWorkbook.Sheets("RUNNNN") TemplatePath = wb1.Range("J4").Value 'Word template SavePath = wb1.Range("J3").Value 'Output folder Macro2Path = wb1.Range("J2").Value '2nd workbook file path startNum = wb1.Range("J1").Value 'Create output folder if not exists If Dir(SavePath, vbDirectory) = "" Then MkDir SavePath 'Get last row in column A lastRow = Cells(Rows.Count, "A").End(xlUp).Row 'Create Word application Set wdApp = CreateObject("Word.Application") wdApp.Visible = True 'Show Word 'Open the second workbook containing the macro Set wb2 = Workbooks.Open(Macro2Path) 'Loop through input rows starting from value in RUNNNN J1 For i = startNum To lastRow 'Read contract values contract_keys = wb1.Cells(i, "A").Value contract_name = wb1.Cells(i, "B").Value 'Send contract key into wb2 ''Change sheet name where it want to place the contract_keys, mention that sheet name ''If you want to place it in multiple places, copy the same below line code extra and ''change the sheet name and range below. wb2.Sheets("Sheet1").Range("D2").Value = contract_keys 'Run macro in second workbook Application.Run "'" & wb2.Name & "'!PopulateAndSortCPsDetails" 'Set reference to CP output sheet after macro runs ''If the output needs to pull from different sheet then change the name below ''If the output wants to pull from multiple sheet replace the same line ''again below with different Set Variable Set wsCP = wb2.Sheets("Connected Parties Check") 'Open the Word template for this contract Set wdDoc = wdApp.Documents.Open(TemplatePath) 'Replace the tag with contract name ReplaceTag wdDoc, "<<Contract_Name>>", contract_name '------------------ TABLE PROCESSING BEGINS ---------------------------- 'Get references to Table 1 and Table 2 Set tbl1 = wdDoc.Tables(1) Set tbl2 = wdDoc.Tables(2) 'Find last row of data from A11 downward CP_LastRow = wsCP.Cells(wsCP.Rows.Count, "A").End(xlUp).Row '----------------------------------------------------- ' TABLE 1 ? Insert/Delete rows based on CP output '----------------------------------------------------- 'Ensure table has correct number of rows AdjustWordTableRows tbl1, CP_LastRow - 10 'Subtract 10 because data starts at row 11 'Fill Table 1 rows tbl1_Row = 2 'Assuming row 1 is header For CP_Row = 11 To CP_LastRow tbl1.Cell(tbl1_Row, 1).Range.Text = wsCP.Cells(CP_Row, "F").Value tbl1_Row = tbl1_Row + 1 Next CP_Row '----------------------------------------------------- ' TABLE 2 ? Only authorised rows (Column M) '----------------------------------------------------- 'Clear all existing data rows in Table 2 (except header) AdjustWordTableRows tbl2, 0 tbl2_Row = 2 For CP_Row = 11 To CP_LastRow If wsCP.Cells(CP_Row, "M").Value = "Authorised" Then 'Add new row in Table 2 tbl2.Rows.Add 'Write Column L value into Table 2 tbl2.Cell(tbl2_Row, 1).Range.Text = wsCP.Cells(CP_Row, "L").Value tbl2_Row = tbl2_Row + 1 End If Next CP_Row '------------------ TABLE PROCESSING ENDS ---------------------------- 'Construct file name ''Here contract_name will be your output extra sub folder will create Dim FileName As String FileName = SavePath & "" & contract_name 'Create subfolder if missing If Dir(FileName, vbDirectory) = "" Then MkDir FileName 'Final file path ''File name will pick first 2 characters FileName = FileName & "\CDD_" & Left(contract_name, 2) & ".docx" 'Delete existing file if already exists If Dir(FileName) <> "" Then Kill FileName 'Save Word file wdDoc.SaveAs2 FileName 'Close Word file wdDoc.Close False Next i 'Quit Word application wdApp.Quit MsgBox "All Word files generated successfully!", vbInformation End Sub Sub ReplaceTag(doc As Object, findText As String, replaceText As String) With doc.Content.Find .Text = findText .Replacement.Text = replaceText .Forward = True .Wrap = 1 .Execute Replace:=2 End With End Sub Sub AdjustWordTableRows(tbl As Object, requiredRows As Long) Dim currentRows As Long currentRows = tbl.Rows.Count - 1 'Minus header 'Add missing rows While currentRows < requiredRows tbl.Rows.Add currentRows = currentRows + 1 Wend 'Remove extra rows While currentRows > requiredRows And requiredRows >= 0 tbl.Rows(tbl.Rows.Count).Delete currentRows = currentRows - 1 Wend End Sub Sub CleanWordTableEmptyRows(tbl As Object) Dim r As Long For r = tbl.Rows.Count To 2 Step -1 'Skip header row If Trim(tbl.Cell(r, 1).Range.Text) = "" Or _ Trim(Replace(tbl.Cell(r, 1).Range.Text, Chr(13), "")) = "" Then tbl.Rows(r).Delete End If Next r End Sub




Reply With Quote

Bookmarks