Toleranz für die Pb-Wiederherstellung in VBA

Hallo ihr alle

Ich versuche, ein Makro zu erstellen, um eine Reihe ausgewählter Dimensionen in einem Plan zu extrahieren und sie nach Excel zu exportieren.
Ich stelle drei Eigenschaften wieder her, die es ermöglichen, die Datei, aus der die Dimensionen extrahiert wurden, schnell zu identifizieren.

Das Makro funktioniert einwandfrei (das Layout ist in Ordnung, die Eigenschaften werden abgerufen, die ausgewählten Bemaßungen werden gut angezeigt), außer dass die Toleranzen systematisch auf Null gehen...

Chat GPT, das mir bei der Erstellung dieses Makros eine große Hilfe war, stolpert über das Problem. Eine andere KI, Claude, könnte es nicht besser machen.

Weiß jemand, was den Nullwert systematisch steigen lässt? Ich gebe an, dass die Dimensionen, die ich in meinem zu testenden Plan auswähle, eine symmetrische Toleranz von +/-0,15 haben, die direkt aus dem Angebot des Immobilienverwalters eingegeben wird.

Option Explicit

Sub main()
    ExportCotesVersExcel
End Sub

Sub ExportCotesVersExcel()
    Dim swApp As Object
    Dim swModel As Object
    Dim swDraw As Object
    Dim swSelMgr As Object
    Dim swDispDim As Object
    Dim swDim As Object
    Dim xlApp As Object
    Dim xlWorkbook As Object
    Dim xlSheet As Object
    Dim i As Integer
    Dim j As Integer
    Dim tolMin As Double
    Dim tolMax As Double
    Dim value As Double
    Dim valueMin As Double
    Dim valueMax As Double
    Dim itMin As Double
    Dim itMax As Double
    
    ' Créer une instance de SolidWorks (Late Binding)
    Set swApp = CreateObject("SldWorks.Application")
    Set swModel = swApp.ActiveDoc
    
    ' Vérification si un dessin est actif
    If swModel Is Nothing Then
        MsgBox "Veuillez ouvrir un dessin 2D avant d'exécuter la macro.", vbExclamation
        Exit Sub
    End If
    
    ' Vérification du type de document
    If swModel.GetType <> 3 Then ' 3 correspond à swDocDRAWING
        MsgBox "Cette macro fonctionne uniquement sur un dessin 2D.", vbExclamation
        Exit Sub
    End If
    
    Set swDraw = swModel
    Set swSelMgr = swModel.SelectionManager
    
    ' Créer une instance d'Excel (Late Binding)
    On Error Resume Next
    Set xlApp = GetObject(, "Excel.Application") ' Vérifier si Excel est ouvert
    If xlApp Is Nothing Then
        Set xlApp = CreateObject("Excel.Application") ' Ouvrir Excel si ce n'est pas le cas
    End If
    On Error GoTo 0
    
    xlApp.Visible = True
    Set xlWorkbook = xlApp.Workbooks.Add
    Set xlSheet = xlWorkbook.Sheets(1)
    
    ' Entêtes Excel pour les propriétés
    xlSheet.Cells(1, 1).value = "Référence M3_2D"
    xlSheet.Cells(2, 1).value = "Indice"
    xlSheet.Cells(3, 1).value = "Description"
    
    ' Ajouter une ligne vide après les propriétés
    xlSheet.Cells(4, 1).value = ""
    
    ' Récupérer les propriétés du modèle (Référence M3_2D, Indice, Description)
    Dim customProps As Object
    Set customProps = swModel.Extension.CustomPropertyManager("")

    Dim refM3_2D As String
    Dim indice As String
    Dim description As String
    
    ' Essayer de récupérer les propriétés en tenant compte des erreurs
    On Error Resume Next
    refM3_2D = customProps.Get("Référence M3_2D")
    If Err.Number <> 0 Then refM3_2D = "Non disponible"
    
    indice = customProps.Get("Indice")
    If Err.Number <> 0 Then indice = "Non disponible"
    
    description = customProps.Get("Description")
    If Err.Number <> 0 Then description = "Non disponible"
    On Error GoTo 0
    
    ' Ajouter les propriétés dans Excel
    xlSheet.Cells(1, 2).value = refM3_2D
    xlSheet.Cells(2, 2).value = indice
    xlSheet.Cells(3, 2).value = description
    
    ' Ajouter une ligne vide après les propriétés
    xlSheet.Cells(4, 1).value = ""
    
    ' Ajouter les en-têtes pour les cotes
    xlSheet.Cells(5, 1).value = "Nom de la cote"
    xlSheet.Cells(5, 2).value = "Valeur"
    xlSheet.Cells(5, 3).value = "IT Min"
    xlSheet.Cells(5, 4).value = "IT Max"
    xlSheet.Cells(5, 5).value = "Valeur Cote Min"
    xlSheet.Cells(5, 6).value = "Valeur Cote Max"
    
    ' Vérifier si des cotes sont sélectionnées
    Dim nbCotes As Integer
    nbCotes = swSelMgr.GetSelectedObjectCount()
    
    If nbCotes = 0 Then
        MsgBox "Veuillez sélectionner des cotes avant d'exécuter la macro.", vbExclamation
        Exit Sub
    End If

    ' Parcours des cotes sélectionnées
    i = 6 ' Commencer à la ligne 6 après les propriétés, la ligne vide et les en-têtes
    Dim ent As Object
    For j = 1 To nbCotes
        Set ent = swSelMgr.GetSelectedObject6(j, -1)
        
        ' Vérifier si l'entité sélectionnée est une cote
        If Not ent Is Nothing Then
            If TypeOf ent Is SldWorks.DisplayDimension Then
                Set swDispDim = ent
                Set swDim = swDispDim.GetDimension
                
                ' Vérification de swDim avant d’accéder à ses valeurs
                If Not swDim Is Nothing Then
                    ' Récupérer la valeur de la cote
                    value = swDim.value
                    
                    ' Calcul des valeurs min et max de la cote
                    valueMin = value - tolMin
                    valueMax = value + tolMax
                    
                    ' Récupérer les tolérances IT (si disponibles)
                    On Error Resume Next
                    itMin = swDim.tolerance.itMin
                    itMax = swDim.tolerance.itMax
                    On Error GoTo 0
                    
                    ' Si les tolérances IT ne sont pas disponibles, les assigner à 0
                    If IsError(itMin) Then itMin = 0
                    If IsError(itMax) Then itMax = 0
                    
                    ' Exporter la cote, sa valeur, les tolérances IT et les valeurs min et max dans Excel
                    xlSheet.Cells(i, 1).value = swDim.FullName ' Nom de la cote
                    xlSheet.Cells(i, 2).value = Round(value, 2) ' Valeur de la cote
                    xlSheet.Cells(i, 3).value = Round(itMin, 2) ' Tolérance IT Min
                    xlSheet.Cells(i, 4).value = Round(itMax, 2) ' Tolérance IT Max
                    xlSheet.Cells(i, 5).value = Round(valueMin, 2) ' Valeur min de la cote
                    xlSheet.Cells(i, 6).value = Round(valueMax, 2) ' Valeur max de la cote
                    
                    i = i + 1
                Else
                    Debug.Print "Erreur : swDim est null pour un élément sélectionné."
                End If
            Else
                Debug.Print "L'élément sélectionné n'est pas une cote."
            End If
        Else
            Debug.Print "Erreur : ent est null pour l'élément " & j
        End If
    Next j
    
    ' Ajuster la largeur de la colonne A en fonction de son contenu
    xlSheet.Columns("A:A").AutoFit
    
    MsgBox "Exportation terminée avec succès !", vbInformation
