Tableaux dans vba

akni

XLDnaute Nouveau
Bonjour,
J'ai un tableau des quantités vendues par articles, clients et mois, je veux faire une récap par client sans passer par TCD quand j'utilise la méthode FOR NEXT elle tarde un peu, je crois qu'avec les tableaux Ubound et Lbound le résultat sera rapide.
ci joint mon fichier avec la macro FOR NEXT.


Merci beaucoup pour toute aide.
 

Pièces jointes

  • test Tableau 2.xlsm
    1.8 MB · Affichages: 116

Dranreb

XLDnaute Barbatruc
Qu'est-ce que tu n'a pas compris ?
Les ListColumn sont identifiés par les entêtes de colonnes dans la collection ListColumns du ListObject.
Quand il y en a un (du fait qu'on a utilisé la commande Mettre sous forme de tableau du groupe Styles dans le menu Accueil) il est détecté par la fonction Gigogne, laquelle accepte alors des String contenant ces titres en guise de spécifications de colonnes.
 
Dernière édition:

KIM

XLDnaute Accro
Bonsoir Dranreb, et le forum,
En effet j'ai identifié le numéro de col pour chaque entête utilisée dans la macro via la focnction find :
Set C = .Find(valeur, LookIn:=xlValues)
Ainsi les lignes suivantes fonctionnet correctement en remplacement le numéro de la colonne par C.Column
Set DicTit = GigIdx.DicInvent(FDonn.[A5:G9], PHASE_Col, PHASE_Col)
For Each DPT In GigIdx.Gigogne(Null, DPT_Col, SERV_Col, SITE_Col, EQP_Col)
TRés(L, DicTit(Détail(PHASE_Col))) = Détail(ETAT_Col)
Maintenant je dois améliorer ma fonction de recherche de numéro de colonne pour un titre donné.

J'en profite pour te demander s'il y a du nouveau (nouvelle version) dans tes modules de service ?
Merci encore et bonne soirée.
KIM
 

Dranreb

XLDnaute Barbatruc
J'ai effectivement modifié deux trois bricoles très secondaires aujourd'hui. Mais ça ne vaut pas le coup et de plus il faudra que je teste. Les noms de colonnes de tableaux justement. On ne peut pas mettre de signe moins devant pour demander un classement en ordre décroissant. Alors if faut l'intégrer dans le texte. Mais alors du coup si jamais le nom de colonne commence par un "-" qu'est-ce qu'on fait ? Et bien on met un "\" devant pour qu'il ne soit pas interprété. Et si le nom de colonne commence par un "\" me direz vous ? Et bien on en met deux.
Pour trouver un titre de tableau Excel, pas besoin de Find. On a LO.ListColumns(LeTitre).Index qui donne le numéro d'ordre de la colonne dans le ListObject LO.
J'ai aussi ajouté un contrôle des colonnes numériques spécifiées pour vérifier s'il n'y en a pas en dehors de celles du tableau.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Non pour un test c'est
Dim LOt As ListObject, LCn As ListColumn
Set LOt = ActiveSheet.ListObjects(1)
Set LCn = LOt.ListColumns("*DPT*")
If LCn Is Nothing Then MsgBox "Le tableau " & Lot.Name & " ne contient pas cette colonne."

Pour la fonction Gigogne on ne s'en occupe pas: elle détecte toute seule le ListObject s'il en existe un qui couvre la plage spécifiée, ne serait ce que pour prendre directement sa DataBodyRange au lieu d'être obligé de chercher la dernière ligne pour savoir combien il y en a.

Je joins la version actuelle, non testée, du classeur précurseur.
 

Pièces jointes

  • GigIdx.xlsm
    80.9 KB · Affichages: 14
Dernière édition:

KIM

XLDnaute Accro
Re,
J'ai installé cette version GigIdx.
1/ Au 1er test de ton code proposé,
Dim LOt As ListObject, LCn As ListColumn
Set LOt = ActiveSheet.ListObjects(1)
Set LCn = LOt.ListColumns("*DPT*")
If LCn Is Nothing Then MsgBox "Le tableau " & LOt.Name & " ne contient pas cette colonne."

j'ai le message suivant
Erreur d'exécution 9, L'indice n'appartient pas à la sélection
au niveau de la ligne de code : Set LOt = ActiveSheet.ListObjects(1)
Est-ce que le (1) correspond à la ligne des titres de colonnes ?
Je l'ai remplacé par (4) et j'ai toujours la même erreur.

2/ Si j'ai bien compris, est ce que je dois rajouter autant de LC1, LC2 , etc pour identifier les titres des colonnes par leur numéro ?

3/ Pour la fonction Gigogne
Gigogne(Null, 3, 2, 5, 4) j'imagine que je dois remplacer 3 par LCn qui correspond au num de colonne du titre DPT : Gigogne(Null, LCn, 2, 5, 4)

Merci encore
KIM
 

Dranreb

XLDnaute Barbatruc
Non, le 1 correspond au numéro d'ordre du tableau, car il peut y en avoir plusieurs dans une feuille. On peut aussi plutôt préciser son nom si on le connait.
Ce message indique donc qu'il n'existe aucun tableau dans celle ci, seulement des plages ordinaires non mises sous forme de tableaux.
Non, vous pourrez toujours utiliser le même LCn juste pour avoir le LCn.Index
Parce que si vous essayez directement LOt.ListColumns("DPT").Index vous aurez une erreur d'exécution si la colonne de ce nom n'existe pas.
Non vous pourrez directement mettre Gigogne(Null, "DPT", 2, 5, 4)
Mais vous aurez le message "Argument "+DPT" sans ListObject." si la plage de donnée n'aura pas fait l'objet d'une mise sous forme de tableau. (Rappel: menu Accueil, groupe Styles, commande Mettre sous forme de tableau)
Si la colonne n'existe pas vous aurez le message "Entête "DPT" introuvable dans Tableau 1"
 
Dernière édition:

KIM

XLDnaute Accro
Re, Désolé Dranreb,
J'ai essayé mais toujours la même erreur.
Dans ma version initiale, j'ai réussi avec une fonction qui me retourne le numero de col et tout fonctionne.
Par contre j'ai souhaité utilisé ta proposition sans passer par une fonction externe. Je n'ai pas réussi.
Ci-joint un de tes fichiers adapté pour le test avec la macro RecapParPhase_v2.
Merci d'avance
KIM
 

Pièces jointes

  • GigogneRefCol_vE1.xlsm
    18.1 KB · Affichages: 15

KIM

XLDnaute Accro
Re,
Est-ce que cela veut dire que je dois initialiser ListColum
Set ListColum = FDonn.[A4:H4]
me donne ListColumn non défini
Je cherche à introduire la ligne des titres dans FDonn. Suis-je dans la bonne logique ?
Que faire Merci.
KIM
 

Dranreb

XLDnaute Barbatruc
Non. Vous n'avez absolument rien compris. Il n'y a rien d'autre à faire qu'à commencer par convertir en tableaux Excel les plages ordinaires pour lesquels on veut bénéficier de ces fonctionnalités au moyen de ces objets de classes assez récentes.
J'ai été obligé de corriger quelques détails dans GigIdx sur lesquels je ne vais pas m'étendre.
Quoi qu'il en soit, dans ce classeur, où je l'ai fait, la macro RecapParPhase_v2 telle que je l'ai écrite fonctionne chez moi.
 

Pièces jointes

  • GigogneKIM(AvecLO).xlsm
    20.8 KB · Affichages: 20
  • GigIdx.xlsm
    82.3 KB · Affichages: 20

KIM

XLDnaute Accro
Bonsoir Dranreb,
Je n'aurai jamais réussi à finaliser cette macro. Je vais la décortiquer.
J'ai aussi rajouté un cumul selon les phases
TRés(L, DicTit(Détail(nC_PHASE))) = TRés(L, DicTit(Détail(nC_PHASE))) + Détail(nC_BUD)
J'ai testé et cela fonctionne aussi chez moi avec la dernière version de GigIdx.xlsm.
J'ai beaucoup de tableaux de synthèse basées sur Gigogne. Je pense que rien n'a changé dans l'utilisation de Gigogne de la version antérieure.
Merci de me renvoyer ta version finalisée de GigIdx.xlsm
Bonne soirée
KIM
 

Dranreb

XLDnaute Barbatruc
C'est ma version actuelle de GigIdx.xlsm que j'ai joint. Il n'y a que des changements mineurs. Il reste toutefois à en rapporter quelques un dans la feuille d'aide. Il y a déjà ça dans la description du paramètre ColOrd de la fonction Gigogne :
Remarque: Un élément String sera interprété comme un titre de tableau Excel (ListObject) après retrait
d'un éventuel "+" ou "-" au début. Mais si c'est un "-" la colonne sera classée en ordre décroissant.
La Sub VerserTitres a été intégrée aussi.
 
Dernière édition:

KIM

XLDnaute Accro
Bonjour Dranreb, et le forum,
Pour mieux comprendre et mieux utiliser cette fonctionnalité, je souhaite si possible avoir plus d'explication. Merci d'avance.
1/ Set LOt = FDonn.ListObjects(1)
Comment ListObjects reconnait un tableau?
Comment ListObjects a reconnu que la ligne des titres est la ligne 4?
Que se passe-t-il s'il y a d'autres données en ligne 2 et 3

Vous m'avez dit que :
"le 1 correspond au numéro d'ordre du tableau, car il peut y en avoir plusieurs dans une feuille."
Que veut dire "Numéro d'ordre du tableau" ?
"On peut aussi plutôt préciser son nom si on le connait."
Quel nom ? "DPT" par exemple ou un nom donné à la ligne des titres ?

2/ DicInvent(LOt, "PHASE", nC_PHASE)
Nous pouvons donc utiliser facilement
DicInvent(LOt, "PHASE", "PHASE") ou DicInvent(LOt, nC_PHASE, nC_PHASE)

3/ Vous avez calculé le num de col pour PHASE : nC_PHASE = NColTab(LOt, "PHASE")
et non pour DPT ? Est-ce à cause de l'objet "Détail" qui nécessite un num de col?

Merci encore
KIM
 

Discussions similaires

Réponses
1
Affichages
347

Membres actuellement en ligne

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa