Hi @MTheDesigner
If you're just replacing a few components, then we can use a select, save, replace rule to do this more quickly.
My understanding or assumption was that you were wanting save and replace all the components in the assembly to create a new design copy.
If that is the case, here is an updated version of the example rule, with some logger lines in place that might help you determine exactly where it is running slowly. Note you might want to turn on the Detailed Trace.
Be sure to open the iLogic Logger to see the information reported.
I hope this helps.
Best of luck to you in all of your Inventor pursuits,
Curtis
http://inventortrenches.blogspot.com
Click the + sign next to the Model browser, and then choose iLogic Log from the list.

Turn on detailed trace

Sub Main
oADoc = ThisApplication.ActiveDocument
'[ example D:\4444\NG-22-4444-001
'oSplit(0) returns "NG"
'oSplit(1) returns "22"
'oSplit(2) returns "4444"
'oSplit(3) returns "001"
'split the string using the dashes
']
oSplit = Split(oADoc.FullFileName, "-")
'extract the old part number
oOldPN = oSplit(2)
'get new part number from user
oNewPN = InputBox("Enter New Part Number", "iLogic", oOldPN)
'skip if the input is blank or the same as the original
If oNewPN = "" Or oNewPN = oName Then Exit Sub
'example retturns "D:\4444"
oOldPath = IO.Path.GetDirectoryName(oADoc.FullFileName)
oNewpath = Replace(oADoc.FullFileName, oOldPN, oNewPN)
If Not System.IO.Directory.Exists(oNewpath) Then
System.IO.Directory.CreateDirectory(oNewpath)
End If
oOccNewFileName = Replace(oADoc.FullFileName, oOldPN, oNewPN)
'save new assembly
oADoc.SaveAs(oOccNewFileName, False)
'process components
Dim oOccs As ComponentOccurrences = oADoc.ComponentDefinition.Occurrences
Call TraverseAssembly(oOccs, oOldPN, oNewPN)
End Sub
Sub TraverseAssembly(oOccs As ComponentOccurrences, oOldPN As String, oNewPN As String)
Dim oList As New ArrayList
Dim oOcc As ComponentOccurrence
For Each oOcc In oOccs
oOccDoc = oOcc.Definition.Document
oOccDocFullName = oOccDoc.fullfilename
Logger.Info("old file name: " & oOccDocFullName)
'skip CC parts, library parts, & virtual components
If TypeOf oOcc.Definition Is VirtualComponentDefinition Or _
oOcc.Definition.IsContentMember Or _
oOccDocFullName.contains("D:Engineering\LibraryFiles") Then
Logger.Info(oOccDocFullName & " skipped.")
Continue For
End If
'replace old part number with new part number
oOccNewFileName = Replace(oOccDoc.fullfilename, oOldPN, oNewPN)
Logger.Info("new file name: " & oOccNewFileName)
'handle occurence if it's document has already been processed
If oList.Contains(oOccDocFullName) Then
Logger.Info(oOccNewFileName & " added to skip list")
Component.Replace(oOcc.Name, oOccNewFileName, True)
End If
'add new name to the list
'so additional occurence of the file
'can be skipped
oList.Add(oOccNewFileName)
If oList.Contains(oOccDocFullName) = False Then
'update iproperty
oPN = Replace(IO.Path.GetFileNameWithoutExtension(oOccDocFullName), oOldPN, oNewPN)
oOccDoc.PropertySets.Item("Design Tracking Properties").Item("Part Number").Value = oPN
Logger.Info("iProperty Updated.")
'save the occurence document
'replaces all occurences of it
'in this assembly
oOccDoc.SaveAs(oOccNewFileName, False)
Logger.Info(oOccNewFileName & " Saved.")
'step into subassembly
If oOcc.DefinitionDocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then
Logger.Info("Stepping into " & oOcc.Name)
Call TraverseAssembly(oOccDoc.ComponentDefinition.Occurrences, oOldPN, oNewPN)
End If
End If
Next
End Sub