I'd start with something like this
The For Each ... Next is the loop that you were looking for
There's also a simple test WB I used to play with
Option Explicit
Sub CopyAssociates()
Dim wbNew As Workbook, wbOld As Workbook
Dim wsNew As Worksheet, wsOld As Worksheet, ws As Worksheet, wsAssociates As Worksheet
Dim rAssociates As Range, rAssociate As Range
Dim sOldPath As String, sNewPath As String
Application.ScreenUpdating = False
Set wbOld = ThisWorkbook
sOldPath = wbOld.Path
Set wsAssociates = wbOld.Worksheets("AssocNames")
Set rAssociates = wsAssociates.Cells(1, 1).CurrentRegion
For Each rAssociate In rAssociates.Cells
If Not pvtWsExists(rAssociate.Value & " Statement") And Not pvtWsExists(rAssociate.Value & " Detail") Then
Call MsgBox(rAssociate.Value & " does not have 2 worksheets", vbCritical + vbOKOnly, "CopyAssociates")
GoTo NextAssociate
End If
Sheets(Array(rAssociate.Value & " Statement", rAssociate.Value & " Details")).Copy
Set wbNew = ActiveWorkbook
'delete any blank WS that might have been created
On Error Resume Next
Application.DisplayAlerts = False
For Each ws In wbNew.Worksheets
If ws.Name <> rAssociate.Value & " Statement" And ws.Name <> rAssociate.Value & " Details" Then ws.Delete
Next
Application.DisplayAlerts = True
On Error GoTo 0
'build name = this path + / + PI
sNewPath = wbOld.Path & Application.PathSeparator & rAssociate.Value & ".xlsx"
'delete new WB if its there
pvtDeleteFile (sNewPath)
'save and close new PI WB
wbNew.SaveAs (sNewPath)
wbNew.Close (False)
wbOld.Activate
NextAssociate:
Next
Application.ScreenUpdating = True
End Sub
Private Sub pvtDeleteFile(s As String)
'delete new WB if its there
On Error Resume Next
Application.DisplayAlerts = False
Kill s
Application.DisplayAlerts = True
On Error GoTo 0
End Sub
Private Function pvtWsExists(s As String) As Boolean
Dim i As Long
i = -1
On Error Resume Next
i = ThisWorkbook.Worksheets(s).Index
On Error GoTo 0
pvtWsExists = (i <> -1)
End Function