End Sub

tolMin und tolmax werden deklariert, aber ihnen wird nirgendwo ein Wert zugewiesen.

Um den Wert einer Toleranz abzurufen, habe ich hinzugefügt:

                Dim swDimTol As SldWorks.DimensionTolerance
                Set swDimTol = swDim.Tolerance
                If swDimTol.Type <> swTolType_e.swTolNONE Then
                Debug.Print swDimTol.GetMinValue
                Debug.Print swDimTol.GetMaxValue
                End If

Direkt unter Ihrem Code:

                ' Récupérer la valeur de la cote
                value = swDim.value

Und ich bekomme den Wert der Toleranzen in der debug.print muss den Code mit diesen Werten abschließen

Und zu Ihrer Information, Vorsicht vor GPT-Chat und Unternehmen, es ist unerlässlich, sich den Code anzusehen und zu verstehen, da er die ärgerliche Tendenz hat, nutzlosen und unfertigen Code zu platzieren!
Und offensichtlich eine Menge Ärger mit SW-Code (Sie sind nicht der 1., der sich täuschen lässt)

Redigieren:
Für den Code ist es zwingend erforderlich, den gesamten Code in ein Tag zu packen, klicken Sie dazu hier und fügen Sie dann den Code ein:
image

Andernfalls ist der Code nicht lesbar. Bitte bearbeiten Sie Ihren 1. Beitrag und korrigieren Sie ihn, wenn möglich.

2 „Gefällt mir“

