begin process at 2012 02 12 10:51:19
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Visual Basic 6

 > 

Langages dérivés

 > 

VBA

 > 

Comparaison de données sous Excel


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Comparaison de données sous Excel

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

olivier857

Membre Club
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

Membre Club
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

Membre Club
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

Membre Club

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

Membre Club
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

Membre Club
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

Membre Club
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

Membre Club
...

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+

1 2

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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,652 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales