Comparaison de bdd sous Excel

Comparaison de bdd sous Excel - VB/VBA/VBS - Programmation

Marsh Posté le 25-04-2016 à 10:34:45    

Bonjour,
 
Pour commencer je vais me présenter rapidement.
Je m'appelle Olivier, je suis informaticien junior et j'ai été recruté récemment pour une mission dans un groupe très connu de la grande distribution.
 
Pour présenter rapidement le contexte :
Mon travail consiste a analyser les différents référentiels utilisateurs afin d'étudier les anomalies des bases de données et d'en améliorer la qualité. ( compte mal renseigner / doublons ... )
Pour traiter cette demande, vu mon manque de connaissance/d'accès aux bases de données de l'entreprise, il a été décidé que je travaillerais a l'aide d'Excel (export bdd au format CSV).
Dans le cas des doublons, ce qui va nous intéresser dans ce poste, j'ai donc mit en place un fichier excel avec une concaténation de trois critères (Login/Matricule/date de naissance) par utilisateur au sein d'une même cellule, et ce pour les deux référentiels.
Ensuite j'applique une macro trouvé sur internet ( je ne pratique pas le VBA) qui permet de comparer la première colonne du premier onglet avec la première colonne du second onglet, et d'y appliquer une mise en forme qui me permet ensuite de filtrer, et de ressortir les différences d'une base de donnée a une autre.
 
Le problème rencontré est le suivant, lorsque je doit comparer les deux référentiels de base, contenant plus de 200 000 lignes chacun, la macro fait planter excel, celui ci se retrouve en mode " ne répond pas "
Sur des plus petits fichiers au bout d'une 30aines de minutes le logiciel revient a la normal et la demande est traitées, mais pour les plus gros, même après 24h de traitement sur mon PC personnel ( nettement plus puissant que ceux du boulot ) Excel ne répond toujours pas.
 
Voici la macro en question :
 
Code: Tout sélectionner
    Sub Compare()
    Dim Lig1 As Long, Derlig1 As Long, Derlig2 As Long, Cp As Variant
    Dim Lig2 As Long
        Derlig1 = Sheets("Feuil1" ).Range("A265535" ).End(xlUp).Row
        Derlig2 = Sheets("feuil2" ).Range("A265535" ).End(xlUp).Row
        With Sheets("Feuil2" )
            For Lig1 = 2 To Derlig1
                Cp = Sheets("feuil1" ).Cells(Lig1, "A" )
                For Lig2 = 2 To Derlig2
                    If Cp = .Cells(Lig2, "A" ) Then
                        .Cells(Lig2, "A" ).Interior.ColorIndex = 9 'couleur valeurs similaires
                   End If
                Next Lig2
            Next Lig1
        End With
    End Sub
 
 
 
