Accueil > Forum > > > > Comparaison de données sous Excel
Comparaison de données sous Excel
jeudi 10 avril 2008 à 00:03:54 |
Comparaison de données sous Excel

olivier857
|
Bonjour, Je cherche quel est la meilleure solution pour effectuer une comparaison entre les données d'une colonne précise dans 2 fichiers distinct. Je m'explique : - J'ai un fichier 1 possédant une colonne A et une colonne B - J'ai un fichier 2 possédant une colonne Y et une colonne Z - Les données des colonnes A et Y sont des données de format texte de même type mais rangées de façon aléatoire dans les 2 fichiers. Ce sont ces données que je veux comparer entre elle. - Les données de la colonne Z sont les valeurs finales que je souhaite récupérer lorsque A = Y - La colonne B est vide et est réserver à stocker les données de la colonne Z lorsque A = Y je cherche donc à vérifier si les données de chaque cellule de la colonne A sont présentes dans l'une des cellules de la colonne Y. Si oui à chaque données A trouvée en Y je récupère la valeur Z (même ligne que Y) et la stocke en colonne B (même ligne que A) Je précise qu'il faut bien chercher la valeur A1 dans les cellules Y1 à Yz, la valeur A2 dans Y1 à Yz .... Je précise également que je cherche à écrire ça en VBA et ne veux pas utiliser de recherchev. Merci d'avance pour votre aide. Olivier
|
|
jeudi 10 avril 2008 à 00:14:47 |
Re : Comparaison de données sous Excel

bigfish_le vrai
|
Salut,
ton explication est claire mais ce qui est claire aussi, c'est que tu nous demande de faire ton boulot lá ! J'ai regardé tes precedent postes et je constate que tu n'es pas un novice en VBA donc montre nous ce que tu as fait et ou tu rencontre un probleme.
A+
|
|
jeudi 10 avril 2008 à 00:29:23 |
Re : Comparaison de données sous Excel

olivier857
|
Ok alors si je précise un peu, c'est sur la méthode que je veux mon premier conseil, on verra ensuite le code si nécessaire.
Faut t'il lire toutes les données de la colonne A les mettre dans un tableau 2 dim (deuxième colonne vide pour B) et lire les données des colonnes Y et Z pour les stocker dans un tableau 2 dim. Puis comparer les données des tableau et passser les Y en B.
Ou bien faut'il faire des boucles du style cells(i, A) en incrémentant i et comparer à cells(j,B) en faisant une sous incrémentation sur j ?
Quelle méthode utiliser ?
|
|
jeudi 10 avril 2008 à 09:01:09 |
Re : Comparaison de données sous Excel

