Matching de données VBA

Thibaultt

XLDnaute Nouveau
Bonjour je viens vers vous car confronté à une difficulté en VBA dont je ne connais pas la syntaxe et je dois pourtant très vite réaliser cette macro.

Je vous décris rapidement ce que je veux faire puis tente une description par "pseudocode" :
J'ai une feuille qui opère un matching d'un type de règles A vers un type B .
Je veux remplir une autre feuille qui effectue le matching dans l'autre sens.
Je parcours alors une colonne de ma nouvelle feuille règle par règle en cherchant dans la feuille 1 sa correspondance, si je la trouve je copie un ensemble de données . le problème n'est pas bijectif donc je continue jusqu'à avoir trouvé un nombre donné de correspondances.
Enfin je prends le code suivant et effectue le même travail .

En termes un petit peu plus précis :

Je possède deux feuilles de travail .
Je crée une variable NOMBRE = 1 ;
Une feuille 1 dont la colonne F m'intéresse : première itération de ma boucle
- Je considère la valeur de la cellule F3
- Je passe en feuille 2 et je parcours la colonne H depuis la ligne 3 jusqu'à disons 500 avec une boucle while pour chercher cette valeur
- Si je la trouve à la ligne disons alpha, je copie l'ensemble des deux cellules Balpha-Calpha
- Je reviens en feuille 1 et colle ces données dans L3-M3
- Je reviens dans ma feuille 2 et continue à parcourir ma colonne H .
Si je trouve de nouveau un match à la ligne beta j'incrémente NOMBRE je copie les données Bbeta-Cbeta je change de feuille crée une ligne et copie les données Bbeta-Cbeta dans L4-M4 de ma feuille 1 .


Finalement NOMBRE sera égal au nombre de match que l'on aura trouvé pour une valeur donnée dans parcourant la colonne H .

Quand la boucle while se termine le travail et à recommencer en selectionnant la cellule F(3+NOMBRE) sans oublier de réaffecter NOMBRE = 1; et considérant L(3+NOMBRE)-M(3+NOMBRE) comme endroit ou coller les données .

On arrête le programme lorsque F () est vide .



Je remercie ceux qui prendront le temps de me lire et de m'aider,
Cordialement,
Thibault.
 

ROGER2327

XLDnaute Barbatruc
Re : Matching de données VBA

Bonsoir Thibaultt.



Tout cela est limpide.​
VB:
Sub toto()
Dim NOMBRE&, tmp, ACel As Range, BCel As Range
    For Each ACel In Feuil1.Range("DatA").Cells
        If Not IsEmpty(ACel.Value) Then
            tmp = ACel.Value
            For Each BCel In Feuil2.Range("DatB").Cells
                If tmp = BCel.Value Then
                    If NOMBRE Then ACel.Offset(NOMBRE).EntireRow.Insert Shift:=xlShiftDown
                    ACel.Offset(NOMBRE, 6).Resize(1, 2).Value = BCel.Offset(, -6).Resize(1, 2).Value
                    NOMBRE = NOMBRE + 1
                End If
            Next
        End If
        NOMBRE = 0
    Next
End Sub



ROGER2327
#6518


Samedi 21 Pédale 140 (Saint Inscrit, Converti - fête Suprême Quarte)
25 Ventôse An CCXXI, 9,2054h - thon
2013-W11-5T22:05:35Z
 

Thibaultt

XLDnaute Nouveau
Re : Matching de données VBA