Je m'en remet donc a vous afin d'obtenir de l'aide sur une amélioration potentiel de la macro afin de la rendre plus légère, ou qu'elle travail différemment pour améliorer la durée de traitement ( ou au moins pouvoir traiter le fichiers sans plantage même si c'est long )
 
Si vous avez d'autre piste, plutôt qu'une macro Excel, pour le traitement de ce genre d'informations je suis également preneur de toutes informations pertinente.
 
Merci de votre aide
 
Pavé César !
 
Cordialement

Reply

Marsh Posté le 25-04-2016 à 10:34:45   

Reply

Marsh Posté le 25-04-2016 à 12:06:49    

Bonjour,
 
le script trouvé à l'air de faire tout le boulot, alors qu'excel dispose de fonction prévu pour
mise en forme conditionelle, formule match, isna, ...
 
après si tu cherche à travailler efficacement, laisse les donnée en csv et bosse avec des vrai programme maison en  python, c, perl... qui te résoudrons ton pb en quelque minute.

Reply

Marsh Posté le 25-04-2016 à 14:13:05    

Merci pour ta réponse.
 
Le problème est que je n'ai pas les connaissances pour créer / trouver ce genre de programme maison.
 
D'autre part les fonctions intégré a excel pour la mise en forme automatique en fonction de certain critère de comparaison sont trop lourdes pour un fichiers de plus de 200 000 lignes, et plantes tout le système.
 
Par contre j'ai trouvé de l'aide sur un autre forum dédié a Excel ou l'on ma proposé une macro qui est plus optimisé a mon besoin, et qui permet un traitement nettement plus rapide. (il faut par contre effectuer un trie sur les données avant traitement )
 
Je vous colle la macro ici au cas ou cela interesse quelqu'un =)
 

Code :
  1. Sub Compare()
  2.         Dim c1 As Long, Derlig1 As Long, Derlig2 As Long, Cp As Variant
  3.         Dim c2 As Long,fin1,fin2,k1,k2
  4.         Set ws1 = Sheets("feuil1" )
  5.         Set ws2 = Sheets("feuil2" )
  6.         Application.ScreenUpdating = False
  7.         Derlig1 = ws1.Range("A265535" ).End(xlUp).Row
  8.         Derlig2 = ws2.Range("A265535" ).End(xlUp).Row
  9.         ws1.Range("A1:A" & Derlig1).Sort key1:=ws1.Range("A1" ), order1:=xlAscending, Header:=xlYes
  10.         ws2.Range("A1:A" & Derlig2).Sort key1:=ws2.Range("A1" ), order1:=xlAscending, Header:=xlYes
  11.      
  12.         c1 = 2
  13.         c2 = 2
  14.         While Not (fin1 Or fin2)
  15.             k1 = ws1.Cells(c1, 1)
  16.             k2 = ws2.Cells(c2, 1)
  17.             If k1 = k2 Then
  18.                 ws1.Cells(c1, "A" ).Interior.ColorIndex = 9    'couleur valeurs similaires
  19.                ws2.Cells(c2, "A" ).Interior.ColorIndex = 9    'couleur valeurs similaires
  20.                c1 = c1 + 1: c2 = c2 + 1
  21.             ElseIf k1 < k2 Then
  22.                 c1 = c1 + 1
  23.                 If c1 > Derlig1 Then fin1 = True
  24.             Else
  25.                 c2 = c2 + 1
  26.                 If c2 > Derlig2 Then fin2 = True
  27.             End If
  28.         Wend
  29.         Application.ScreenUpdating = True
  30.     End Sub


 

Reply

Marsh Posté le 02-05-2016 à 20:55:39    

LeReclus a écrit : a écrit :

 
je suis informaticien junior  
vu mon manque de connaissance/d'accès aux bases de données
macro trouvé sur internet ( je ne pratique pas le VBA)
plus de 200 000 lignes chacun, la macro fait planter excel,
Si vous avez d'autre piste, plutôt qu'une macro Excel,




 
 
Bonjour,
Vu les infos ci-dessus, pourquoi ne pas en profiter pour apprendre quelques notions de SQL et résoudre ces problèmes en quelques requêtes ? C'est infiniment plus pertinent à connaitre pour un développeur que VBA, et trouver des doublons sur 200 000 lignes, ça se fait très rapidement..

Message cité 1 fois
Message édité par lfs le 02-05-2016 à 20:57:32
Reply

Marsh Posté le 06-05-2016 à 18:09:41    

Ce sujet a été déplacé de la catégorie Systèmes & Réseaux Pro vers la categorie Programmation par Je@nb

Reply

Marsh Posté le 08-05-2016 à 10:37:36    

lfs a écrit :


 
 
Bonjour,
Vu les infos ci-dessus, pourquoi ne pas en profiter pour apprendre quelques notions de SQL et résoudre ces problèmes en quelques requêtes ? C'est infiniment plus pertinent à connaitre pour un développeur que VBA, et trouver des doublons sur 200 000 lignes, ça se fait très rapidement..


+1 pour une solution basée sur une autre architecture.
 
Tu pourrais déjà commencer par t'installer Mysql (ou Postgres) en local sur le PC sur lequel il bosse. Si t'as pas les droits admin, il existe des versions portables. Tous les traitements ne pourront se faire avec du SQL pure. Un autre langage te sera nécessaire : PHP, Python, Perl...
Si tu choisis PHP, tu pourras t'installer un environnement complet WAMP (Apache, Mysql, PHP). Il existe aussi des WampServer en version portable ;)
 
Désolé de te le dire, mais un programmeur, même junior, qui ne sait faire que du VBA, c'est pas un programmeur :/ Excel n'est clairement pas adapté pour ce type de tâche. Un SGBD + un langage de dév sera une bien meilleure solution technique et surtout, plus maintenable dans le temps :o Pour une entreprise, ce critère est également important.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 09-05-2016 à 09:49:57    

 
            Bonjour,
 
            VBA étant un langage interprété, forcément c'est plus long qu'un SGBD ou une requête SQL (a way to go !) …
 
            « Ne réponds pas » ne veut pas dire qu'Excel est planté mais juste accaparé par un code en cours d'exécution !
 
            Le code du post initial est le cas d'école de ce qui ne faut pas faire ou ne pas oublier en VBA ‼
            Voir ce post pour le B-A-BA à ne pas oublier en VBA pour un processus long surtout dans le cas de boucles …
 
            La première question à se poser avant d'écrire la moindre ligne de code VBA est
            « qu'est-ce qui pourrait déjà être réalisé manuellement via Excel ? »
            Car quasiment tout ce que l'on fait manuellement dans Excel peut-être automatisé en VBA,
            l'Enregistreur de macros fournissant sur un plateau une base de code (à nettoyer) aidant l'apprenti codeur à découvrir le VBA …
            Et les fonctions internes à Excel étant déjà compilées peuvent s'avérer parfois plus rapides qu'un code "bouclant" !
            (filtres, filtres avancés)  
 
            Ici vu le volume à traiter et le besoin, variables tableau et l'objet Dictionary (documenté dans l'aide VBA et sur MSDN) réduiraient
            énormément le temps de calcul …
 
            Exemple de variable tableau dans le sujet Copier une colonne sous conditions d'une autre colonne
 
            ________________________________________________________________________________________________________
            Copier / Coller n'est pas coder !

 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed