Überprüfen von Dateien mit einer Solidworks VBA-Schleife

Hallo, ich brauche noch Hilfe, ich bin Praktikant in einer Firma und verstehe nicht viel über das Schlaufensystem, wie man sie richtig anlegt

Mein Ziel ist es, den Namen der Datei abzurufen und ihn zu überprüfen (Beschreibung, Eigenschaft, Referenz), sobald dieser Schritt abgeschlossen ist, um zu überprüfen, ob es andere Teile / Baugruppen in der übergeordneten Datei gibt, wenn ja, wird die Prüfung für jede Unterdatei "Teil" oder "Baugruppe" wiederholt, wenn keine Unterdateien, Es geht zurück nach oben und geht zum nächsten Teil, dann führt es das gleiche Verfahren für jede Datei erneut aus

Ich habe bereits alle Befehle für die Info, aber dann geht es darum, wie man sie in eine Schleife bringt

Danke für Ihre Hilfe.

Wenn Sie noch Fragen haben, fragen Sie mich

Option Explicit

Const RechercheDeLaPosition = True


Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swAssy As SldWorks.AssemblyDoc
    Dim swConf As SldWorks.Configuration
    Dim swRootComp As SldWorks.Component2
    Dim Nom
    Dim fileName As String
    Dim compte As Long
    Dim caractere  As String
    Dim Position As Single
    Dim Resultat1 As String
    Dim Position2 As Single
    Dim caractere2 As String
    Dim resultat3 As String
    Dim cusPropMgr As SldWorks.CustomPropertyManager
    Dim swModelDocExt As SldWorks.ModelDocExtension
    Dim ContrôleVF As Boolean
    Dim ValOut As String
    Dim WasResolved As Boolean
    Dim ResolvedValOut As String
    Dim LinkToProperty As Boolean
    Dim ValeurDesc, ValeurRéférence
    Dim REF_Et_la_DESC As String
    
Sub TraverseComponent(swComp As SldWorks.Component2, nLevel As Long)
    Dim vChildComp As Variant
    Dim swChildComp As SldWorks.Component2
    Dim swCompConfig As SldWorks.Configuration
    Dim sPadStr As String
    Dim i As Long
    
    sPadStr = ""
    For i = 0 To nLevel - 1
        sPadStr = sPadStr + "  "
    Next i
    
    vChildComp = swComp.GetChildren
    
    For i = 0 To UBound(vChildComp)
        Set swChildComp = vChildComp(i)
            TraverseComponent swChildComp, nLevel + 1
        Debug.Print sPadStr & swChildComp.Name2 '& " <" & swChildComp.ReferencedConfiguration & ">"
    Next i
    
End Sub
Sub main()

    Set swApp = CreateObject("SldWorks.Application")
        Set swModel = swApp.ActiveDoc
        
        
  '---- Affiche le chemin d'accès et le nom du fichier
   If MsgBox("Le nom du fichier est :" & vbCrLf & vbCrLf & swModel.GetPathName, vbOKCancel, "Vérification") = vbOK Then
   End If
                       Set swModelDocExt = swModel.Extension
             Set cusPropMgr = swModelDocExt.CustomPropertyManager("")
             
    
    
 '---------------------------------------------------------------
 '----Récupération de la valeur donné correspondante au Nom De La Propriété---
 '---------------------Afficher la valeur------------------------
 '---------------------------------------------------------------
    ValeurDesc = swModel.GetCustomInfoValue("", "description")
    If MsgBox("Le nom du fichier est :" & vbCrLf & vbCrLf & ValeurDesc, vbOKOnly, "Vérification") = vbOK Then
        End If
        ValeurRéférence = swModel.GetCustomInfoValue("", "référence")
    If MsgBox("La référence est :" & vbCrLf & vbCrLf & ValeurRéférence, vbOKOnly, "Vérification") = vbOK Then
        End If

        REF_Et_la_DESC = ValeurRéférence & "_" & ValeurDesc
         If REF_Et_la_DESC = resultat3 Then
            MsgBox "La description est identique au nom :" & vbCrLf & vbCrLf & REF_Et_la_DESC & vbCrLf & vbCrLf & resultat3, vbQuestion, "Vérification"
             MsgBox "Vous pouvez continuer"
         Else
        MsgBox "Les valeurs ne sont pas cohérentes avec le nom de fichier référencé"
         MsgBox "Veuillez vérifier les informations"
         End If
        
    
           
            
                 '---- Cherche le dernière "\" dans le chemain d'accès du fichier-----
                           caractere = "\"
                           Position = InStrRev(swModel.GetPathName, caractere)
                  'Afficher seulement le nom du fichier + l'extension
                           Resultat1 = Mid(swModel.GetPathName, Position + 1)
                  '---- Cherche le dernier "." dans resultat1 pour ensuite retirer l'extension et afficher que le nom du fichier-
                           caractere2 = "."
                           Position2 = InStrRev(Resultat1, caractere2)
                  'MsgBox Left(Resultat1, Position2 - 1)
                           resultat3 = Left(Resultat1, Position2 - 1)
                  '---- On cherche la référence puis on vérifie qu'elle fait moins de 50 chr
        
                  ' va traiter la longueur de notre demande de vérification du caractère
                    If Len(resultat3) >= 50 Then
                          MsgBox "Votre Nom de fichier est trop long !"
                          MsgBox "Veuillez modifier le nom !"
                    End If
            
 
           Nom = swModel.GetPathName
    ' Ouvre l'assemblage si il n'est pas déjà ouvert
    fileName = Nom
    'Set swModel = swApp.OpenDoc6(fileName, swDocumentTypes_e.swDocASSEMBLY, swOpenDocOptions_e.swOpenDocOptions_Silent, "", errors, warnings)
    Set swConf = swModel.GetActiveConfiguration
    Set swRootComp = swConf.GetRootComponent3(True)
        Debug.Print "Chemin et Nom du Fichier = " & swModel.GetPathName
    ' Traverse components
    TraverseComponent swRootComp, 1

    End Sub