Sie müssen die Toleranzwerte mit 1000 multiplizieren.
Andernfalls werden Einheitenfehler und Cala mit der Funktion Round(value,2) auf 0 gerundet.
Für den endgültigen Code, der funktionsfähig zu sein scheint:

Option Explicit

Sub main()
ExportCotesVersExcel
End Sub

Sub ExportCotesVersExcel()
Dim swApp As Object
Dim swModel As Object
Dim swDraw As Object
Dim swSelMgr As Object
Dim swDispDim As Object
Dim swDim As Object
Dim xlApp As Object
Dim xlWorkbook As Object
Dim xlSheet As Object
Dim i As Integer
Dim j As Integer
Dim tolMin As Double
Dim tolMax As Double
Dim value As Double
Dim valueMin As Double
Dim valueMax As Double
Dim itMin As Double
Dim itMax As Double

' Créer une instance de SolidWorks (Late Binding)
Set swApp = CreateObject("SldWorks.Application")
Set swModel = swApp.ActiveDoc

' Vérification si un dessin est actif
If swModel Is Nothing Then
    MsgBox "Veuillez ouvrir un dessin 2D avant d'exécuter la macro.", vbExclamation
    Exit Sub
End If

' Vérification du type de document
If swModel.GetType <> 3 Then ' 3 correspond à swDocDRAWING
    MsgBox "Cette macro fonctionne uniquement sur un dessin 2D.", vbExclamation
    Exit Sub
End If

Set swDraw = swModel
Set swSelMgr = swModel.SelectionManager

' Créer une instance d'Excel (Late Binding)
On Error Resume Next
Set xlApp = GetObject(, "Excel.Application") ' Vérifier si Excel est ouvert
If xlApp Is Nothing Then
    Set xlApp = CreateObject("Excel.Application") ' Ouvrir Excel si ce n'est pas le cas
End If
On Error GoTo 0

xlApp.Visible = True
Set xlWorkbook = xlApp.Workbooks.Add
Set xlSheet = xlWorkbook.Sheets(1)

' Entêtes Excel pour les propriétés
xlSheet.Cells(1, 1).value = "Référence M3_2D"
xlSheet.Cells(2, 1).value = "Indice"
xlSheet.Cells(3, 1).value = "Description"

' Ajouter une ligne vide après les propriétés
xlSheet.Cells(4, 1).value = ""

' Récupérer les propriétés du modèle (Référence M3_2D, Indice, Description)
Dim customProps As Object
Set customProps = swModel.Extension.CustomPropertyManager("")

Dim refM3_2D As String
Dim indice As String
Dim description As String

' Essayer de récupérer les propriétés en tenant compte des erreurs
On Error Resume Next
refM3_2D = customProps.Get("Référence M3_2D")
If Err.Number <> 0 Then refM3_2D = "Non disponible"

indice = customProps.Get("Indice")
If Err.Number <> 0 Then indice = "Non disponible"

description = customProps.Get("Description")
If Err.Number <> 0 Then description = "Non disponible"
On Error GoTo 0

' Ajouter les propriétés dans Excel
xlSheet.Cells(1, 2).value = refM3_2D
xlSheet.Cells(2, 2).value = indice
xlSheet.Cells(3, 2).value = description

' Ajouter une ligne vide après les propriétés
xlSheet.Cells(4, 1).value = ""

' Ajouter les en-têtes pour les cotes
xlSheet.Cells(5, 1).value = "Nom de la cote"
xlSheet.Cells(5, 2).value = "Valeur"
xlSheet.Cells(5, 3).value = "IT Min"
xlSheet.Cells(5, 4).value = "IT Max"
xlSheet.Cells(5, 5).value = "Valeur Cote Min"
xlSheet.Cells(5, 6).value = "Valeur Cote Max"

' Vérifier si des cotes sont sélectionnées
Dim nbCotes As Integer
nbCotes = swSelMgr.GetSelectedObjectCount()

If nbCotes = 0 Then
    MsgBox "Veuillez sélectionner des cotes avant d'exécuter la macro.", vbExclamation
    Exit Sub
End If

