Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 MACRO Comment comparer deux tableaux et reporter les résultats dans un autre Tableau?

kwint14

XLDnaute Nouveau
Bonjour à tous,

Je suis grand débutant sur VBA. Jusqu'à présent j'ai réussi à me débrouiller en suivant les cours et les cas du forum, mais aujourd'hui cela ne suffit pas et j'espère que vous pourrez m'aider.

Je sais que le sujet à déjà été abordé, mais je n'ai pas réussi à adapter les corrections à ma situation, que voici :

J'ai deux tableaux dynamiques (que j'ai créé avec VBA) et qui fonctionnent (test avec msgbox).
  1. Le premier est une liste de produits (tab_article). Il contient 4 colonnes (seule la colonne 4 est utile dans le cas présent)
  2. Le second est une liste de couleur (tab_couleur) qui liste les couleurs associées aux produits de la première tab. Il contient 4 colonnes. Seules les colonnes 2,3 et 4 sont utiles dans le cas présent. La difficulté c'est qu'un produit peut avoir plusieurs couleurs. Ainsi, un produit apparaît une seule fois dans tab_article mais peut apparaître 0, 1 ou plusieurs fois dans tab_couleur (selon si ce produit existe en une, deux, n couleurs… n>= 0 )

Voici une vue simplifiée des tableaux:

Tab_article()
k,0 k,1 k,2 k,3 k,4
A305
Z88
P30


Tab_couleur()
j,0 j,1 j,2 j,3 j,4
BN Bleu nuit A305
RG Rouge A305
RSRose A305
VR Vert Z88


Sachant cela, j'aimerais arriver à remplir automatiquement un troisième tableaux dynamique - grâce aux références produit qui se trouvent dans les deux premiers tableaux (ici A305, Z88, P30) - afin de lister tous les produits avec toutes les couleurs associées tel que:

Tab_trois
A305 BN Bleu nuit
A305 RG Rouge
A305 RS Rose
Z88 VR Vert
P30 " "" "


J'ai essayé avec une condition qui compare les valeurs des colonnes n° 4 dans chacun des tableaux, ligne à ligne, mais cela n'a pas fonctionné.


Merci pour votre aide,
Et bonne journée à tous
 

eriiic

XLDnaute Barbatruc
Bonjour,

Avec power pivot.
Présent dans les versions récentes d'excel ou qu'on ajoute en addin dans les autres.
Résultat dans Feuil3
C'est ma 1ère utilisation de power pivot, alors pas trop de questions difficiles... ;-)
eric
 

Pièces jointes

  • kwint.xlsx
    319.2 KB · Affichages: 11

kwint14

XLDnaute Nouveau
Bonjour kwint

Un essai


Bonjour Pierre Jean,

Merci pour votre retour rapide

J'ai bien regardé votre fichier qui effectivement fonctionne à merveille dans ce cas.