Ich poste meine Frage erneut, weil ich sie validiert habe, ohne es zu wollen

Und da ich nicht weiß, ob wir nach der Bestätigung antworten können, entschuldige ich mich.

Nochmals vielen Dank für Ihre Hilfe

Hallo

Wenn Sie Zeit sparen möchten, gibt es in der myCADtools-Suite ein Tool, mit dem Sie dies tun können.

Sie können Berichte erstellen, um alle Dateien aufzulisten, die inkonsistent sind, basierend auf ihren Dateiname-Eigenschaftswerten, ... und sogar Fehler korrigieren .

Dies ist das Integrationstool: https://help.visiativ.com/mycadtools/2022/fr/Integration.html

Sie können myCADtools 30 Tage lang kostenlos testen, um sich ein Bild zu machen

https://www.lynkoa.com/mycadtools

Philippe

 

1. Bemerkung Es ist nicht nötig, msgboxes zu setzen, um den Wert einer Variablen zu sehen, machen Sie einfach eine debug.print (siehe das Prinzip für Excel, bleibt aber in Sw gleich:

https://fr.teamaftermarket.com/348-vba-debug-print

Um den Wert von debug.print zu sehen, müssen Sie das Anzeige- und Ausführungsfenster im VBA-Editor ausführen. Der Wert wird im Ausführungsfenster angezeigt. Starten Sie den Code ggf. Schritt für Schritt (F8).

Dann werden Sie sehen, dass der Name jedes Teils  oder jeder Unterbaugruppe dank der Datei debug.print in der Funktion TraverseComponents bereits in diesem Fenster angezeigt wird.

 

Und dass der Code in dieser Funktion (TraverseComponents) auf das swChildComp-Objekt angewendet werden sollte und nicht im Hauptverzeichnis auf das swmodel, bei dem es sich um die Hauptassembly handelt.

Zum Verständnis, wenn Sie die main-Funktion ausführen, gelangt sie zur TraverseComponents-Funktion swRootComp, 1

Also startet er das gleichnamige Sub und in diesem Sub fegt er jedes Teil und jede Baugruppe.

Ich lasse euch heute nicht zu viel Zeit, um tiefer zu gehen.

Senden Sie uns Ihren endgültigen Code, wenn Sie es tun können oder wo Sie mit den neuen Indikationen nicht weiterkommen.

 

 

1 „Gefällt mir“
Option Explicit

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swConf As SldWorks.Configuration
Dim swRootComp As SldWorks.Component2
Dim Nom
Dim fileName As String
Dim compte As Long
Dim caractere  As String
Dim Position As Single
Dim Resultat1 As String
Dim Position2 As Single
Dim caractere2 As String
Dim NomSansSuffixe As String
'Dim cusPropMgr As SldWorks.CustomPropertyManager
'Dim swModelDocExt As SldWorks.ModelDocExtension
Dim ContrôleVF As Boolean
Dim ValOut As String
Dim WasResolved As Boolean
Dim ResolvedValOut As String
Dim LinkToProperty As Boolean
Dim ValeurDesc, ValeurRéférence
Dim REF_Et_DESC As String
    
' Balaye les sous-élément de l'élément swComp, contrôle que l'élément de base est conforme
' Renvoie true si OK
Function TraverseComponent(swComp As SldWorks.Component2, nLevel As Long) As Boolean
    Dim vChildComp As Variant
    Dim swChildComp As SldWorks.Component2
    Dim swCompConfig As SldWorks.Configuration
    Dim sPadStr As String
    Dim i As Long
    
    Debug.Print "Chemin et Nom du Fichier = " & swComp.GetPathName
    
    If TestElementConforme(swComp) = True Then
        
        
        sPadStr = ""
        For i = 0 To nLevel - 1
            sPadStr = sPadStr + "  "
        Next i
        
        ' Récupère la liste des sous-éléments
        vChildComp = swComp.GetChildren
        
        ' Parcours la liste des osus éléments et demande le contrôle pour chacun
        For i = 0 To UBound(vChildComp)
            Set swChildComp = vChildComp(i)
            If TraverseComponent(swChildComp, nLevel + 1) = False Then
                TraverseComponent = False
                MsgBox "On sort de la position 1 :" & nLevel
                End
            End If
            
            'Debug.Print sPadStr & swChildComp.Name2 '& " <" & swChildComp.ReferencedConfiguration & ">"
        Next i
        TraverseComponent = True
    Else
        TraverseComponent = False
        MsgBox "On sort de la position 2"
    End If

End Function


Sub main()

    Set swApp = CreateObject("SldWorks.Application")
    Set swModel = swApp.ActiveDoc
                        
    '---- Affiche le chemin d'accès et le nom du fichier
    MsgBox "Le nom du fichier est :" & vbCrLf & vbCrLf & swModel.GetPathName, vbOKCancel, "Vérification"

    'Nom = swModel.GetPathName
    ' Ouvre l'assemblage si il n'est pas déjà ouvert
    'fileName = Nom
    
    Set swConf = swModel.GetActiveConfiguration
    Set swRootComp = swConf.GetRootComponent3(True)
    'Debug.Print "Chemin et Nom du Fichier = " & swModel.GetPathName
        ' Traverse components
    If (swRootComp Is Nothing) Then
        MsgBox "Aucun élément trouvé"
    Else
        If TraverseComponent(swRootComp, 1) = True Then
            MsgBox "Vérification OK"
        End If
        
    End If
    
End Sub
    
' effectue un certain nombre de contrôles, renvoie true si OK
Function TestElementConforme(swTestComp As SldWorks.Component2) As Boolean
    
    '---- Récupère le nom fichier sans le chemin et sans suffixe
    '---- Cherche le dernier "\" dans le chemain d'accès du fichier -----
    Position = InStrRev(swModel.GetPathName, "\")
                  
    ' Récupère seulement le nom du fichier + l'extension
    Resultat1 = Mid(swModel.GetPathName, Position + 1)
                  
    '---- Cherche le dernier "." dans resultat1 pour ensuite retirer l'extension et afficher que le nom du fichier
    Position2 = InStrRev(Resultat1, ".")
                  
    'MsgBox Left(Resultat1, Position2 - 1)
    NomSansSuffixe = Left(Resultat1, Position2 - 1)
                  
    
    '---------------------------------------------------------------
    '----Récupération de la valeur donné correspondante au Nom De La Propriété---
    '---------------------Afficher la valeur------------------------
    '---------------------------------------------------------------
    
    ValeurRéférence = swModel.GetCustomInfoValue("", "référence")
    'MsgBox "La référence est :" & vbCrLf & vbCrLf & ValeurRéférence, vbOKOnly, "Vérification"
    
    If ValeurRéférence <> "" Then
    
        ValeurDesc = swModel.GetCustomInfoValue("", "description")
        'MsgBox "Le nom du fichier est :" & vbCrLf & vbCrLf & ValeurDesc, vbOKOnly, "Vérification"
                       

        REF_Et_DESC = ValeurRéférence & "_" & ValeurDesc
             
        If REF_Et_DESC = NomSansSuffixe Then
            
            'MsgBox "La description est identique au nom :" & vbCrLf & vbCrLf & REF_Et_DESC & vbCrLf & vbCrLf & NomSansSuffixe, vbQuestion, "Vérification"
            'MsgBox "Vous pouvez continuer"
        
        Else
            
            MsgBox "Les valeurs ne sont pas cohérentes avec le nom de fichier référencé" & vbCrLf & vbCrLf & "Veuillez vérifier votre fichier" & vbCrLf & vbCrLf & NomSansSuffixe
            TestElementConforme = False
            MsgBox "On sort de la position 3"
            End
        
        End If
    End If
            
    ' Vérifie que le nom de fichier ne dépasse pas 50 caractères
    If Len(NomSansSuffixe) > 50 Then
        MsgBox "Votre Nom de fichier est trop long !" & vbCrLf & vbCrLf & "Veuillez vérifier votre fichier" & vbCrLf & vbCrLf & NomSansSuffixe
        TestElementConforme = False
        MsgBox "On sort de la position 4"
        End
    End If
                                     
    TestElementConforme = True
                  
End Function





Also habe ich mit vielen verkorksten Tests gefunden, was ich brauchte, mein Tutor ist mit dem Ergebnis zufrieden, also danke für Ihre Hilfe trotzdem, mein Makro hat heute Morgen funktioniert^^