Trier une listebox (MACRO tri Arbre de Construction CATIA)
2 participants
Page 1 sur 1
Trier une listebox (MACRO tri Arbre de Construction CATIA)
Bonjour à tous,
Je travail actuellement sur une macro CATIA V5 R17 qui permet de trier un arbre de construction. Je me suis inspiré d'une MACRO existante et j'ai souhaiter l'adapter à mes projets.
Concrètement, mon objectif est de trier au sein d'un product toutes les parts par ordre alphabétique (puis je souhaiterais ajouter l'option de trier par ordre croissant, étant donner que j'ai des parts qui peuvent être uniquement des numéros type : 63000 XXXXXXXXXXX).
J'ai essayé plusieurs méthode pour trier mes parts, mais je n'y arrive pas, à chaque fois le tri est incompréhensible. Quelqu'un pourrait m'aider ?
En fait j'ai du mal à comprendre le principe de fonctionnement de ce tri (comme on compare 2 variables string entre elles, et de la même manière, comment je pourrais comparer 2 parts pour faire un tri d'ordre croissant avec des pièces ayant pour nom : 63000D111780052512).
Je n'arrive pas à vous donner la macro, donc voici le code : (NewOrder étant ma ListBox)
(Je voulais vous montrer à quoi ressemble ma MACRO et le résultat mais je ne peux pas mettre de lien ou de fichier (ou alors je n'ai pas compris comment faire)).
Voici ce qui se passe quand je clique sur mon bouton (A to Z)
Merci d'avance,
Julien
Je travail actuellement sur une macro CATIA V5 R17 qui permet de trier un arbre de construction. Je me suis inspiré d'une MACRO existante et j'ai souhaiter l'adapter à mes projets.
Concrètement, mon objectif est de trier au sein d'un product toutes les parts par ordre alphabétique (puis je souhaiterais ajouter l'option de trier par ordre croissant, étant donner que j'ai des parts qui peuvent être uniquement des numéros type : 63000 XXXXXXXXXXX).
J'ai essayé plusieurs méthode pour trier mes parts, mais je n'y arrive pas, à chaque fois le tri est incompréhensible. Quelqu'un pourrait m'aider ?
En fait j'ai du mal à comprendre le principe de fonctionnement de ce tri (comme on compare 2 variables string entre elles, et de la même manière, comment je pourrais comparer 2 parts pour faire un tri d'ordre croissant avec des pièces ayant pour nom : 63000D111780052512).
Je n'arrive pas à vous donner la macro, donc voici le code : (NewOrder étant ma ListBox)
(Je voulais vous montrer à quoi ressemble ma MACRO et le résultat mais je ne peux pas mettre de lien ou de fichier (ou alors je n'ai pas compris comment faire)).
- Code:
Private Sub AtoZ_button_Click()
' A REVOIR CAR FONCTIONNE PAS
'Déclaration des variables
Dim i As Long
Dim j As Long
Dim temp As String
'sort the spec tree order from A to Z
For i = 0 To NewOrder.ListCount - 1
For j = 0 To NewOrder.ListCount - 1
If NewOrder.List(i) < NewOrder.List(j) Then
temp = NewOrder.List(i)
NewOrder.List(i) = NewOrder.List(j)
NewOrder.List(j) = temp
End If
Next j
Next i
'MsgBox (NewOrder.List(0) & NewOrder.List(1) & NewOrder.List(2) & NewOrder.List(3))
End Sub
Voici ce qui se passe quand je clique sur mon bouton (A to Z)
Merci d'avance,
Julien
Liocco08- actif
- Messages : 39
Date d'inscription : 07/04/2022
Localisation : Toulouse
Liocco08 aime ce message
UPDATE
Bon apparemment ce tri fonctionne pour des pièces ayant des noms type 630000 XXXX mais dès que j'ai une pièce entièrement nommé en string (chaîne de caractères) ça déconne. Une idée du pourquoi du comment ?
Merci !
Merci !
Liocco08- actif
- Messages : 39
Date d'inscription : 07/04/2022
Localisation : Toulouse
Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)
Bonjour Julien,
La comparaison <, va comparer les valeurs ASCII de ta chaîne de caractère.
Tout dépend ce qu'il y a dans tes noms de pièces. Par exemple en ASCII les lettres majuscules sont avant les minuscules, donc si tu as du mélange minuscule/ majuscule ça peut poser des problèmes, de même pour les caractères spéciaux.
Peut tu indiquer quelque exemple de nom de pièces?
A+
Marc
La comparaison <, va comparer les valeurs ASCII de ta chaîne de caractère.
Tout dépend ce qu'il y a dans tes noms de pièces. Par exemple en ASCII les lettres majuscules sont avant les minuscules, donc si tu as du mélange minuscule/ majuscule ça peut poser des problèmes, de même pour les caractères spéciaux.
Peut tu indiquer quelque exemple de nom de pièces?
A+
Marc
lumpazepfel- Fédérateur
- Messages : 319
Date d'inscription : 02/11/2015
Localisation : Ensisheim
Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)
Merci pour ta réponse.
Alors pour prendre des exemples précis, je vais avoir des products sous la forme "63000D11178005C044/63000D11178005A044" et des pièces au format "63000D111780050000" ou "63000D111780054010" mais aussi des "JTT19G4ZNS0IRJ8100/JTTA5HJ1HJP90B3800".
Mon objectif avec cette macro est de trier dans l'ordre suivant :
- En premier je veux nécessairement les products trié par ordre alphabétique (en réalité le tri se fait sur les 4 derniers digits qui sont les seuls éléments qui changent). Avec les products au dessus ça donnerait 63000D11178005A044 puis 63000D11178005C044.
- Ensuite il me faut les pièces dites "fabriquées", c'est-à-dire celles au format "63000D111780050000". Pareil toujours par ordre numérique puisque les pièces vont évoluer en 63000D111780050002 puis 63000D111780050004 puis 63000D111780050006 etc...
- Puis je veux les pièces du commerce type 63000D111780054010 puis 63000D111780054012 etc...
- Enfin en dernier il me faut les pièces types JTTA5HJ1HJP90B3800 qui se trie aussi (ici peut importe l'ordre). Pour être précis je veux qu'elle se regroupe ensemble et qu'elles suivent un ordre alphanumérique, mais ce n'est pas important si en premier c'est les pièces contenant un caractère ou un chiffre au 4 digits : JTTA5HJ1HJP90B3800 ou la JTT19G4ZNS0IRJ8100.
J'espère avoir été clair, j'aimerais te fournir une photo de ce que fait actuellement la macro mais je n'ai pas le droit de poster de lien (je suis nouveau).
J'essaye en message privé si ça existe ^^
Merci de ton aide !
Alors pour prendre des exemples précis, je vais avoir des products sous la forme "63000D11178005C044/63000D11178005A044" et des pièces au format "63000D111780050000" ou "63000D111780054010" mais aussi des "JTT19G4ZNS0IRJ8100/JTTA5HJ1HJP90B3800".
Mon objectif avec cette macro est de trier dans l'ordre suivant :
- En premier je veux nécessairement les products trié par ordre alphabétique (en réalité le tri se fait sur les 4 derniers digits qui sont les seuls éléments qui changent). Avec les products au dessus ça donnerait 63000D11178005A044 puis 63000D11178005C044.
- Ensuite il me faut les pièces dites "fabriquées", c'est-à-dire celles au format "63000D111780050000". Pareil toujours par ordre numérique puisque les pièces vont évoluer en 63000D111780050002 puis 63000D111780050004 puis 63000D111780050006 etc...
- Puis je veux les pièces du commerce type 63000D111780054010 puis 63000D111780054012 etc...
- Enfin en dernier il me faut les pièces types JTTA5HJ1HJP90B3800 qui se trie aussi (ici peut importe l'ordre). Pour être précis je veux qu'elle se regroupe ensemble et qu'elles suivent un ordre alphanumérique, mais ce n'est pas important si en premier c'est les pièces contenant un caractère ou un chiffre au 4 digits : JTTA5HJ1HJP90B3800 ou la JTT19G4ZNS0IRJ8100.
J'espère avoir été clair, j'aimerais te fournir une photo de ce que fait actuellement la macro mais je n'ai pas le droit de poster de lien (je suis nouveau).
J'essaye en message privé si ça existe ^^
Merci de ton aide !
Liocco08- actif
- Messages : 39
Date d'inscription : 07/04/2022
Localisation : Toulouse
Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)
OK, je vois la complexité du truc...
Personnellement je passerais par des tableaux (array) intermédiaires:
-tu répartis tes partnumber dans trois tableaux (produit, pièces fabriquées, pièces du commerce)
-tu classes chaque tableau par ordre alphabétique
-tu reconstruis ta listebox avec les 3 tableaux.
Personnellement je passerais par des tableaux (array) intermédiaires:
-tu répartis tes partnumber dans trois tableaux (produit, pièces fabriquées, pièces du commerce)
-tu classes chaque tableau par ordre alphabétique
-tu reconstruis ta listebox avec les 3 tableaux.
lumpazepfel- Fédérateur
- Messages : 319
Date d'inscription : 02/11/2015
Localisation : Ensisheim
Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)
lumpazepfel a écrit:OK, je vois la complexité du truc...
Personnellement je passerais par des tableaux (array) intermédiaires:
-tu répartis tes partnumber dans trois tableaux (produit, pièces fabriquées, pièces du commerce)
-tu classes chaque tableau par ordre alphabétique
-tu reconstruis ta listebox avec les 3 tableaux.
D'accord je comprends ce que tu veux faire, dans ce cas je travail directement en identifiant chaque part/product plutôt que de travailler avec la ListBox (pour l'opération de tri) c'est ça ?
Et désolé j'ai pas beaucoup d'expérience en VBA, mais pour séparer les parts en fonction de leur nature, il existe une fonction de ce type ? Du genre
Si la part contient une partie "63000D111780050XXX" alors elle ira dans ce tableau.
Liocco08- actif
- Messages : 39
Date d'inscription : 07/04/2022
Localisation : Toulouse
Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)
Je ne sais pas ce que tu veux faire avec la listbox, si tu l'utilises uniquement pour créer la liste alors elle n'est pas utile sauf tu veux l'afficher à l'utilisateur pour vérification et validation par exemple.
Oui il existe une fonction pour rechercher tout ou partie de chaine de caractère c'est INSTR,
voir ici https://www.excel-pratique.com/fr/astuces_vba/instr
Tu as aussi dans le dossier où est installé CATIA une aide sur le VBA CATIA : "V5Automation.chm" sous \tondossier\RxxSPx\win_b64\code\bin\V5Automation.chm
Exemple classique:
Dim oActiveDoc As Document
Set oActiveDoc = CATIA.ActiveDocument
' Check whether the document is a CATPart
If (InStr(oActiveDoc.Name,".CATPart")) <> 0 Then
Oui il existe une fonction pour rechercher tout ou partie de chaine de caractère c'est INSTR,
voir ici https://www.excel-pratique.com/fr/astuces_vba/instr
Tu as aussi dans le dossier où est installé CATIA une aide sur le VBA CATIA : "V5Automation.chm" sous \tondossier\RxxSPx\win_b64\code\bin\V5Automation.chm
Exemple classique:
Dim oActiveDoc As Document
Set oActiveDoc = CATIA.ActiveDocument
' Check whether the document is a CATPart
If (InStr(oActiveDoc.Name,".CATPart")) <> 0 Then
lumpazepfel- Fédérateur
- Messages : 319
Date d'inscription : 02/11/2015
Localisation : Ensisheim
Problème Instance pour trier
Bonjour @lumpazepfel
J'ai pas mal avancé sur ma macro mais je suis encore bloqué. En effet, aujourd'hui la macro fonctionne correctement si il n'y a qu'une seule instance de chaque élément. Cependant dès qu'il y a plusieurs instances d'une même part ça ne marche plus...
Pour expliquer la méthodo du code :
- Je commence par trier, comme tu me l'as dit, les part et les products dans 2 tableaux différents.
- J'assemble ces deux tableaux pour les afficher dans ma listebox
Puis dans un second temps, avec un bouton activable par ma Userform, l'utilisateur peut lancer le tri et valider si cela lui convient.
Mon problème interviens dans l'identification des éléments de l'arbre. En effet, le remplissage se fait par le nom de l'élément dans l'assemblage (le nom du product ou le nom de la part), mais pas en fonction de son INSTANCE De ce fait, si j'ai la même part avec une instance différente, pour lui c'est pareil (donc ça fou la merde).
Mon problème est que je n'arrive pas à accéder à l'instance avec ma fonction de tri des parts et des products. Car je sais identifier l'instance des éléments de l'arbre, mais pas pendant ce tri.
Ici toutes mes variables :
Voici la suite du code :
Ce code permet de trier des éléments en fonction de si c'est un part ou un product mais pas d'identifier les instances.
Je peux très bien remplir mon tableau avec les instances des parts avec le code suivant :
Du coup pour moi 2 "solutions" pourrait résoudre mon problème (avec 2 architectures de code différentes) :
- Est-ce que tu connais un moyen de trier les parts et les products de ma ListComposants ? (car aujourd'hui pour trier je vais lire directement l'extension du fichier, et j'y accède uniquement avec la méthode de tri qui fonctionne avec le nom de part, je n'arrive pas a y accéder avec listcomposant)
- Est-ce que tu connais un moyen d'accéder à l'instance de mon produit dans ma fonction de tri des part et products ? (qui serait le plus simple mais j'y arrive pas, pour obtenir l'instance je suis obligé de passé par ListComposant).
C'est compliqué à expliquer, alors j'espère que tu as compris (le fait qu'il faille effectuer l'identification de l'instance pendant le tri des parts et des products, et non pas avant ou après).
Merci d'avance,
Julien
PS : SI BESOIN JE TE DONNE MON FICHIER
J'ai pas mal avancé sur ma macro mais je suis encore bloqué. En effet, aujourd'hui la macro fonctionne correctement si il n'y a qu'une seule instance de chaque élément. Cependant dès qu'il y a plusieurs instances d'une même part ça ne marche plus...
Pour expliquer la méthodo du code :
- Je commence par trier, comme tu me l'as dit, les part et les products dans 2 tableaux différents.
- J'assemble ces deux tableaux pour les afficher dans ma listebox
Puis dans un second temps, avec un bouton activable par ma Userform, l'utilisateur peut lancer le tri et valider si cela lui convient.
Mon problème interviens dans l'identification des éléments de l'arbre. En effet, le remplissage se fait par le nom de l'élément dans l'assemblage (le nom du product ou le nom de la part), mais pas en fonction de son INSTANCE De ce fait, si j'ai la même part avec une instance différente, pour lui c'est pareil (donc ça fou la merde).
Mon problème est que je n'arrive pas à accéder à l'instance avec ma fonction de tri des parts et des products. Car je sais identifier l'instance des éléments de l'arbre, mais pas pendant ce tri.
Ici toutes mes variables :
- Code:
' Déclaration des variables
Option Explicit
Public Response As Integer 'Variable qui permet de stocker la réponse d'erreur si il n'y a rien à ordonner
Public TableauTriProduct() As String ' tableau contenant le nom des part et des products
Public TableauTriPart() As String ' tableau contenant le nom des part et des products
Public TableauAffichageNonTri() As String
Public TableauAffichageTri() As String
Public NomDocCatia As String
Public ExtensionFichier As String
Public NDocCatia As Document
Public NombreProduct, NombrePart, NombreTotalDocument As Integer
Public ProductDocCatia As ProductDocument
Public NomActif As String
Public PartDocCatia As PartDocument
Public MyProductDocument As ProductDocument ' Permet d'attraper le product actif pour le passer en design mode
Public MainProduct As Product
Public ListComposants As Products
Voici la suite du code :
- Code:
Public Function ListeDoc()
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
' ----- Déclaration des variables -----
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
' ----- Remplissage des tableaux de Part et de Product -----
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
NombreProduct = 0
NombrePart = 0
For Each NDocCatia In DocCatia
NomDocCatia = NDocCatia.Name
If (InStr(1, NomDocCatia, "CATProduct") > 0) Then
ExtensionFichier = "CATProduct"
Set ProductDocCatia = NouveauDocCatia.Item(NomDocCatia)
If NomDocActif = NDocCatia.Name Then
Else
ReDim Preserve TableauTriProduct(NombreProduct)
TableauTriProduct(NombreProduct) = SousReference.Name
NombreProduct = NombreProduct + 1
End If
End If
If (InStr(1, NomDocCatia, "CATPart") > 0) Then
ExtensionFichier = "CATPart"
Set PartDocCatia = NouveauDocCatia.Item(NomDocCatia)
ReDim Preserve TableauTriPart(NombrePart)
TableauTriPart(NombrePart) = PartDocCatia.Product.PartNumber
NombrePart = NombrePart + 1
End If
Next
NombreTotalDocument = NombrePart + NombreProduct
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
' ----- Les parts et les products sont dans 2 tableaux différents -----
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
' ----- Assemblage des 2 tableaux -----
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
TableauAffichageNonTri = Split(Join(TableauTriProduct, ",") & "," & Join(TableauTriPart, ","), ",")
End Function
Ce code permet de trier des éléments en fonction de si c'est un part ou un product mais pas d'identifier les instances.
Je peux très bien remplir mon tableau avec les instances des parts avec le code suivant :
- Code:
Public NDocCatia As Document
Set NDocCatia = CATIA.ActiveDocument
Set MainProduct = NDocCatia.Product ' Il s'agit du product principal
Set ListComposants = MainProduct.Products ' Cet élément stocke tous les éléments de l'arbre de construction
For k = 0 To ListComposants.Count
'Une solution pour trier des parts et des products ici
UserForm_ArbreDeConstruction.CurrentOrder.AddItem ListComposants.Item(k).Name
UserForm_ArbreDeConstruction.NewOrder.AddItem ListComposants.Item(k).Name
Next k
Du coup pour moi 2 "solutions" pourrait résoudre mon problème (avec 2 architectures de code différentes) :
- Est-ce que tu connais un moyen de trier les parts et les products de ma ListComposants ? (car aujourd'hui pour trier je vais lire directement l'extension du fichier, et j'y accède uniquement avec la méthode de tri qui fonctionne avec le nom de part, je n'arrive pas a y accéder avec listcomposant)
- Est-ce que tu connais un moyen d'accéder à l'instance de mon produit dans ma fonction de tri des part et products ? (qui serait le plus simple mais j'y arrive pas, pour obtenir l'instance je suis obligé de passé par ListComposant).
C'est compliqué à expliquer, alors j'espère que tu as compris (le fait qu'il faille effectuer l'identification de l'instance pendant le tri des parts et des products, et non pas avant ou après).
Merci d'avance,
Julien
PS : SI BESOIN JE TE DONNE MON FICHIER
Liocco08- actif
- Messages : 39
Date d'inscription : 07/04/2022
Localisation : Toulouse
Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)
Bonjour Julien,
Pour vérifier si un document est une part ou un product, tu peux vérifier s'il contient lui même des documents:
if ListComposants.Item(k).Products.count = 0 then
'c'est une part
else
'c'est un product
endif
Si tu veux, tu peux m'envoyer ton code complet je pourrais le tester, mon adresse mail est dans les messages privés
Pour vérifier si un document est une part ou un product, tu peux vérifier s'il contient lui même des documents:
if ListComposants.Item(k).Products.count = 0 then
'c'est une part
else
'c'est un product
endif
Si tu veux, tu peux m'envoyer ton code complet je pourrais le tester, mon adresse mail est dans les messages privés
lumpazepfel- Fédérateur
- Messages : 319
Date d'inscription : 02/11/2015
Localisation : Ensisheim
Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)
Update,
J'ai enfin réussis J'ai encore une incertitude quand on est en présence de "COMPOSANTS" dans l'arbre de construction donc je vais étudier ce détail, mais la MACRO semble fonctionner !
Je te remercie pour ton aide !
Si tu veux y jeter un coup d’œil je te l'envoie en MP du coup ?
Merci beaucoup, bonne journée !
J'ai enfin réussis J'ai encore une incertitude quand on est en présence de "COMPOSANTS" dans l'arbre de construction donc je vais étudier ce détail, mais la MACRO semble fonctionner !
Je te remercie pour ton aide !
Si tu veux y jeter un coup d’œil je te l'envoie en MP du coup ?
Merci beaucoup, bonne journée !
Liocco08- actif
- Messages : 39
Date d'inscription : 07/04/2022
Localisation : Toulouse
Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)
Salut,
Pour vérifier si c'est un composant, il faut comparer le nom du parent avec le nom du produit de tête, si c'est le même c'est un composant.
Comme tu utilises les instances, il sera peut être nécessaire de les renommer avant de lancer ta macro de trie.
Il y a une macro disponible ici http://www.eng-tips.com/viewthread.cfm?qid=365400.
Je veux bien que tu me transmettes la macro complète, c'est toujours interessant.
Merci
Pour vérifier si c'est un composant, il faut comparer le nom du parent avec le nom du produit de tête, si c'est le même c'est un composant.
Comme tu utilises les instances, il sera peut être nécessaire de les renommer avant de lancer ta macro de trie.
Il y a une macro disponible ici http://www.eng-tips.com/viewthread.cfm?qid=365400.
Je veux bien que tu me transmettes la macro complète, c'est toujours interessant.
Merci
lumpazepfel- Fédérateur
- Messages : 319
Date d'inscription : 02/11/2015
Localisation : Ensisheim
Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)
3
Dernière édition par Liocco08 le Mer 20 Avr 2022 - 16:55, édité 2 fois
Liocco08- actif
- Messages : 39
Date d'inscription : 07/04/2022
Localisation : Toulouse
Macro disponible
Je te remercie, cette macro est vraiment super utile. J'ai pu intégrer les composants dans ma macro pour trier mon arbre de construction comme je le souhaitais.
Aujourd'hui la macro fonctionne parfaitement comme je le souhaitais !
À tout ceux qui souhaite l'avoir, vous pouvez m'envoyer un message privé avec votre mail pour que je puisse vous partager le fichier (je n'y arrive pas sur le forum).
Merci à toi Lumpazepfel !
Julien
Aujourd'hui la macro fonctionne parfaitement comme je le souhaitais !
À tout ceux qui souhaite l'avoir, vous pouvez m'envoyer un message privé avec votre mail pour que je puisse vous partager le fichier (je n'y arrive pas sur le forum).
Merci à toi Lumpazepfel !
Julien
Liocco08- actif
- Messages : 39
Date d'inscription : 07/04/2022
Localisation : Toulouse
Sujets similaires
» Macro Import d'un arbre catia à partir d'un fichier excel
» analyser un arbre de construction
» Macro Excel Catia
» Problème Macro Catia V5R18
» Macro nomenclature et masse CATIA
» analyser un arbre de construction
» Macro Excel Catia
» Problème Macro Catia V5R18
» Macro nomenclature et masse CATIA
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum