Comparaison de données sous Excel

Signaler
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
10 avril 2008
-
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
10 avril 2008
-
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

10 réponses

Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
10
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+
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
10 avril 2008

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 ?
Messages postés
308
Date d'inscription
jeudi 10 janvier 2008
Statut
Membre
Dernière intervention
27 octobre 2011

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++
}
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
10 avril 2008

Voici ce que j'ai écrit de mon côté :
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


<!-- END TEMPLATE: bbcode_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 ?<!-- / message -->
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
7
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
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
10 avril 2008

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.
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
10 avril 2008

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.
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
10
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+
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
10
...

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+
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
10 avril 2008

Merci de ton aide je vais regarder ca de suite