Comme c'était une situation "bidon" et que j'ai besoin de l'adapter à mon début de code et surtout de me l'approprier, je me permets de vous poser quelques questions complémentaires, si toutefois vous êtes toujours disponible.


  • Si j'ai bien compris, tabres correspond au troisième tableau. En revanche, je ne comprends pas la déclaration de ses dimensions (1 to 3,0) , pourriez-vous me l'expliquer svp ? Est-ce que tabres tel que déclaré est un tableau dynamique ?

  • J'ai bien compris comment on définit n et m, par contre je ne suis pas sûre de comprendre comment on définit x.
    • X = tab_article (n,5) >> signifie-t-il que x va prendre toutes les valeurs de la colonne 5 de table_article avec n qui va varier de la première à la dernière ligne de la table (soit les cellules 1,1 1,2 1,3 1,4 et enfin 1,5) ?
    • tabres(1, UBound(tabres, 2)) = x >> veut-il dire que dans la nouvelle table tabres pour la ligne 1 et pour la colonne variant selon les le nombre de colonnes de la tab_res (donc de 0 à 2 ?) on renvoie x (qui lui-même varie en fonction de n tel que défini ci avant ?)

  • Remplissage du tableau tab_res
    • Si je fais un msgbox de (tabres,2) j'ai 0 1 2 et 3 . Comment tabres peut aller jusqu'à 3 ? Ne s'agit-il pas d'une fonction qui renvoie la dernière ligne d'une dimension d'un tableau (soit le nombre de colonnes, soit jusqu'à 2 dans notre cas)

  • Fonctionnement de redim preservce
    • Le +1 permet de passer à la ligne d'après dans tab_res c'est bien ça ?
    • Et si on a plus de valeurs que cela dans article et couleur (en réalité, je les ai créé en dynamique, pour l'instant je travaille sur quelques lignes seulement, mais le fichier au global pourra atteindre jusqu'à 3000 lignes), est-ce le +1 à lui seul permettrait de répéter la comparaison ( If tab_couleur(m, 5) = x) ou est ce qu'on devrait mettre une loop qui va du début de la comparaison à redim preserve ?
  • Enfin, à quoi sert Application.Transpose(tabres) ?


Bien cordialement,
Kwint
 

kwint14

XLDnaute Nouveau
Bonjour,

Avec power pivot.
Présent dans les versions récentes d'excel ou qu'on ajoute en addin dans les autres.
Résultat dans Feuil3
C'est ma 1ère utilisation de power pivot, alors pas trop de questions difficiles... ;-)
eric

Bonjour Eric,

C'est bon à savoir, merci !
Dans mon cas, je souhaite travailler en vba exclusivement, donc je ne pourrai pas utiliser votre astuce...

Bonne journée,
Kwint
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re
tabres est un tableau qui possède 3 lignes (1 to 3) et qui au départ n'a qu'une colonne (0)
Le Redim preserve va a chaque utilisation lui ajouter une colonne
J'utilise ce tableau 'horizontal' quand je ne connais pas la longueur du tableau final
En effet Redim ne permet de modifier que le second paramètre (en l’occurrence le nombre de colonnes)
Le preserve conserve les données déjà présentes
Enfin le Transpose lui donne une rotation de 90° permettant ainsi d'avoir au final un tableau 'vertical' (3 colonnes et autant de lignes que nécessaire)
En soi tabres n'est pas dynamique mais il est aisé de déclencher la macro Maj_tab3 à chaque modification soit des 2 tableaux d'origine soit même de toute la feuille
Si ceci n'est pas assez clair ne pas hésiter à revenir
 

kwint14

XLDnaute Nouveau



Pierre Jean,

Merci pour ces explications qui m'ont éclairé.

J'ai essayé d'intégrer le tableau result à mon code, et d'en afficher le contenu dans un onglet tab_trois. Je n'ai pas de message d'erreur, mais le résultat affiché en tab_trois n'est pas correct …

Peut-être que cette erreur est dûe aux points suivants :
- j'avais travaillé avec des tableaux commençant à (0,0), et ensuite avec tab_result je travaille en (1,1)…
- Dans le même genre, quand on déclare tab_result : le nombre de ligne commence à 1 (et pas zéro) tandis que le nombre de colonnes commence à 0 …
- J'ai défini article en fonction de k, couleur en fonction de j, et plus tard dans le remplissage du tableau on utilise m et n

Est-ce que ces points peuvent être bloquants pour le calcul, même sans me renvoyer d'erreur? Qu'en pensez-vous ?

Je me permets de joindre mon fichier anonymisé si vous voulez bien y jeter un œil.


kwint
 
Dernière édition:

kwint14

XLDnaute Nouveau
Re
Correction de ton fichier
Note la façon de renvoyer un tableau


Re Pierre Jean,

Le code fonctionne en l'état. Merci pour votre contribution.
Si on ajoute des nouveaux produits et couleurs aux fichiers d'entrées (par ex: A305 et B128 cf. doc ci-joint) on a une répétition des premiers résultats, comme si le code intégrait les nouveaux éléments en plus des premiers (on a l'initialisation de B128 et la répétition de toutes les valeurs de A305 dans le résultats renvoyé en tab_trois). Comment explique t on cela ? Ce n'est pas méchant, je pourrais faire une suppression de doublons, mais je trouve cela dommage…

J'ai bien noté la méthode pour renvoyer le tableau en "un seul morceau", merci

Ce que j'essayais d'écrire c'est de renvoyer les colonnes du tab_result (transposé de 90°) colonne par colonne (et non pas en un seul bloc) dans tab_trois de façon à avoir les références produits en colonne B de tab_trois et l'association de code couleur et de référence couleur (avec un "&") en colonne H. Est-ce que c'est possible à votre connaissance? Recommandez vous l'utilisation d'un "décaler" ?

Kwint
 
Dernière édition:

kwint14

XLDnaute Nouveau
Bonjour @pierrejean

J'ai pu reprendre de mon côté les sujets d'hier et je souhaitais vous en informer :

- Pour les doublons, cela s'explique par le fait que le code est exécuté tant que la ligne (de la valeur cherchée dans tab_article) est différente de zéro soit pour chaque code produit. Pour un produit qui apparaîtrait plusieurs fois on va donc recommencer la recherche dans la seconde table. En pratique ce cas est très rare (désolé, comme je travaillais avec un fichier "bidon" je me suis moi-même un peu emmêlé les pinceaux)... mais ce cas peu quand même arriver. Pour cela, j'ai simplement ajouté un remove duplicates en fin de code après le remplissage

- Pour le renvoie du tableau colonne par colonne, j'ai créé un tableau plus grand (lors de l'initialisation avant la transposition), en remplissant les lignes qui m’intéressent (et sans remplir celles qui ne m’intéressent pas). Ainsi, on peut renvoyer le tableau en un seul bloc, et avoir les colonnes concernées qui se remplissent comme je le souhaite.

Il me semble que je suis en bon chemin, et que je devrais pouvoir finaliser prochainement.


Je tiens à vous remercier pour votre aide. J'ai apprécié votre professionnalisme et votre disponibilité et je suis content d'avoir appris de nouveaux cas.
Au plaisir de se recroiser prochainement sur le forum,

Kwint
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…