MACRO Erstellen von Unterordnern eines vorhandenen Ordners

Hallo

Ich bräuchte deine Erleuchtung. Ich möchte ein Makro erstellen, das 3 Unterordner eines vorhandenen Ordners erstellt.
Der vorhandene Ordner heißt BASE und die 3 Unterordner heißen Option1/Option2/Option3.
Ich habe an diesem Code herumgebastelt, aber das Makro findet den BASE-Ordner nicht, also keine Erstellung von Unterordnern ...

Haben Sie bitte irgendwelche Lösungen? :smiling_face_with_tear:

Dim swApp As Object
Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()
    ' Initialisation appli SolidWorks
    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    
    ' Vérification doc assemblage
    If Part.GetType <> swDocASSEMBLY Then
        MsgBox "Le document actif n'est pas un assemblage. Veuillez lancer la macro sur un assemblage."
        Exit Sub
    End If
    
    ' Vérification existance dossier "BASE"
    Dim plotFolder As Object
    On Error Resume Next
    Set plotFolder = Part.FeatureManager.FeatureByName("BASE")
    On Error GoTo 0

    If plotFolder Is Nothing Then
        MsgBox "Le dossier "BASE" n'existe pas. Créer ce dossier avant d'exécuter la macro."
        Exit Sub
    End If
    
    ' Sélectionner le dossier "BASE" pour y insérer les sous-dossiers
    boolstatus = Part.Extension.SelectByID2("BASE", "FEATURE", 0, 0, 0, False, 0, Nothing, 0)
    
    ' Création sous-dossier "Option1"
    Dim myFeature As Object
    Set myFeature = Part.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
    boolstatus = Part.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, 1, 0, "Option1")
    
    ' Création sous-dossier "Option2"
    Set myFeature = Part.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
    boolstatus = Part.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, 1, 0, "Option2")
    
    ' Création sous-dossier "Option3"
    Set myFeature = Part.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
    boolstatus = Part.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, 1, 0, "Option3")
    
    ' Tout désélectionner
    Part.ClearSelection2 True
    
    MsgBox "Les 3 sous-dossiers ont été créés avec succès dans le dossier "BASE"."
End Sub

Hallo @MLG ,

FeatureByName ist eine Methode eines Teile- oder Baugruppendokuments, nicht das FeatureManager-Objekt...

Auf der anderen Seite funktioniert das Erstellen eines Ordners nur, wenn eine Komponente im Baum ausgewählt ist. Um Unterordner des Ordners " BASE " zu erstellen, muss dieser daher mindestens eine Komponente enthalten.
Wenn ja, werden die Unterordner erstellt.
Das angehängte Makro sollte funktionieren.

CreationSsFolders.swp (43 KB)

3 „Gefällt mir“

Die leeren Ordner können auch erstellt und dann in den BASE-Ordner verschoben werden.

Hier ist die geänderte/aktualisierte Version des Makros, die von @m_blt freigegeben wird , in der Unterordner zum leeren BASE-Ordner hinzugefügt werden.

CreationSsDossiersV1.swp (40 KB)

1 „Gefällt mir“

Vielen Dank @Deepak_Gupta für die zusätzliche Antwort.
Und ich freue mich sehr, in diesem Forum einen der großartigen Mitwirkenden sw aus einem anderen bekannten Forum begrüßen zu dürfen! :smiley:

2 „Gefällt mir“

Vielen Dank @sbadenis :smiling_face_with_three_hearts:

1 „Gefällt mir“

EIN GROSSES DANKESCHÖN an @m_blt & @Deepak_Gupta für ihre unschätzbare Hilfe :+1:

Ich habe Ihre Codes angepasst und die Erstellung des PLOTS-Ordners (ursprünglich anstelle von BASE) hinzugefügt, falls er nicht existiert. Ich habe auch die Erstellung abgeleiteter Konfigurationen zur +SOL+PLOTS-Konfiguration hinzugefügt (und die Erstellung, wenn sie nicht vorhanden ist).

Hier ist mein Code:

'----------------------------------------------------------------------
'MACRO CREATION DOSSIER/SOUS DOSSIERS PLOTS + CREATION CONFIG/SOUS CONFIGS PLOTS
'----------------------------------------------------------------------

Option Explicit

Sub Main()
    Dim swApp           As SldWorks.SldWorks
    Dim swAssemb        As AssemblyDoc
    Dim swFeature       As Feature
    Dim boolstatus      As Boolean
    Dim swPlotFolder    As FeatureFolder
    Dim myFeature       As Feature
    Dim swModel         As SldWorks.ModelDoc2
    Dim swConfMgr       As SldWorks.ConfigurationManager
    Dim swConf          As SldWorks.Configuration
    Dim swDerivConf     As SldWorks.Configuration
'----------------------------------------------------------------------
    Set swApp = Application.SldWorks
    Set swAssemb = swApp.ActiveDoc

    ' Vérif doc assemblage
    If swAssemb.GetType <> swDocASSEMBLY Then
        MsgBox "Le document actif n'est pas un assemblage. Veuillez lancer la macro sur un assemblage."
        Exit Sub
    End If

    ' Vérif existance dossier 'PLOTS'
    Set swFeature = swAssemb.FeatureByName("PLOTS")

    If swFeature Is Nothing Then
        ' Création dossier 'PLOTS' s'il n'existe pas
        boolstatus = swAssemb.Extension.SelectByID2("", "FEATUREMANAGER", 0, 0, 0, False, 0, Nothing, 0)
        Set swFeature = swAssemb.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
        swFeature.Name = "PLOTS"
        MsgBox "Le dossier 'PLOTS' a été créé.", vbInformation, "Résultat"
    End If

    ' Une fois le dossier 'PLOTS' trouvé ou créé, ajouter les sous-dossiers
    boolstatus = swAssemb.Extension.SelectByID2("PLOTS", "FTRFOLDER", 0, 0, 0, False, 0, Nothing, 0)
    
    ' Sous-dossier "PLOTS LONGS"
    Set myFeature = swAssemb.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
    myFeature.Name = "PLOTS LONGS"
    boolstatus = swAssemb.Extension.ReorderFeature("PLOTS LONGS", swFeature.Name, swMoveLocation_e.swMoveToFolder)
    
    ' Sous-dossier "PLOTS COURTS"
    Set myFeature = swAssemb.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
    myFeature.Name = "PLOTS COURTS"
    boolstatus = swAssemb.Extension.ReorderFeature("PLOTS COURTS", swFeature.Name, swMoveLocation_e.swMoveToFolder)
    
    ' Sous-dossier "PLOTS MISE EN PLAN"
    Set myFeature = swAssemb.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
    myFeature.Name = "PLOTS MISE EN PLAN"
    boolstatus = swAssemb.Extension.ReorderFeature("PLOTS MISE EN PLAN", swFeature.Name, swMoveLocation_e.swMoveToFolder)
    
    ' Mise à jour FeatureManager
    swAssemb.FeatureManager.UpdateFeatureTree

'----------------------------------------------------------------------

    'Traitement de configurations

    Set swModel = swApp.ActiveDoc

    Set swConfMgr = swModel.ConfigurationManager
    
    ' Vérifier si la configuration cible existe
    Set swConf = swModel.GetConfigurationByName("+SOL+PLOTS")
    If swConf Is Nothing Then
        ' Créer la configuration +SOL+PLOTS si elle n'existe pas
        Set swConf = swConfMgr.AddConfiguration("+SOL+PLOTS", "Configuration principale pour les PLOTS", "", 0, "", "")
        If swConf Is Nothing Then
            MsgBox "Impossible de créer la configuration '+SOL+PLOTS'.", vbCritical
            Exit Sub
        Else
            MsgBox "La configuration '+SOL+PLOTS' a été créée avec succès.", vbInformation
        End If
    End If
    
    ' Vérifier si la configuration dérivée existe déjà
    Set swDerivConf = swModel.GetConfigurationByName("PLOTS COURTS")
    If Not swDerivConf Is Nothing Then
        MsgBox "La configuration dérivée 'PLOTS COURTS' existe déjà.", vbInformation
        Exit Sub
    End If
    
    ' Créer les configurations dérivées
    Set swDerivConf = swConfMgr.AddConfiguration("PLOTS COURTS", "Configuration dérivée de +SOL+PLOTS", "", 1, swConf.Name, "")
    Set swDerivConf = swConfMgr.AddConfiguration("PLOTS LONGS", "Configuration dérivée de +SOL+PLOTS", "", 1, swConf.Name, "")

    
    ' Vérifier si la configuration a été créée
    If swDerivConf Is Nothing Then
        MsgBox "Échec de la création de la configuration dérivée.", vbCritical
    Else
        MsgBox "Configurations dérivées 'PLOTS COURTS' et 'PLOTS LONGS' créées avec succès.", vbInformation
    End If
    
    ''' Activation de la config +SOL+PLOTS
    boolstatus = swModel.ShowConfiguration2("+SOL+PLOTS")

    MsgBox "DOSSIER + SOUS-DOSSIERS PLOTS A JOUR  -  CONFIG + SOUS-CONFIG PLOTS A JOUR.", vbInformation, "Résultat"

End Sub

Das MACRO funktionierte gut bei einer Montage mit 3 TEST-Teilen:

Aber beim Testen an anderen Baugruppen habe ich von Anfang an einen MACRO-Absturz:

image

Ich verstehe nicht, warum er mir sagt, dass eine Variable nicht definiert ist, wenn sie beim ersten Test funktioniert hat.

Und beim Debuggen sagt es mir diese Zeile:

Haben Sie eine Idee, warum es mit einigen Teilen funktioniert und mit anderen nicht?

Dies ist ein korrekter Fehler, da zuvor nichts ausgewählt wurde, um den leeren Ordner hinzuzufügen. Und da kein Ordner hinzugefügt wird, kann die Funktion (der Ordner) nicht umbenannt werden.

In einer leeren Datei können Sie also die Verknüpfungen (letzte Funktion) auswählen und den Ordner davor hinzufügen (etwa wie die folgenden Codes)

If swFeature Is Nothing Then
    
        Dim featCount As Long
        featCount = swAssemb.GetFeatureCount
        
        Dim swLastFeat As SldWorks.Feature
        Set swLastFeat = swAssemb.FeatureByPositionReverse(0)
        swLastFeat.Select2 False, -1

        ' Création dossier 'PLOTS' s'il n'existe pas
        'boolstatus = swAssemb.Extension.SelectByID2(swLastFeat.Name, "FEATUREMANAGER", 0, 0, 0, False, 0, Nothing, 0)

        Set swFeature = swAssemb.FeatureManager.InsertFeatureTreeFolder2(swFeatureTreeFolderType_e.swFeatureTreeFolder_EmptyBefore)
        swFeature.Name = "PLOTS"
        MsgBox "Le dossier 'PLOTS' a été créé.", vbInformation, "Résultat"
    End If
4 „Gefällt mir“