' Parcours des cotes sélectionnées
i = 6 ' Commencer à la ligne 6 après les propriétés, la ligne vide et les en-têtes
Dim ent As Object
For j = 1 To nbCotes
    Set ent = swSelMgr.GetSelectedObject6(j, -1)
    
    ' Vérifier si l'entité sélectionnée est une cote
    If Not ent Is Nothing Then
        If TypeOf ent Is SldWorks.DisplayDimension Then
            Set swDispDim = ent
            Set swDim = swDispDim.GetDimension
            
            ' Vérification de swDim avant d’accéder à ses valeurs
            If Not swDim Is Nothing Then
                ' Récupérer la valeur de la cote
                value = swDim.value
                
                Dim swDimTol As SldWorks.DimensionTolerance
                Set swDimTol = swDim.Tolerance
                If swDimTol.Type <> swTolType_e.swTolNONE Then
                Debug.Print swDimTol.GetMinValue * 1000
                Debug.Print swDimTol.GetMaxValue * 1000
                End If
                
                ' Calcul des valeurs min et max de la cote
                valueMin = value + (swDimTol.GetMinValue * 1000)
                valueMax = value + (swDimTol.GetMaxValue * 1000)
                
                ' Récupérer les tolérances IT (si disponibles)
                On Error Resume Next
                itMin = swDim.Tolerance.GetMinValue * 1000 '.itMin
                itMax = swDim.Tolerance.GetMaxValue * 1000 '.itMax
                On Error GoTo 0
                
                ' Si les tolérances IT ne sont pas disponibles, les assigner à 0
                If IsError(itMin) Then itMin = 0
                If IsError(itMax) Then itMax = 0
                
                ' Exporter la cote, sa valeur, les tolérances IT et les valeurs min et max dans Excel
                xlSheet.Cells(i, 1).value = swDim.FullName ' Nom de la cote
                xlSheet.Cells(i, 2).value = Round(value, 2) ' Valeur de la cote
                xlSheet.Cells(i, 3).value = Round(itMin, 2) ' Tolérance IT Min
                xlSheet.Cells(i, 4).value = itMax ' Tolérance IT Max
                xlSheet.Cells(i, 5).value = Round(valueMin, 2) ' Valeur min de la cote
                xlSheet.Cells(i, 6).value = Round(valueMax, 2) ' Valeur max de la cote
                
                i = i + 1
            Else
                Debug.Print "Erreur : swDim est null pour un élément sélectionné."
            End If
        Else
            Debug.Print "L'élément sélectionné n'est pas une cote."
        End If
    Else
        Debug.Print "Erreur : ent est null pour l'élément " & j
    End If
Next j

' Ajuster la largeur de la colonne A en fonction de son contenu
xlSheet.Columns("A:A").AutoFit

MsgBox "Exportation terminée avec succès !", vbInformation
End Sub

Und denken Sie daran, vertrauen Sie niemals Katzen, sie sind nur auf der Erde, um Menschen zu genießen!
:dog2::dog2::dog2:Hundepower! :rofl: :rofl: :rofl:

3 „Gefällt mir“

Also vielen Dank!! Es funktioniert (fast :grin:)

Zunächst einmal eine Korrektur für die Formatierung meines ursprünglichen Beitrags, meine flachste Entschuldigung, es stimmt, dass er jetzt viel besser lesbar ist.

Da ich ein absoluter Neuling in VBA bin, ist Chat GPT (und dergleichen) ziemlich nützlich und ermöglicht es mir, Codes zu erstellen, die ich selbst nur schwer schreiben könnte, zumindest in einer vernünftigen Zeit. Nach mehreren Iterationen kommen wir oft (nicht immer) zu einem ordentlichen Ergebnis. Und während ich versuche, ein Minimum von dem zu verstehen, was es tut (und hier dank des automatischen Hinzufügens von Kommentaren im Code), sage ich mir, dass ich ein wenig vorankomme, mit Gewalt :sweat_smile:

Gut gemacht für die *1000 Werte, ich hätte darüber nachdenken sollen, so einen Trick hat er schon am Anfang gemacht, in mm-Werte umrechnen zu wollen, die ... waren bereits in mm :dizzy_face:
Aber von dort aus sollte man sich vorstellen, dass es nur auf Toleranzen angewendet werden sollte

Indem ich meinen Code basierend auf Ihrem korrigiere, bekomme ich die Toleranzwerte (:+1::clinking_glasses::partying_face:), aber... Es funktioniert nicht gut für symmetrische Toleranzen.

Wenn meine Bewertung keine Toleranz hat, habe ich überall Null.
Wenn meine IT nicht zentriert ist (z. B. +0/+0,15 oder -0,2/+0), funktioniert sie einwandfrei
Aber wenn ich +/-0,15 habe, zeigt es mir nur 0,15 im Feld IT max an.

Aber es ist ein riesiger Schritt nach vorne, ich kämpfe seit heute Morgen damit!

Und ich mag auch keine Katzen :grin:


Option Explicit

Sub main()
    ExportCotesVersExcel
End Sub

