IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Créer une macro plus rapide


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Créer une macro plus rapide
    Bjr,

    J'ai créé une macro VBA qui me permet de faire correspondre 2 fichiers Excel.

    En gros, la macro va voir les valeurs de 2 colonnes dans le premier fichier et elle doit ensuite aller voir si elle retrouve ces deux mêmes valeurs dans les 2 colonnes correspondantes de l'autre fichier.

    Le problème est que ces fichiers sont très lourds (15000 lignes pour le premier, 59000 pour l'autre!!), et la macro que j'ai faite vérifie à chaque fois chaque ligne... Du coup, l'exécution est trèèèèèèèèès longue...

    Voici mon code (désolé pour la mise en forme, je sais que c'est pas génial...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Sub merge()
    Dim cpt1, cpt2 As Double
     
    Application.ScreenUpdating = False
     
    Windows("Etude Garanties 1.xls").Activate
    Sheets("REM").Select
    cpt1 = Range("G65536").End(xlUp).Row
     
    Windows("RIC 5 ANS au 12062008.xls").Activate
     
    Sheets("RIC").Select
    cpt2 = Range("E65536").End(xlUp).Row
    Windows("Etude Garanties 1.xls").Activate
     
    For n = 5 To cpt1
        For k = 5 To cpt2
        If (Workbooks("Etude Garanties 1.xls").Sheets("REM").Range("G" & n).Value = Workbooks("RIC 5 ANS au 12062008.xls").Sheets("RIC").Range("E" & k).Value) And (Workbooks("Etude Garanties 1.xls").Sheets("REM").Range("H" & n).Value = Workbooks("RIC 5 ANS au 12062008.xls").Sheets("RIC").Range("F" & k).Value) Then
     
        Workbooks("Etude Garanties 1.xls").Sheets("REM").Range("BA" & n).Value = Workbooks("RIC 5 ANS au 12062008.xls").Sheets("RIC").Range("A" & k).Value
        Workbooks("Etude Garanties 1.xls").Sheets("REM").Range("BB" & n).Value = Workbooks("RIC 5 ANS au 12062008.xls").Sheets("RIC").Range("B" & k).Value
        Workbooks("Etude Garanties 1.xls").Sheets("REM").Range("BC" & n).Value = Workbooks("RIC 5 ANS au 12062008.xls").Sheets("RIC").Range("C" & k).Value
     
        End If
        Next
    Next
     
    Application.ScreenUpdating = True
     
    End Sub
    Est-ce qu'il existe une autre solution qui me permettrait une exécution plus rapide, parce que à ce rythme, j'en ai pour des heures, voire des jours...

    Merci

    SG

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 57
    Points
    57
    Par défaut
    Bonsoir,

    Est-ce qu'il existe une autre solution qui me permettrait une exécution plus rapide
    Oui!

    en utilisant la méthode Find associée à Find next qui va te permettre un gain de temps appréciable si j'ai bien compris ta problématique; c'est à dire trouver la correspondance d'un couple de données de la même ligne sur 2 feuilles différentes. Tu fais une boucle sur tes données de ta feuille source de 5 à cpt1 puis tu appliques la méthode find pour trouver la correspondance de l'élément de ta 1ère colonne dans la 1ère colonne de la feuille destination. si OK tu compares les éléments de la seconde colonne sinon find next...

    Cordialement

    Re,

    Après le texte, le code :
    Un exemple à adapter à la configuration de tes données (il peut être judicieux d'appliquer la méthode find différemment) et à tes fichiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Sub merge()
    Dim c as range
    Dim cpt1, cpt2 As Double
    Dim n As Long
     
    Application.ScreenUpdating = False
     
    cpt1 = Sheets(1).Range("G65536").End(xlUp).Row
    cpt2 = Sheets(2).Range("E65536").End(xlUp).Row
     
    For n = 5 To cpt1
        With Sheets(2).Range("E4:E" & cpt2 & "")
            Set c = .Find(Sheets(1).Cells(n, "G").Value, LookIn:=xlValues, lookat:=xlWhole)
            If Not c Is Nothing Then
                firstAddress = c.Address
                Do
                    If Sheets(1).Range("H" & n).Value = c.Offset(0, 1).Value Then
                        Sheets(1).Range("BA" & n).Value = c.Offset(0, -4).Value
                        Sheets(1).Range("BB" & n).Value = c.Offset(0, -3).Value
                        Sheets(1).Range("BC" & n).Value = c.Offset(0, -2).Value
                    End If
                    Set c = .FindNext(c)
                Loop While Not c Is Nothing And c.Address <> firstAddress
            End If
        End With
    Next
     
    Application.ScreenUpdating = True
    End Sub
    Cordialement

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ok merci spitnolan,

    Par contre, que signifie c.offset, et quelles sont les valeurs à donner?

    Merci

    SG

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 57
    Points
    57
    Par défaut
    Re,
    d'après l'aide VBA :
    Cette propriété renvoie un objet Range qui représente une plage décalée de la plage spécifiée. En lecture seule.

    expression.Offset(RowOffset, ColumnOffset)
    expression Obligatoire. Expression qui renvoie un objet Range.

    RowOffset Argument de type Variant facultatif. Nombre de lignes (valeur positive, négative ou égale à 0 (zéro)) de décalage à appliquer à la plage. Les valeurs positives correspondent à un décalage vers le bas et les valeurs négatives à un décalage vers le haut. La valeur par défaut est 0.

    ColumnOffset Argument de type Variant facultatif. Nombre de colonnes (valeur positive, négative ou égale à 0 (zéro)) de décalage à appliquer à la plage. Les valeurs positives correspondent à un décalage vers la droite et les valeurs négatives à un décalage vers la gauche. La valeur par défaut est 0.
    c désignant la cellule trouvée par Find Donc pour c=A1, c.offset(0,1) renvoie B1

    Cordialement

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    D'accord, merci,

    Après vérification, le code marche parfaitement et s'exécute en moins de dix minutes (au lieu de plus de 15h pour le mien ), donc encore merci spit.

    Cordialement

    SG

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 57
    Points
    57
    Par défaut
    Re,
    Juste une petite correctionsuffit...
    Cordialement

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Petite précision.
    Pour que les 2 variables soient déclarées comme Long, il faut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim cpt1 As Long, cpt2 As Long

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 57
    Points
    57
    Par défaut
    Re,

    Oups!! totalement raison AlainTech...
    Merci d'avoir rectifié ma bévue.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer une macro sur Winedt
    Par Angerbode dans le forum Programmation (La)TeX avancée
    Réponses: 0
    Dernier message: 20/12/2007, 14h39
  2. Réponses: 5
    Dernier message: 23/10/2007, 14h56
  3. Créer une macro archivage
    Par Anaelody dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/07/2007, 16h14
  4. Réponses: 8
    Dernier message: 09/01/2007, 16h30
  5. Réponses: 2
    Dernier message: 12/12/2006, 22h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo