Matching de données entre colonnes

LNRO

XLDnaute Nouveau
Bonjour,

Voici donc mon problème. D'un côté, j'ai un classeur Excel présentant un tableau dont les lignes vont être importées depuis un fichier externe via une macro. En tête de chaque ligne, l'identifiant figure déjà dans le fichier Excel. Ce qui nous donne donc quelque chose comme ça :

Code:
[B][I][U]Identifiant [/U]| [U]ID importé [/U]| ... | ... [/I][/B]
[B]A001      [/B]| ... | ... | ... 
[B]B001      [/B]| ... | ... | ... 
[B]C001      [/B]| ... | ... | ... 
[B]A002      [/B]| ... | ... | ... 
[B]B002      [/B]| ... | ... | ... 
[B]C002      [/B]| ... | ... | ... 
[B]A003      [/B]| ... | ... | ... 
[B].....  [/B]| ... | ... | ...

Les données importées ne le sont pas dans l'ordre des identifiants. On peut ainsi se retrouver, une fois l'import fait, avec quelque chose comme ça :

Code:
[B][I][U]Identifiant [/U]| [U]ID importé [/U]| ... | ... [/I][/B]
[B]A001      [/B]| C002 | ... | ... 
[B]B001      [/B]| A003 | ... | ... 
[B]C001      [/B]| B003 | ... | ... 
[B]A002      [/B]| C003 | ... | ... 
[B]B002      [/B]| A001 | ... | ... 
[B]C002      [/B]| B001 | ... | ... 
[B]A003      [/B]| C001 | ... | ... 
[B].....       [/B]| ... | ... | ...

Remettre tout dans l'ordre n'est pas un problème : la macro de tri est déjà faite par mes soins et fonctionne très bien.

Le problème est que, parfois, il manque une ligne dans les données importées, ce qui entraîne un décalage lors du tri: S'il manque la ligne B001 dans les données importées, on se retrouve alors avec ça :

Code:
[B][I][U]Identifiant [/U]| [U]ID importé [/U]| ... | ... [/I][/B]
[B]A001      [/B]| A001 | ... | ... 
[B]B001      [/B]| C001 | ... | ... 
[B]C001      [/B]| A002 | ... | ... 
[B]A002      [/B]| B002 | ... | ... 
[B]B002      [/B]| C002 | ... | ... 
[B]C002      [/B]| A003 | ... | ... 
[B]A003      [/B]| B003 | ... | ... 
[B].....       [/B]| ... | ... | ...

Je n'ai aucune possibilité de modifier la colonne "Identifiant" de quelque façon que ce soit. Que me conseillez-vous pour faire le matching des données du tableau, pour que les lignes importées correspondent au bon identifiant de tête de ligne, et que les champs restent vides si une série de données manque ?

D'avance merci,

- LNRO
 

pierrejean

XLDnaute Barbatruc
Re : Matching de données entre colonnes

bonjour LNRO

Pour t'aider efficacement un fichier exemple comportant quelques lignes et la macro serait utile
Une copie partielle de ton fichier (sans données confidentielles ) ferait parfaitement l'affaire
 

LNRO

XLDnaute Nouveau
Re : Matching de données entre colonnes

Bonjour pierrejean,

Malheureusement, la macro d'import elle-même est confidentielle. Quand à celle de tri, il s'agit banalement d'un Sort basé sur une liste, rien de bien sorcier.

Toutefois, si on peut faire correspondre chaque ligne importée à son identifiant "fixe", la macro de tri n'aura plus lieu d'être.
 

Tibo

XLDnaute Barbatruc
Re : Matching de données entre colonnes

Bonjour,

Je ne suis pas spécialiste macro, mais pour moi, seules les données peuvent être confidentielles.

Une macro ne devrait pas l'être, ou sinon, celles qui pourraient t'être proposées le sont également, et au quel cas, on ne pourrait pas te la communiquer.

Donc n'hésite pas à joindre ton fichier, surtout pour nous éviter d'avoir à le reconstituer.

Bref, aide nous à t'aider

@+
 

LNRO

XLDnaute Nouveau
Re : Matching de données entre colonnes

Je comprends bien Tibo, mais la politique de confidentialité dans ma boîte fait que ... Mais je vais essayer d'expliquer un peu mieux quelles est ma problématique, afin d'être plus clair.

Oublions toute cette histoire d'import et partons des données suivantes en considérant que le problème commence là :

Code:
 [B][U]ID1[/U] | [U]ID2[/U] | [U]data1[/U] | [U]data2[/U] | [U]data3[/U][/B]
[B]A001[/B] | [COLOR="Red"]IDi | VALx | VALy | VALz[/COLOR]
[B]A002[/B] | [COLOR="SandyBrown"]IDj | VALa | VALb | VALc[/COLOR]
 ... | ... | ...  | ...  | ... 
[B]A012[/B] | [COLOR="YellowGreen"]IDm | VALr | VALs | VALt[/COLOR]
[B]B001[/B] | [COLOR="Indigo"]IDn | VALu | VALv | VALw[/COLOR]
...
[B]H012[/B] | [COLOR="DarkRed"]IDf | VALp | VALq | VALr[/COLOR]

La première colonne (ID1) a des valeurs fixes et n'est pas éditable sous quelque forme que ce soit.

La seconde colonne (ID2) a des valeurs dans le même format que celles de la colonne ID1, toutes les valeurs de ID1 y sont d'ailleurs, mais pas dans le même ordre.

Ce qu'il faut obtenir, c'est que les valeurs de ID2 correspondent à celles de ID1 ; ce faisant, les valeurs des trois colonnes de données data1, data2 et data3 doivent être réarrangées dans ce sens, pour qu'elles correspondent toujours à leur ID2

(en clair toute la ligne (sauf la colonne ID1) doit suivre le réarrangement des données de ID2)


J'espère que cela est plus clair maintenant.
 
Dernière édition:

LNRO

XLDnaute Nouveau
Re : Matching de données entre colonnes

Je verrais bien deux possibilités, mais j'avoue que mon niveau de grand débutant en vba ne m'aide pas à trouver laquelle serait la plus viable :



Première version :

1) D'abord, faire un tri dans le bloc de données "ID2 + data1 + data2 + data3" (en triant selon ID2).

2) scanner ligne par ligne dans le bloc "ID2 + data1 + data2 + data3" ainsi trié : si la valeur de ID2 ne correspond pas à celle de ID1, c'est qu'il n'y a pas de valeur pour cette ligne, alors on décale tout d'une ligne vers le bas et on recommence jusqu'à la fin du bloc.



Seconde version :

1) Je coupe/colle les données du bloc "ID2 + data1 + data2 + data3" ailleurs (autre feuille sans doute).

2) je fais une boucle qui scanne les valeurs de ID1, va chercher dans l'autre feuille quelle est la ligne dont le ID2 correspond, copie cette ligne dans la feuille de départ en face du bon ID1, et passe à l'ID1 suivant.


Que me conseillez vous ?
 

skoobi

XLDnaute Barbatruc
Re : Matching de données entre colonnes

Bonjour LNRO,
salut tibo, pierrejean :),

Je te propose ce code, qui est légèrement différent de la version 2 en ce sens que les données spnt directement coupé et collé (par insertion) dans la même feuille:
Code:
Sub trier()
Application.ScreenUpdating = False
For Each id1 In Range([A2], [A2].End(xlDown))
  Set id2 = Columns("B").Find(id1.Value, LookIn:=xlValues, lookat:=xlWhole)
  If Not id2 Is Nothing Then
    If id2.Row <> id1.Row Then
      id2.Resize(1, 4).Cut
      id1.Offset(0, 1).Insert Shift:=xlDown
    End If
  End If
Next
Application.ScreenUpdating = True
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 153
Messages
2 085 806
Membres
102 984
dernier inscrit
k.robert