Sub ExportCotesVersExcel()
    Dim swApp As Object
    Dim swModel As Object
    Dim swDraw As Object
    Dim swSelMgr As Object
    Dim swDispDim As Object
    Dim swDim As Object
    Dim xlApp As Object
    Dim xlWorkbook As Object
    Dim xlSheet As Object
    Dim i As Integer
    Dim j As Integer
    Dim tolMin As Double
    Dim tolMax As Double
    Dim value As Double
    Dim valueMin As Double
    Dim valueMax As Double
    Dim itMin As Double
    Dim itMax As Double
    
    ' Créer une instance de SolidWorks (Late Binding)
    Set swApp = CreateObject("SldWorks.Application")
    Set swModel = swApp.ActiveDoc
    
    ' Vérification si un dessin est actif
    If swModel Is Nothing Then
        MsgBox "Veuillez ouvrir un dessin 2D avant d'exécuter la macro.", vbExclamation
        Exit Sub
    End If
    
    ' Vérification du type de document
    If swModel.GetType <> 3 Then ' 3 correspond à swDocDRAWING
        MsgBox "Cette macro fonctionne uniquement sur un dessin 2D.", vbExclamation
        Exit Sub
    End If
    
    Set swDraw = swModel
    Set swSelMgr = swModel.SelectionManager
    
    ' Créer une instance d'Excel (Late Binding)
    On Error Resume Next
    Set xlApp = GetObject(, "Excel.Application") ' Vérifier si Excel est ouvert
    If xlApp Is Nothing Then
        Set xlApp = CreateObject("Excel.Application") ' Ouvrir Excel si ce n'est pas le cas
    End If
    On Error GoTo 0
    
    xlApp.Visible = True
    Set xlWorkbook = xlApp.Workbooks.Add
    Set xlSheet = xlWorkbook.Sheets(1)
    
    ' Entêtes Excel pour les propriétés
    xlSheet.Cells(1, 1).value = "Référence M3_2D"
    xlSheet.Cells(2, 1).value = "Indice"
    xlSheet.Cells(3, 1).value = "Description"
    
    ' Fusionner les cellules B1:F1, B2:F2 et B3:F3 et justifier à gauche
    With xlSheet.Range("B1:F1")
    .Merge
    .HorizontalAlignment = -4131 ' xlLeft
End With
With xlSheet.Range("B2:F2")
    .Merge
    .HorizontalAlignment = -4131 ' xlLeft
End With
With xlSheet.Range("B3:F3")
    .Merge
    .HorizontalAlignment = -4131 ' xlLeft