Bonjour,
Merci de vous être intéressé à mon problème, ma connaissance du vba étant limitée j'ai cependant quelques questions :
- DatA et DatB doivent bien être les noms que je donne aux plages de valeurs ( en l'occurence les collones que je vais parcourir ? "
- aussi quand j'éxécute Feuil1.Range , il me dit que la méthode Range a échoué ..
Faut il que je change Feuil1 par le nom de ma feuille ? En faisant ceci de même il me dit qu'il y a une erreur : " objet requis", pouvez vous m'éclairer ?!
Merci,
Thibault.
 

néné06

XLDnaute Accro
Re : Matching de données VBA

Bonjour Roger,Thibault,

Sans voir exactement la configuration de ton fichier, il est difficile d'apporter une aide efficace, mais ce type d'erreur provient souvent du fait que la macro est placé dans une feuille et doit travailler sur une autre feuille.
Il est souhaitable de placer cette macro dans un "MODULE" pour ne plus avoir d'erreur.
C'est une piste avec les données que l'on disposes.

A+

René
 

ROGER2327

XLDnaute Barbatruc
Re : Matching de données VBA

Re...


Bonjour,
Merci de vous être intéressé à mon problème, ma connaissance du vba étant limitée j'ai cependant quelques questions :
- DatA et DatB doivent bien être les noms que je donne aux plages de valeurs ( en l'occurence les collones que je vais parcourir ? "
- aussi quand j'éxécute Feuil1.Range , il me dit que la méthode Range a échoué ..
Faut il que je change Feuil1 par le nom de ma feuille ? En faisant ceci de même il me dit qu'il y a une erreur : " objet requis", pouvez vous m'éclairer ?!
Merci,
Thibault.

En l'absence de tout support, j'ai écrit une procédure générique qui ne vaut que pour sa structure. Tout est à adapter à un cas particulier.
DatA est une partie de colonne de la feuille Feuil1.
DatB est une partie de colonne de la feuille Feuil2.
Il vous faut évidemment écrire cela autrement. Si, par exemple, les données sont d'une part dans la plage F2:F327 de l'onglet a l'échalotte, d'autre part dans la plage H23:H2327 de l'onglet sauce moutarde :
VB:
'...

    For Each ACel In Sheets("a l'échalotte").Range("F2:F327").Cells
        If Not IsEmpty(ACel.Value) Then
            tmp = ACel.Value
            For Each BCel In Sheets("sauce moutarde").Range("H23:H2327").Cells
'...
La procédure charge la variable tmp (de type Variant) avec la valeur de la première cellule non vide de la plage DatA ; la valeur de tmp est ensuite comparée à chacune des valeurs des cellules de la plage DatB.
Si, lors de l'une de ces comparaisons, tmp = BCel.Value renvoie True, la procédure copie les deux valeurs situées 6 et 5 colonnes à gauche de la cellule de référence BCel et place leurs valeurs dans les cellules situées 6 et 7 colonnes à droite de la cellule de référence ACel. Puis le compteur NOMBRE passe à 1. Si les données à copier ne sont pas celles décrites ci-dessus, il vous faut adapter la ligne
VB:
ACel.Offset(NOMBRE, 6).Resize(1, 2).Value = BCel.Offset(, -6).Resize(1, 2).Value
Si une autre comparaison renvoie True, la procédure insère une NOMBRE[SUP]ième[/SUP] ligne supplémentaire sous la ligne de la cellule de référence ACel, puis y place comme précédemment les deux valeurs situées 6 et 5 colonnes à gauche de la cellule de référence BCel. Puis le compteur NOMBRE est incrémenté (au pas de 1).
Lorsque toutes les cellules de la plage DatB ont été comparées à tmp, le compteur NOMBRE est remis à zéro, puis la procédure recommence avec la première cellule non vide de la plage DatA qui suit celle qui vient d'être traitée.
La procédure s'achève lorsque toutes les cellules non vides de la plage DatA ont été comparées avec toutes les cellules de la plage DatB.

C'est long à décrire, et je pense qu'il serait beaucoup plus simple que nous disposassions d'un support pour y porter le code : une exécution pas-à-pas du dit code permettrait que vous vissiez exactement ce qui se passe. À vous de voir si le jeu en vaut la chandelle...


Bonne soirée.


ROGER2327
#6521


Dimanche 22 Pédale 140 (Saint Sengle, Déserteur - fête Suprême Seconde)
26 Ventôse An CCXXI, 7,0853h - pissenlit
2013-W11-6T17:00:17Z

__________________
P.s. : Telle qu'elle est écrite, la procédure peut aussi bien être placée dans un module de feuille que de dans un module standard.
 
Dernière édition:

Thibaultt

XLDnaute Nouveau
Re : Matching de données VBA

Bonjour à vous deux,
J'avais compris que le code que vous me donniez faisait exactement ce que je voulais , j'avais donc crée les plages de valeur datA et datB, le seul problème était que ne connaissant que peu la syntaxe je n'ai pas vu qu'il "manquait" un Sheets .. !
Je vous remercie beaucoup, cela fonctionne !
Les données que je traite sont confidentielles, c'est pour cela que je n'ai pas copié le fichier, effectivement j'aurais pu en créer un générique sans l'ensemble des données .

Au delà de ça miles merci, j'avais personnellement écrit un macro mais en faisant réellement tout à la main en incrémentant une multitude de compteurs ^^ ! Je me rends compte que le VBA est un langage de progra au même titre que les autres, peut être faudrait il l'apprendre!

En espérant ne pas avoir à revenir vous déranger,

Thibault.
 

Discussions similaires

Réponses
7
Affichages
347
Réponses
18
Affichages
661

Statistiques des forums

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