Pb-hersteltolerantie in VBA

Hoi allemaal

Ik probeer een macro te maken om een reeks geselecteerde dimensies in een plan te extraheren en deze naar Excel te exporteren.
Ik herstel drie eigenschappen, waardoor ik snel het bestand kan identificeren waaruit de dimensies zijn geëxtraheerd.

De macro werkt perfect (de lay-out is Ok, de eigenschappen worden opgehaald, de geselecteerde dimensies zien er goed uit), behalve dat de toleranties systematisch op nul uitkomen...

Chat GPT, dat me enorm heeft geholpen bij het maken van deze macro, stuit op het probleem. Een andere AI, Claude, kon het niet beter doen.

Weet iemand waardoor de nulwaarde systematisch stijgt? Ik geef aan dat op de afmetingen die ik selecteer op mijn plan om te testen een tolerantie hebben, symmetrisch, van +/- 0,15, rechtstreeks ingevoerd vanuit de offerte van de vastgoedbeheerder.

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 en tolmax worden gedeclareerd, maar er wordt nergens een waarde aan toegekend.

Om de waarde van een tolerantie terug te krijgen, heb ik het volgende toegevoegd:

                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

Net onder je code:

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

En ik krijg de waarde van de toleranties in de debug.print zal de code met deze waarden moeten afronden

En ter informatie, pas op voor GPT-chat en bedrijf, het is absoluut noodzakelijk om de code te bekijken en te begrijpen, omdat deze de vervelende neiging heeft om nutteloze en onvoltooide code te plaatsen!
En natuurlijk veel problemen met de SW-code (je bent niet de 1e die voor de gek wordt gehouden)

Bewerken:
Voor de code is het noodzakelijk om de hele code in een tag te plaatsen, om dit te doen klik hier en plak vervolgens de code:
image

Anders is de code onleesbaar. Bewerk alstublieft uw 1e bericht en corrigeer indien mogelijk.

2 likes

Je moet de tolerantiewaarden vermenigvuldigen met 1000.
Anders eenheidsfout en cala afgerond op 0 met de functie Afronden (waarde,2).
Voor de uiteindelijke code die functioneel lijkt te zijn:

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

En onthoud dat katten nooit worden vertrouwd, ze zijn alleen op aarde om van mensen te genieten!
:dog2::dog2::dog2:Hond kracht! :rofl: :rofl: :rofl:

3 likes

Dus heel erg bedankt!! Het werkt (bijna :grin:)

Allereerst is er een correctie aangebracht voor de opmaak van mijn eerste bericht, mijn platste excuses, het is waar dat het nu veel leesbaarder is.

Als een complete neofiet in VBA, is chat GPT (en dergelijke) nogal handig, waardoor ik codes kan maken die ik moeilijk zelf zou kunnen schrijven, althans binnen een redelijke tijd. Na verschillende iteraties komen we vaak (niet altijd) tot een fatsoenlijk resultaat. En terwijl ik een minimum probeer te begrijpen van wat het doet (en hier dankzij de automatische toevoeging van opmerkingen in de code), zeg ik tegen mezelf dat ik een beetje vooruitgang boek, met geweld :sweat_smile:

Goed gedaan voor de *1000 waarden, ik had erover moeten nadenken, hij deed in het begin al zo'n truc, hij wilde omzetten in mm-waarden die ... waren al in mm :dizzy_face:
Maar van daaruit om je voor te stellen dat het alleen op toleranties zou moeten worden toegepast

Door mijn code te corrigeren op basis van de jouwe, krijg ik wel de tolerantiewaarden (:+1::clinking_glasses::partying_face:) maar... Het werkt niet goed voor symmetrische toleranties.

Als mijn beoordeling geen tolerantie heeft, heb ik overal nul.
Als mijn IT niet gecentreerd is (bijvoorbeeld +0/+0,15 of -0,2/+0), werkt het perfect
Maar als ik +/-0,15 heb, zie ik alleen 0,15 in het vak IT-max.

Maar het is een enorme stap vooruit, ik vecht er al sinds vanochtend mee!

En ik hou ook niet van katten :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

Ik heb niet alle code gedecodeerd, dus dit zijn misschien niet de juiste variabelen, maar het is om het idee te illustreren.

Je zou weg moeten kunnen komen met een vergelijking als:
als het min-vak leeg is, is het de min van max (als itMax ook niet null is), dus we vertellen het om dezelfde waarde als max weer te geven, maar met het minteken.

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

of

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

Ja, maar wat als je een bilaterale tolerantie hebt, zoals +0/+0,2? :grin:

Dan is hetMin 0, en dus niet nul, dus de voorwaarde wordt " genegeerd ".

Ik had het nog nooit zo gezien, om te testen, inderdaad :+1:

Als ik me niet vergis, zou je het als volgt moeten kunnen integreren:

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

In plaats van

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

Decodering:
ALS itMin Null is en itMax niet-Null, DAN is de itMin-cel -itMax naar boven afgerond, ANDERS wordt de itMin-cel afgerond itMin

1 like

Het werkt niet, de macro crasht met dit stukje code. Maar koppig (en lui :grin:) ben ik, dus ik injecteerde de gecorrigeerde macro opnieuw in ChatGPT, die me aanbood dit toe te voegen na het herstel van de min en max IT:


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

En het werkt! Ik krijg alles terug!

Bedankt allebei voor jullie hulp!

Voor degenen die een soortgelijke macro willen maken, hier is de volledige 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 likes

Ik had gewaarschuwd dat ik de code diagonaal had gelezen en dat het idee zou moeten worden aangepast.

Mijn laatste stukje code is waarschijnlijk gewoon een syntaxisfout, maar de eerste had moeten werken. Maar toegegeven, het testen van het type in plaats van de waarde is inderdaad ongetwijfeld schoner.