End With
    
    ' Ajouter une ligne vide après les propriétés
    xlSheet.Cells(4, 1).value = ""
    
    ' Récupérer les propriétés du modèle (Référence M3_2D, Indice, Description)
    Dim customProps As Object
    Set customProps = swModel.Extension.CustomPropertyManager("")

    Dim refM3_2D As String
    Dim indice As String
    Dim description As String
    
    ' Essayer de récupérer les propriétés en tenant compte des erreurs
    On Error Resume Next
    refM3_2D = customProps.Get("Référence M3_2D")
    If Err.Number <> 0 Then refM3_2D = "Non disponible"
    
    indice = customProps.Get("Indice")
    If Err.Number <> 0 Then indice = "Non disponible"
    
    description = customProps.Get("Description")
    If Err.Number <> 0 Then description = "Non disponible"
    On Error GoTo 0
    
    ' Ajouter les propriétés dans Excel
    xlSheet.Cells(1, 2).value = refM3_2D
    xlSheet.Cells(2, 2).value = indice
    xlSheet.Cells(3, 2).value = description
    
    ' Ajouter une ligne vide après les propriétés
    xlSheet.Cells(4, 1).value = ""
    
    ' Ajouter les en-têtes pour les cotes
    xlSheet.Cells(5, 1).value = "Nom de la cote"
    xlSheet.Cells(5, 2).value = "Valeur"
    xlSheet.Cells(5, 3).value = "IT Min"
    xlSheet.Cells(5, 4).value = "IT Max"
    xlSheet.Cells(5, 5).value = "Valeur Cote Min"
    xlSheet.Cells(5, 6).value = "Valeur Cote Max"
    
    ' Vérifier si des cotes sont sélectionnées
    Dim nbCotes As Integer
    nbCotes = swSelMgr.GetSelectedObjectCount()
    
    If nbCotes = 0 Then
        MsgBox "Veuillez sélectionner des cotes avant d'exécuter la macro.", vbExclamation
        Exit Sub
    End If

    ' Parcours des cotes sélectionnées
    i = 6 ' Commencer à la ligne 6 après les propriétés, la ligne vide et les en-têtes
    Dim ent As Object
    For j = 1 To nbCotes
        Set ent = swSelMgr.GetSelectedObject6(j, -1)
        
        ' Vérifier si l'entité sélectionnée est une cote
        If Not ent Is Nothing Then
            If TypeOf ent Is SldWorks.DisplayDimension Then
                Set swDispDim = ent
                Set swDim = swDispDim.GetDimension
                
                ' Vérification de swDim avant d’accéder à ses valeurs
                If Not swDim Is Nothing Then
                    ' Récupérer la valeur de la cote
                      value = swDim.value
                
                Dim swDimTol As SldWorks.DimensionTolerance
                Set swDimTol = swDim.tolerance
                If swDimTol.Type <> swTolType_e.swTolNONE Then
                Debug.Print swDimTol.GetMinValue * 1000
                Debug.Print swDimTol.GetMaxValue * 1000
                End If
                
                '  Calcul des valeurs min et max de la cote
                valueMin = value + (swDimTol.GetMinValue * 1000)
                valueMax = value + (swDimTol.GetMaxValue * 1000)
                
                ' Récupérer les tolérances IT (si disponibles)
                On Error Resume Next
                itMin = swDim.tolerance.GetMinValue * 1000 '.itMin
                itMax = swDim.tolerance.GetMaxValue * 1000 '.itMax
                On Error GoTo 0
                
                ' Si les tolérances IT ne sont pas disponibles, les assigner à 0
                If IsError(itMin) Then itMin = 0
                If IsError(itMax) Then itMax = 0
                
                ' Exporter la cote, sa valeur, les tolérances IT et les valeurs min et max dans Excel
                xlSheet.Cells(i, 1).value = swDim.FullName ' Nom de la cote
                xlSheet.Cells(i, 2).value = Round(value, 2) ' Valeur de la cote
                xlSheet.Cells(i, 3).value = Round(itMin, 2) ' Tolérance IT Min
                xlSheet.Cells(i, 4).value = itMax ' Tolérance IT Max
                xlSheet.Cells(i, 5).value = Round(valueMin, 2) ' Valeur min de la cote
                xlSheet.Cells(i, 6).value = Round(valueMax, 2) ' Valeur max de la cote
                
                i = i + 1
            Else
                Debug.Print "Erreur : swDim est null pour un élément sélectionné."
            End If
        Else
            Debug.Print "L'élément sélectionné n'est pas une cote."
        End If
    Else
        Debug.Print "Erreur : ent est null pour l'élément " & j
    End If
Next j
    
    ' Ajuster la largeur des colonnes pour s'adapter au contenu
    xlSheet.Columns("A:A").AutoFit ' Ajuste la colonne A
    xlSheet.Columns("C:C").AutoFit ' Ajuste la colonne C (IT Min)
    xlSheet.Columns("D:D").AutoFit ' Ajuste la colonne D (IT Max)
    xlSheet.Columns("E:E").AutoFit ' Ajuste la colonne E (Valeur Cote Min)
    xlSheet.Columns("F:F").AutoFit ' Ajuste la colonne F (Valeur Cote Max)
    
    MsgBox "Exportation terminée avec succès !", vbInformation
End Sub

Hallo

Ich habe nicht den gesamten Code dekodiert, daher sind dies möglicherweise nicht die richtigen Variablen, aber es soll die Idee veranschaulichen.

Sie sollten in der Lage sein, mit einem Vergleich wie dem folgenden durchzukommen:
Wenn das Feld min leer ist, ist es das Minus von max (wenn itMax auch nicht null ist), also sagen wir ihm, dass es den gleichen Wert wie max anzeigen soll, aber mit dem Minuszeichen.

If (IsNull(itMin) & Not IsNull(itMax)) Then itMin = -(itMax)

oder

If (IsNull(itMin) & Not IsNull(itMax)) Then itMin = itMax-(itMax*2)

Ja, aber was ist, wenn Sie eine bilaterale Toleranz haben, wie +0/+0,2? :grin:

Dann ist itMin 0 und damit nicht null, so dass die Bedingung " ignoriert " wird .

Ich hatte es noch nie so gesehen, um es zu testen :+1:

Wenn ich mich nicht irre, sollten Sie es wie folgt integrieren können:

xlSheet.Cells(i, 3).value = Round(IIf((IsNull(itMin) & Not IsNull(itMax)), itMax-(itMax*2), itMin), 2) ' Tolérance IT Min

Statt

xlSheet.Cells(i, 3).value = Round(itMin, 2) ' Tolérance IT Min

Entschlüsselung:
WENN itMin Null und itMax ungleich Null ist, DANN ist die Zelle itMin -itMax aufgerundet, SONST wird die Zelle itMin gerundet itMin

