Announcements
Attention for Customers without Multi-Factor Authentication or Single Sign-On - OTP Verification rolls out April 2025. Read all about it here.

Hi @philippe.lagrue 

VBA doesn't support lambda expressions so we'll have to rewrite the function to instead loop through the ComponentOccurrencesEnumerator to check if there's already an occurrence with the name.

Something like this should work :slightly_smiling_face:

Option Explicit

Dim name As String
Dim num As Integer
Dim existingOccs As ComponentOccurrencesEnumerator

Sub Main()
    Dim def As AssemblyComponentDefinition
    Set def = ThisApplication.ActiveDocument.ComponentDefinition
    Set existingOccs = def.Occurrences.AllReferencedOccurrences(def)
    num = 1
    name = "Part"
    
    Dim oOcc As ComponentOccurrence
    For Each oOcc In def.Occurrences
        TraverseAndSetNames oOcc
    Next oOcc
    def.Document.Update
End Sub

Sub RenameExisting(oName As String, Optional eOccs As ComponentOccurrencesEnumerator = Nothing)
    Dim existingOccWithName As ComponentOccurrence
    Dim oOcc As ComponentOccurrence
    
    If eOccs Is Nothing Then
        For Each oOcc In existingOccs
            If oOcc.name = oName Then
                Set existingOccWithName = oOcc
                Exit For
            End If
        Next oOcc
    Else
        For Each oOcc In eOccs
            If oOcc.name = oName Then
                Set existingOccWithName = oOcc
                Exit For
            End If
        Next oOcc
    End If
    
    If Not existingOccWithName Is Nothing Then
        existingOccWithName.name = oName & "_old"
    End If
End Sub

Sub RenameOcc(oOcc As ComponentOccurrence)
    oOcc.name = name & num
    num = num + 1
End Sub

Sub TraverseAndSetNames(oOcc As ComponentOccurrence, Optional eOccs As ComponentOccurrencesEnumerator = Nothing)
    RenameExisting name & num, eOccs
    RenameOcc oOcc
    
    If oOcc.DefinitionDocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then
        If oOcc.IsiAssemblyMember Then
            Dim iAssyMember As iAssemblyMember
            Set iAssyMember = oOcc.Definition.iAssemblyMember
            Dim def As AssemblyComponentDefinition
            Set def = iAssyMember.ReferencedDocumentDescriptor.ReferencedDocument.ComponentDefinition
            
            Dim iOcc As ComponentOccurrence
            For Each iOcc In def.Occurrences
                TraverseAndSetNames iOcc, def.Occurrences.AllReferencedOccurrences(def)
            Next iOcc
            
            iAssyMember.ReferencedDocumentDescriptor.ReferencedDocument.Save2 True
        Else
            Dim sOcc As ComponentOccurrence
            For Each sOcc In oOcc.SubOccurrences
                TraverseAndSetNames sOcc
            Next sOcc
        End If
    End If
End Sub