Code:
Sub CATMain()    Dim oCATIA As Application
    
    ' ===== Check if CATIA is open >>>>>
    On Error Resume Next
        Set oCATIA = catia
        If Err.Number <> 0 Then
            MsgBox "Could Not Get CATIA Application, Exiting Sub."
            Exit Sub
        End If
    On Error GoTo 0
    ' <<<<< Check if CATIA is open =====
   
    ' ===== Get 1./2. Part >>>>>
    Dim oPartDocument As PartDocument
    Set oPartDocument = Get_PartDocument
   
    Dim oRootProduct As ProductDocument
    ' <<<<< Get 1./2. Part =====
   
    If Not oPartDocument Is Nothing Then
        On Error Resume Next
            Set oRootProduct = oCATIA.ActiveDocument
            If Err.Number <> 0 Then
                MsgBox "The Active Document In The Session Is Not An Assembly, Exiting Sub."
                Exit Sub
            End If
        On Error GoTo 0
        Make_RootNode_Active
    End If
   
    Dim RootGroups As Groups
    Set RootGroups = oCATIA.ActiveDocument.Product.GetTechnologicalObject("Groups")
    Dim oGroup1 As Group
    Set oGroup1 = RootGroups.AddFromSel
    CreateGroupFromSelection oGroup1
    Dim oGroup2 As Group
    Set oGroup2 = RootGroups.AddFromSel
    CreateGroupFromSelection oGroup2
   
    Dim oGroup3 As Group
    Set oGroup3 = RootGroups.AddFromSel
   
'    Dim MaxDistance As Double
'    MaxDistance = GetDistanceBetweenGroups(oGroup1, oGroup2, oGroup3, True)
'    MsgBox "Max Distance is : " & vbCrLf & MaxDistance & "mm" '& vbCrLf & MaxDistance / 25.4 & "in"
   
    Dim MinDistance As Double
    MinDistance = GetDistanceBetweenGroups(oGroup1, oGroup2, oGroup3, False)
    MsgBox "Min Distance is : " & vbCrLf & MinDistance & "mm" '& vbCrLf & MinDistance / 25.4 & "in"
    
    RootGroups.Remove oGroup1
    RootGroups.Remove oGroup2
    RootGroups.Remove oGroup3
   
End Sub
Private Function GetDistanceBetweenGroups(iGroup1 As Group, iGroup2 As Group, iGroup3 As Group, Max As Boolean) As Double
    Dim dMaximum As Double
   
    If Max = True Then
        dMaximum = 0
    Else
        dMaximum = 1000000000
    End If
   
    Dim iOuter As Integer
    Dim iInner As Integer
    Dim oProduct1 As Product
    Dim oProduct2 As Product
   
    Dim RootDistances As Distances
    Set RootDistances = catia.ActiveDocument.Product.GetTechnologicalObject("Distances")
    Dim oDistance As Distance
   
    For iOuter = 1 To iGroup1.CountExtract
        Set oProduct1 = iGroup1.ItemExtract(iOuter)
        iGroup3.AddExplicit oProduct1
       
        For iInner = 1 To iGroup2.CountExtract
            Set oProduct2 = iGroup2.ItemExtract(iInner)
            iGroup3.AddExplicit oProduct2
           
            Set oDistance = RootDistances.Add
            oDistance.FirstGroup = iGroup3
            oDistance.Compute
            
            If (oDistance.IsDefined = 1) Then
                If Max = True Then
                    If (oDistance.Value > dMaximum) Then
                        dMaximum = oDistance.Value
                    End If
                Else
                    If (oDistance.Value < dMaximum) Then
                        dMaximum = oDistance.Value
                    End If
                End If
            End If
'            RootDistances.Remove oDistance
'            iGroup3.RemoveExplicit 2
        Next
        iGroup3.RemoveExplicit 1
    Next
    
    'X = RootDistances.Count
    RootDistances.Item(RootDistances.Count).Name = Round(oDistance.Value, 3) & "mm: " & oProduct1.Name & " <-> " & oProduct2.Name
   
    GetDistanceBetweenGroups = dMaximum
End Function
Private Sub CreateGroupFromSelection(iGroup As Group)
    Dim ProductArray() As Product
    ProductArray = MultiSelection("Product")
    Dim iIndex As Integer
    Dim oProduct As Product
    For iIndex = 0 To UBound(ProductArray)
        Set oProduct = ProductArray(iIndex).Value
        iGroup.AddExplicit oProduct
    Next
End Sub
Private Sub Make_RootNode_Active()
    Dim oSelection As Selection
    If TypeName(catia.ActiveDocument) = "ProductDocument" Then
        Set oSelection = catia.ActiveDocument.Selection
        oSelection.Clear
        oSelection.Add catia.ActiveDocument.Product
        AppActivate ("CATIA V5")                                          'Activate the catia window
        SendKeys "c:" & "FrmActivate" & Chr(13), True
    End If
    oSelection.Clear
    Set oSelection = Nothing
End Sub
Private Function Get_PartDocument() As PartDocument
    Dim oCATIA As Application
    Dim oDocument As Document
    Dim oSelection As Selection
    Dim oPart As Part
    Set oCATIA = catia
    Set oDocument = oCATIA.ActiveDocument
    Set oSelection = oDocument.Selection
    oSelection.Clear
    '---------------------------------------------------'
    If (InStr(oDocument.Name, ".CATPart")) = 0 Then
        oSelection.Search ("type=Part,in")
        On Error Resume Next
            Set oPart = oSelection.FindObject("CATIAPart")
            If Err.Number <> 0 Then
                oSelection.Clear
                Exit Function
            End If
        On Error GoTo 0
    Else
        Set oPart = oDocument.Part
    End If
    oSelection.Clear
    '---------------------------------------------------'
    Set Get_PartDocument = oPart.Parent
   
    Set oPart = Nothing
    Set oSelection = Nothing
    Set oDocument = Nothing
    Set oCATIA = Nothing
   
End Function
Private Function MultiSelection(sSelectType As String)
    Dim Item() As AnyObject
    Dim oPartDocument As PartDocument
    Dim oSelection 'As Selection
    Dim sStatus As String
    Dim sInputObjectType(0)
    Dim oReference As Reference
    Dim iIndex
   
    Set oSelection = catia.ActiveDocument.Selection
    oSelection.Clear
   
    sInputObjectType(0) = sSelectType
    sStatus = oSelection.SelectElement3(sInputObjectType, "Select a " & sSelectType, True, CATMultiSelTriggWhenUserValidatesSelection, True)
   
    If ((sStatus = "Cancel") Or (sStatus = "Undo")) Then
        oSelection.Clear
        Exit Function
    End If
   
    If oSelection.Count2 > 0 Then
        For iIndex = 1 To oSelection.Count2
            ReDim Preserve Item(iIndex - 1)
            Set Item(iIndex - 1) = oSelection.Item2(iIndex)
        Next
    End If
   
    MultiSelection = Item
    oSelection.Clear
   
    Set oReference = Nothing
    Set oSelection = Nothing
End Function