1 „Gefällt mir“

Es funktioniert nicht, das Makro stürzt mit diesem Codestück ab. Aber ich bin stur (und faul :grin:), also habe ich das korrigierte Makro wieder in ChatGPT eingefügt, der mir anbot, dies nach der Wiederherstellung der minimalen und maximalen IT hinzuzufügen:


' Vérifier si la tolérance est symétrique et corriger itMin
If swDimTol.Type = swTolType_e.swTolSYMMETRIC Then
    itMin = -itMax
End If

Und es funktioniert! Ich bekomme alles zurück!

Vielen Dank an euch beide für eure Hilfe!

Für diejenigen, die ein ähnliches Makro erstellen möchten, finden Sie hier den vollständigen Code:

Option Explicit

Sub main()
    ExportCotesVersExcel
End Sub

Sub ExportCotesVersExcel()
    Dim swApp As Object
    Dim swModel As Object
    Dim swDraw As Object
    Dim swSelMgr As Object
    Dim swDispDim As Object
    Dim swDim As Object
    Dim xlApp As Object
    Dim xlWorkbook As Object
    Dim xlSheet As Object
    Dim i As Integer
    Dim j As Integer
    Dim tolMin As Double
    Dim tolMax As Double
    Dim value As Double
    Dim valueMin As Double
    Dim valueMax As Double
    Dim itMin As Double
    Dim itMax As Double
    
    ' Créer une instance de SolidWorks (Late Binding)
    Set swApp = CreateObject("SldWorks.Application")
    Set swModel = swApp.ActiveDoc
    
    ' Vérification si un dessin est actif
    If swModel Is Nothing Then
        MsgBox "Veuillez ouvrir un dessin 2D avant d'exécuter la macro.", vbExclamation
        Exit Sub
    End If
    
    ' Vérification du type de document
    If swModel.GetType <> 3 Then ' 3 correspond à swDocDRAWING
        MsgBox "Cette macro fonctionne uniquement sur un dessin 2D.", vbExclamation
        Exit Sub
    End If
    
    Set swDraw = swModel
    Set swSelMgr = swModel.SelectionManager
    
    ' Créer une instance d'Excel (Late Binding)
    On Error Resume Next
    Set xlApp = GetObject(, "Excel.Application") ' Vérifier si Excel est ouvert
    If xlApp Is Nothing Then
        Set xlApp = CreateObject("Excel.Application") ' Ouvrir Excel si ce n'est pas le cas
    End If
    On Error GoTo 0
    
    xlApp.Visible = True
    Set xlWorkbook = xlApp.Workbooks.Add
    Set xlSheet = xlWorkbook.Sheets(1)
    
    ' Entêtes Excel pour les propriétés
    xlSheet.Cells(1, 1).value = "Référence M3_2D"
    xlSheet.Cells(2, 1).value = "Indice"
    xlSheet.Cells(3, 1).value = "Description"
    
    ' Fusionner les cellules B1:F1, B2:F2 et B3:F3 et justifier à gauche
    With xlSheet.Range("B1:F1")
    .Merge
    .HorizontalAlignment = -4131 ' xlLeft
End With
With xlSheet.Range("B2:F2")
    .Merge
    .HorizontalAlignment = -4131 ' xlLeft
End With
With xlSheet.Range("B3:F3")
    .Merge
    .HorizontalAlignment = -4131 ' xlLeft