faucheuse
|
Moi j'utiliserais une double boucle du style :
Pour i allant de 0 à 35 faire
{
Pour j allant de 0 a 35 faire
{
A = Valeur de A&i
Y = Valeur de Y&j
Si (A=Y) faire : (la j'ai pas trop compris ce que tu veux faire avec Z)
j++
}
i++
}
|
|
jeudi 10 avril 2008 à 11:54:32 |
Re : Comparaison de données sous Excel

olivier857
|
Voici ce que j'ai écrit de mon côté : [code]Sub documenter_fichier_propagation() Dim fichier_librairie As String Dim ch_class As Variant Dim ch_fichier_propagation() As String Dim fichier_propagation As String Dim A, B, X, Y As String Dim lg, i, j As Integer fichier_librairie = ActiveWorkbook.Name ch_class = Application.GetOpenFilename("Fichiers Microsoft Excel, *.xls", , "Choisir le fichier de propagation", , False) If ch_class = "" Or ch_class = False Then Exit Sub ch_fichier_propagation() = Split(ch_class, "\") lg = UBound(ch_fichier_propagation) fichier_propagation = ch_fichier_propagation(lg) Workbooks.Open fichier_propagation i = 2 While Workbooks(fichier_propagation).Worksheets("CECILIA x VIR").Cells(i, 6) <> "" A = Workbooks(fichier_propagation).Worksheets("CECILIA x VIR").Cells(i, 6) j = 1 While Workbooks(fichier_librairie).Worksheets("propagation").Range("mode_degrade").Offset(j, 0) <> "" X = Workbooks(fichier_librairie).Worksheets("propagation").Range("mode_degrade").Offset(j, 0) Y = Workbooks(fichier_librairie).Worksheets("propagation").Range("fail_safe_mode").Offset(j, 0) If A = X Then B = Y Workbooks(fichier_propagation).Worksheets("CECILIA x VIR").Cells(i, 7) = B GoTo suite End If j = j + 1 Wend suite: i = i + 1 Wend
End Sub[/code]
Mon fichier fichier_librairie correspond au fichier AB. Mon fichier fichier_propagation correspond au fichier XY.
Le code avant les boucles permet d'ouvrir un exploreur pour aller chercher le fichier_propagation (XY) et l'ouvrir.
Mes tableaux font chacun environ 5000 lignes.
La macro est très longue, elle prend environ 4 minutes avant de retourner le résultat.
Qu'en pensez vous ?
|
|
jeudi 10 avril 2008 à 13:58:23 |
Re : Comparaison de données sous Excel

Molenn
|
Puisque tu ne veux pas utiliser de rechercheV (ce qui est bien dommage, 2 formules et c'était terminé ^^), juste une piste : tu peux, en code, utiliser la méthode .Find
Avec l'enregistreur de macro, tu auras la syntaxe exacte. Tu remontes le .address, .row ou .column en fonction de tes besoins, de la cellule trouvée avec le .find et le tour est joué.
A toi d'adapter
Molenn
|
|
jeudi 10 avril 2008 à 17:33:57 |
Re : Comparaison de données sous Excel

olivier857
|
Merci du conseil j'ai justement commencer à travailler sur cette piste.Je pense même avoir quasiment terminer mais j'ai une erreur que je n'arive pas à résoudre.
voici mon code :
[cpp]Sub documenter_fich_prop() Dim fich_lib AsString, fich_prop AsString, ch_class AsString Dim WS1 As Worksheet, WS2 As Worksheet Dim lg AsInteger, position AsInteger, nb_ligne_lib AsInteger, nb_ligne_propa AsInteger Dim i AsInteger Dim first_carac AsString, firsr_mode AsString Application.ScreenUpdating = False 'Récupère le nom du classeur librairie fich_lib = ActiveWorkbook.Name 'Ouvre un explorateur pour choisir le fichier propagation, l'ouvrir et récupérer son nom ch_class = Application.GetOpenFilename("Fichiers Microsoft Excel, *.xls", , "Choisir le fichier de propagation", , False) If ch_class = "Faux"ThenExitSub Workbooks.Open Filename:=ch_class fich_prop = ActiveWorkbook.Name 'Déclare les 2 classeur en objet Set WS1 = Workbooks(fich_lib).Sheets("propagation") Set WS2 = Workbooks(fich_prop).Sheets("CECILIA x VIR") 'Ajoute les colonnes "1er mode", "Fail safe mode (avec none)",²"Fail Safe mode (sans none)" vierges WS2.Columns("G:G").Insert Shift:=xlToRight WS2.Columns("G:G").Insert Shift:=xlToRight WS2.Columns("G:G").Insert Shift:=xlToRight WS2.Cells(1, 7) = "1er mode" WS2.Cells(1, 8) = "Fail Safe Mode (avec none)" WS2.Cells(1, 9) = "Fail Safe Mode (sans none)" 'Compte le nombre de ligne présente en librairie et dans le fichier de propagation nb_ligne_lib = 1 nb_ligne_propa = 1 While WS2.Cells(nb_ligne_propa, 6) <> "" nb_ligne_propa = nb_ligne_propa + 1 Wend nb_ligne_propa = nb_ligne_propa - 1 While WS1.Range("mode_degrade").Offset(nb_ligne_lib, 0) <> "" nb_ligne_lib = nb_ligne_lib + 1 Wend 'Supprime le caractère "|" quant il existe en début de celulle mode For i = 2To nb_ligne_propa Step1 first_carac = Left(WS2.Cells(i, 6), 1) lg = Len(WS2.Cells(i, 6)) If first_carac = "|"Then WS2.Cells(i, 6) = _ Right(WS2.Cells(i, 6), lg - 1) EndIf Next i 'Récupère le 1er mode de chaque cellule et le copie dans la nouvelle colonne "1er mode" For i = 2To nb_ligne_propa Step1 position = InStr(2, WS2.Cells(i, 6), ">") If position = 0Then WS2.Cells(i, 7) = WS2.Cells(i, 6) ElseIf position <> 0Then first_mode = Left(WS2.Cells(i, 6), position - 3) WS2.Cells(i, 7) = first_mode EndIf Next i 'Récupère les fail safe mode avec et sans none de la librairie For i = 2ToFor i = 2To nb_ligne_ Set C = WS1.Columns(Range("mode_degrade").Column).Find(what:=WS2.Cells(i, 7), lookat:=xlWhole) IfNot C IsNothingThen WS1.Cells(i, 8) = WS2.Cells(C.Row, Range("fail_safe_mode_none").Column) WS1.Cells(i, 9) = WS2.Cells(C.Row, Range("fail_safe_mode").Column) EndIf Next Application.ScreenUpdating = True EndSub[/cpp]
Mon erreur se situe à la ligne : [cpp] Set C = WS1.Columns(Range("mode_degrade").Column).Find(what:=WS2.Cells(i, 7), lookat:=xlWhole) [/cpp]
Je ne comprend ce qui plante.
|
|
jeudi 10 avril 2008 à 17:35:43 |
Re : Comparaison de données sous Excel

olivier857
|
j'ai oublié d'ajouter dans mon message précédent que j'ai déclaré C de cette manière :
Dim c as range
Mais l'erreur est tjs la même.
|
|
jeudi 10 avril 2008 à 18:32:24 |
Re : Comparaison de données sous Excel

bigfish_le vrai
|
Salut,
2 conseils :
1/ une fonction find qui ne trouve rien plante le code donc prend l'habitude de gerer ce cas. Par exemple comme suit :
For i = 2 To nb_ligne_ <--- il manque quelque chose ici ! On Local Error Resume Next Set C = WS1.Columns(Range("mode_degrade").Column).Find(what:=WS2.Cells(i, 7), lookat:=xlWhole) If Err = 0 Then 'si pas d'erreure WS1.Cells(i, 8) = WS2.Cells(C.Row, Range("fail_safe_mode_none").Column) WS1.Cells(i, 9) = WS2.Cells(C.Row, Range("fail_safe_mode").Column) EndIf Next
2/ pour simplifier le code declare C en long:
For i = 2 To nb_ligne_ <--- il manque toujours quelque chose ici ! On Local Error Resume Next C = WS1.Columns(Range("mode_degrade").Column).Find(what:=WS2.Cells(i, 7), lookat:=xlWhole).Row IfErr = 0 Then 'si pas d'erreure WS1.Cells(i, 8) = WS2.Cells(C, Range("fail_safe_mode_none").Column).Value WS1.Cells(i, 9) = WS2.Cells(C, Range("fail_safe_mode").Column).Value EndIf Next
J'ai pas beaucoup de temps ce matin mais je te donne mon opinion sur le reste des que possible.
A+
|
|
jeudi 10 avril 2008 à 18:36:58 |
Re : Comparaison de données sous Excel

bigfish_le vrai
|
... dans le 2ieme conseil j'ai oublié quelque chose : For i = 2 To nb_ligne_ <--- il manque toujours quelque chose ici ! On Local Error Resume Next C = WS1. Columns(Range ("mode_degrade"). Column). Find(what:=WS2. Cells(i, 7), lookat:=xlWhole ).Row If Err = 0 Then 'si pas d'erreure WS1. Cells(i, 8).Value = WS2. Cells(C, Range ("fail_safe_mode_none"). Column).Value WS1. Cells(i, 9).Value = WS2. Cells(C, Range ("fail_safe_mode"). Column).Value EndIf Next
Vala
A+
|
|
Cette discussion est classée dans : cherche, données, colonne, comparaison, précise
Répondre à ce message
Sujets en rapport avec ce message
liste de données [ par LeCED ]
j'aimerai pouvoir faire apparaitre des données dans une liste mais malheuresement je n'arrive pas a reproduire en VB ce que je reussis en ACCESS.Le pr
recoupement de données sur deux feuilles [ par okin ]
Bonjour, je voudrais vous soumettre mon pb?Voila, je dispose de deux feuilles, dans chacune d'elles j'ai en colonne A un grand nombre de valeurs qui d
DATA SMOOTHING; lissage de données! [ par thierrypp ]
Bonjour,je dispose d'une colonne de données en format *.txt; 1er rang caractère " mesures"autres rangs, valeurs numériques nombre total de rangs unic
comment rendre une colonne contenant des données invisible dans une grid [ par Angelus ]
salutla question est dans le topic ;) je voudrais que l'user ne voit pas une de mes colonnes qui contient des info nécéssaire à des requêtes.J'ai tro
Ligne,colonne [ par jmf1 ]
Besoin d'aide:Dans un fichier texte, comment retranscrire des données en ligne, en colonne?Ex:Données en ligne (origine du fichier)-79 -79 -80 etc.
Cherche à remplir une base de données ayant comme source un fichier txt [ par sebus ]
Je cherche à remplir une base de données à partir d'un fichier txt ou les différents champs dans ce fichier txt sont séparés par des points virgules.M
Edition d'état crystal par VB [ par ricopetitdejeuner ]
j'ai deux souci lors de mes editions d'etatsJ' ai crée un controle qui est prend un etat crystalreport cette etat appel une base de données acces1°) l
Comparaison de données [ par Gendarmette ]
Je dois comparer 2 fichiers de même nom, le deuxième étant une modification du premier et ne conserver que le deuxième. Comment faire? Merci pour votr
Comparaison de données [ par Gendarmette ]
J'ai inséré 2 bases de données dans VB. Un même fichier peut se trouver dans les 2 bd, l'un étant en fait une modification de l'autre. Je souhaite tro
base de données dans des colonnes [ par cyberlulu ]
salut !Je voudrais savoir comment on peut faire pour avoir sur la form, un tableau où chaque colonne correspond à un champ d'une base de données. Par
Livres en rapport
|
Derniers Blogs
SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|