Comparaison de données sous Excel

olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008 - 10 avril 2008 à 00:03
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008 - 10 avril 2008 à 19:18
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

bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 14
10 avril 2008 à 00:14
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+
0
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008
10 avril 2008 à 00:29
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 ?
0
cs_faucheuse Messages postés 308 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 27 octobre 2011
10 avril 2008 à 09:01
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++
}
0
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008
10 avril 2008 à 11:54
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 -->
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
10 avril 2008 à 13:58
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
0
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008
10 avril 2008 à 17:33
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.
0
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008
10 avril 2008 à 17:35
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.
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 14
10 avril 2008 à 18:32
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+
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 14
10 avril 2008 à 18:36
...

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+
0
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008
10 avril 2008 à 19:18
Merci de ton aide je vais regarder ca de suite
0
Rejoignez-nous