End With
    
    ' Ajouter une ligne vide après les propriétés
    xlSheet.Cells(4, 1).value = ""
    
    ' Récupérer les propriétés du modèle (Référence M3_2D, Indice, Description)
    Dim customProps As Object
    Set customProps = swModel.Extension.CustomPropertyManager("")

    Dim refM3_2D As String
    Dim indice As String
    Dim description As String
    
    ' Essayer de récupérer les propriétés en tenant compte des erreurs
    On Error Resume Next
    refM3_2D = customProps.Get("Référence M3_2D")
    If Err.Number <> 0 Then refM3_2D = "Non disponible"
    
    indice = customProps.Get("Indice")
    If Err.Number <> 0 Then indice = "Non disponible"
    
    description = customProps.Get("Description")
    If Err.Number <> 0 Then description = "Non disponible"
    On Error GoTo 0
    
    ' Ajouter les propriétés dans Excel
    xlSheet.Cells(1, 2).value = refM3_2D
    xlSheet.Cells(2, 2).value = indice
    xlSheet.Cells(3, 2).value = description
    
    ' Ajouter une ligne vide après les propriétés
    xlSheet.Cells(4, 1).value = ""
    
    ' Ajouter les en-têtes pour les cotes
    xlSheet.Cells(5, 1).value = "Nom de la cote"
    xlSheet.Cells(5, 2).value = "Valeur"
    xlSheet.Cells(5, 3).value = "IT Min"
    xlSheet.Cells(5, 4).value = "IT Max"
    xlSheet.Cells(5, 5).value = "Valeur Cote Min"
    xlSheet.Cells(5, 6).value = "Valeur Cote Max"
    
    ' Vérifier si des cotes sont sélectionnées
    Dim nbCotes As Integer
    nbCotes = swSelMgr.GetSelectedObjectCount()
    
    If nbCotes = 0 Then
        MsgBox "Veuillez sélectionner des cotes avant d'exécuter la macro.", vbExclamation
        Exit Sub
    End If

    ' Parcours des cotes sélectionnées
    i = 6 ' Commencer à la ligne 6 après les propriétés, la ligne vide et les en-têtes
    Dim ent As Object
    For j = 1 To nbCotes
        Set ent = swSelMgr.GetSelectedObject6(j, -1)
        
        ' Vérifier si l'entité sélectionnée est une cote
        If Not ent Is Nothing Then
            If TypeOf ent Is SldWorks.DisplayDimension Then
                Set swDispDim = ent
                Set swDim = swDispDim.GetDimension
                
                ' Vérification de swDim avant d’accéder à ses valeurs
                If Not swDim Is Nothing Then
                    ' Récupérer la valeur de la cote
                      value = swDim.value
                
                Dim swDimTol As SldWorks.DimensionTolerance
                Set swDimTol = swDim.tolerance
                If swDimTol.Type <> swTolType_e.swTolNONE Then
                Debug.Print swDimTol.GetMinValue * 1000
                Debug.Print swDimTol.GetMaxValue * 1000
                End If
                
                '  Calcul des valeurs min et max de la cote
                valueMin = value + (swDimTol.GetMinValue * 1000)
                valueMax = value + (swDimTol.GetMaxValue * 1000)
                
                ' Récupérer les tolérances IT (si disponibles)
                On Error Resume Next
                itMin = swDim.tolerance.GetMinValue * 1000 '.itMin
                itMax = swDim.tolerance.GetMaxValue * 1000 '.itMax
                On Error GoTo 0
                
                ' Vérifier si la tolérance est symétrique et corriger itMin
If swDimTol.Type = swTolType_e.swTolSYMMETRIC Then
    itMin = -itMax
End If
                
                ' Si les tolérances IT ne sont pas disponibles, les assigner à 0
                If IsError(itMin) Then itMin = 0
                If IsError(itMax) Then itMax = 0
                
                ' Exporter la cote, sa valeur, les tolérances IT et les valeurs min et max dans Excel
                xlSheet.Cells(i, 1).value = swDim.FullName ' Nom de la cote
                xlSheet.Cells(i, 2).value = Round(value, 2) ' Valeur de la cote
                xlSheet.Cells(i, 3).value = Round(itMin, 2) ' Tolérance IT Min
                xlSheet.Cells(i, 4).value = itMax ' Tolérance IT Max
                xlSheet.Cells(i, 5).value = Round(valueMin, 2) ' Valeur min de la cote
                xlSheet.Cells(i, 6).value = Round(valueMax, 2) ' Valeur max de la cote
                
                i = i + 1
            Else
                Debug.Print "Erreur : swDim est null pour un élément sélectionné."
            End If
        Else
            Debug.Print "L'élément sélectionné n'est pas une cote."
        End If
    Else
        Debug.Print "Erreur : ent est null pour l'élément " & j
    End If
Next j
    
    ' Ajuster la largeur des colonnes pour s'adapter au contenu
    xlSheet.Columns("A:A").AutoFit ' Ajuste la colonne A
    xlSheet.Columns("C:C").AutoFit ' Ajuste la colonne C (IT Min)
    xlSheet.Columns("D:D").AutoFit ' Ajuste la colonne D (IT Max)
    xlSheet.Columns("E:E").AutoFit ' Ajuste la colonne E (Valeur Cote Min)
    xlSheet.Columns("F:F").AutoFit ' Ajuste la colonne F (Valeur Cote Max)
    
    MsgBox "Exportation terminée avec succès !", vbInformation
End Sub




3 „Gefällt mir“

Ich hatte gewarnt, dass ich den Code diagonal gelesen hätte und die Idee angepasst werden müsste.

Mein letztes Stück Code ist wahrscheinlich nur ein Syntaxfehler, aber der erste hätte funktionieren sollen. Aber zugegebenermaßen ist es in der Tat zweifellos sauberer, den Typ anstelle des Wertes zu testen.