XL 2016 Array_Dico_Variables à vider ?

BARNS

XLDnaute Junior
Bonjour,

J'ai réalisé un logiciel pour calculer une liste de matériel sans rentrer dans les détails non nécessaire voilà mon problème :

Des données d'une feuille sont analysées pour enlever les doublons et regrouper les valeurs.

Les données analysées :
1631887684619.png


Liste sans doublons :

1631887721041.png


Le problème est que parfois les quantités sont bonnes parfois non ... c'est à dire que dans cette exemple je devrais avoir seulement 1 tuyau souple LG2020.

Nous passons par différentes objets pour effectuer ce traitement : cellule, array, dico.

Il n'y a visiblement aucun souci sur les cellules et les arrays.

Je pense qu'il doit y avoir certains items du dico qui reste en mémoire. J'ai essayé de vider mais comme le dico est créé a chaque lancement de code ca n'a pas trop de sens

VB:
Set dicotubes = CreateObject("Scripting.Dictionary")

Si quelqu'un à une idée je suis preneur :)

Ces partie de code sont dans le modules M03_LongCannes dans le fichier joint.

Pour lancer le code : cliquer sur Etape 1 puis 2 puis 3. Le problème doit apparaître en lancant plusieurs fois le code.
 

Pièces jointes

  • Conf_canne_14_09_2021.xlsm
    224.7 KB · Affichages: 13

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir,
Après moult bidouilles, je me suis aperçu que Range("Tab_Cannes_ref").Rows.Count valait 233 alors que le tableau de Cannes_ref se termine en 234.
J'ai donc rajouté +1 afin d'aller jusqu'à la dernière ligne et bizarrement ça à l'air de marcher, pouvez vous confirmer ?
Modif dans Sub dico_tubes() :
VB:
For n = 2 To Range("Tab_Cannes_ref").Rows.Count + 1
 

ChTi160

XLDnaute Barbatruc
Bonjour BARNS
Bonjour sylvanu ,le Forum
je pense que 233 correspond à la Plage "DataBodyRange" du Tableau soit la Plage du Tableau Structuré " "Tab_Cannes_ref " moins la Ligne d'entêtes ?
soit
VB:
ActiveSheet.ListObjects("Tab_Cannes_ref").Range.Rows.Count ' Le tableau Complet avec ligne d'entetes (234)

Range("Tab_Cannes_ref").ListObject.DataBodyRange.Rows.Count ' Plage de Données à partir de la Ligne 2 du Tableau (233)
peut être utile ???
jean marie
 

ChTi160

XLDnaute Barbatruc
Re
autre remarque
dans :
VB:
For n = 2 To Range("Tab_Cannes_ref").Rows.Count
on commence la boucle sur la deuxième valeur (Ligne) du "DataBodyRange" du tableau "Tab_Cannes_ref"
boucle sur l'ensemble de sLignes du DataBodyrange
Code:
For n = 1 To Range("Tab_Cannes_ref").Rows.Count
jean marie
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Exact, mais c'est une "maladresse" de Barns. Car le pointeur max est basé sur DataBodyRange mais ensuite il scrute pas rapport aux cellules et non au tableau avec : Sheets("Cannes_ref").Cells(n, 4).
Pour être cohérent il eût été préférable soit de pointer sur DataBodyRange et accéder aux lignes du tableau structuré avec les instructions spécifiques à ces tableaux, soit chercher la dernière cellule occupée et accéder aux données par Cells(L,C)
D'où le 2 au lieu de 1, la première donnée du tableau se trouve en ligne 2. :confused:
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
C'est vrai que j'ai galéré pour trouver.
1- Dans User, Appuyer sur Clear puis sur Etape1
2- En PAF (B62) mettre 30
3- Appuyer sur Etape2 puis sur Etape3
En C81 on devrait trouver 1. Ca marche mais si on répète plusieurs fois on finit par trouver 2.
Si je rajoute mon +1 à For n = 2 To Range("Tab_Cannes_ref").Rows.Count + 1 alors je ne suis pas arrivé à reproduire le problème.
Mais comme le problème est aléatoire, je ne sais pas si c'est bon ou non, c'est pour ça que j'ai demandé à Barns de confirmer.
NB : La modif n'a rien à voir, à priori, avec le smilblic d'où mon interrogation.
 

BARNS

XLDnaute Junior
"Après moulte bidouille" désolé je vais devoir travailler sur l'ergonomie ...
J'avoue que je ne comprends pas pourquoi rajouter +1 enlève le beug mais soit.. :)
ET je ne comprends pas trop cette phrase " Car le pointeur max est basé sur DataBodyRange mais ensuite il scrute pas rapport aux cellules et non au tableau avec : Sheets("Cannes_ref").Cells(n, 4)." Qu'est-ce que j'aurais dû faire ?
J'ai essayé de faire au mieux mais franchement je suis super ouvert, j'ai conscience que mon code est pas du tout optimisé et je suis preneur de n'importe quel conseil qui ferait gagné en caractères ou en clarté.
Dans tout les cas merci pour avoir solutionné mon problème en espérant qu'il ne revienne pas ;).
Bonne semaine à tous :)
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir,
Ce n'état pas une critique loin de là, mais un aparté avec ChTi. :)
Ca marche très bien ainsi, on discutait seulement du 2 au lieu de 1.
Range("Tab_Cannes_ref").Rows.Count compte le nombre de lignes d'un tableau structuré, donc la première ligne est après la ligne des entêtes. Mais quand on accède aux cellules avec Cells(n, 4) alors on commence à 2 car l'indice 1 ce sont les entêtes. C'est tout. Désolé si je vous ai froissé.
Mais est ce que cette modif retire réellement le bug ?
 

BARNS

XLDnaute Junior
Non vraiment absolument aucun souci. Justement plus il y a de critiques plus j'ai la chance de comprendre et de progresser. Et j'ai conscience que mon code est vraiment pas terrible, j'ai essayé de prendre tous les conseils que l'on m'a donné jusqu'alors sur ce fichier pour l'améliorer mais il y a encore du boulot.
Au delà d'un code seulement fonctionnel je cherche une syntaxe compréhensible, évolutive et qui respecte les règles de la programmation.
Et ce programme est un peu plus complexe que le premier fichier sur lequel tu m'avais largement aidé (un configurateur canon) qui m'a fait mettre le doigt dans le vba
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 943
Membres
101 849
dernier inscrit
florentMIG