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 :

Comparaison de colonnes dans plusieurs onglets


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Comparaison de colonnes dans plusieurs onglets
    bonjour,
    j'ai 6 onglets dont un onglet "sauvegarde".
    les 5 autres onglet sont mis à jour régulierement, ce qui cree des decalages de lignes. les infos saisies ne sont donc plus bonnes.
    J'ai donc decider de consolider tout mes onglets dans un onglet "sauvegarde".
    j'ai donc cree une macro qui compare le numero de client dans l'onglet mis à jour à celui de l'onglet "sauvegarde". Si les numeros clients correspondent, la macro me recopie les données correspondant au client à partir de l'onglet sauvegarde,
    Mon probleme est le suivant, la macro que j'ai réalisé ne compare qu'un onglet à l'onglet "sauvegarde". il me faut encore comparer les 4 autres à l'onglet sauvegarde.
    Malheureusement je suis débutant et je ne sais pas comment faire. Pouvez vous m'aider svp
    voici la macro que j'ai ecris :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    Sub COMPAR()
    Application.ScreenUpdating = False
    'declaration des variables'
    Dim VALEURA As String, i As Integer, x As Integer, valeurB As String
     
     
    'i correspondra au numeros de ligne dans la feuille 1'
    i = 3
     
    'continuer tant que i n'est pas egal à 5000'
    Do While i <> "50"
     
    'donner une valeur de départ à VALEURA, valeura=le contenue de A2'
    VALEURA = range("c" & i).Value
     
    'activer la feuille 2'
    Sheets("sauvegarde").Select
     
    'x correspond au numeros de ligne dans la feuille 2'
    x = 3
     
    'donner une valeur de depart a valeurb'
    valeurB = range("c" & x).Value
     
    'comparer valeura et valeurb, tant que faux incrementer x de 1'
     
    Do While VALEURA <> valeurB
    x = x + 1
    If x = 50 Then GoTo l49
    valeurB = range("c" & x).Value
    Loop
     
     
    'si la cellule Lx = quelque chose alors on copy la ligne'
    If VALEURA = valeurB Then
    range("j" & x).Select
    Selection.Copy
    Sheets("p11").Select
    range("J" & i).Select
    ActiveSheet.Paste
     
    Sheets("sauvegarde").Select
    range("k" & x).Select
    Selection.Copy
    Sheets("p11").Select
    range("k" & i).Select
    ActiveSheet.Paste
     
    Sheets("sauvegarde").Select
    range("l" & x).Select
    Selection.Copy
    Sheets("p11").Select
    range("l" & i).Select
    ActiveSheet.Paste
     
    Sheets("sauvegarde").Select
    range("m" & x).Select
    Selection.Copy
    Sheets("p11").Select
    range("M" & i).Select
    ActiveSheet.Paste
     
     
    Sheets("sauvegarde").Select
    range("n" & x).Select
    Selection.Copy
    Sheets("p11").Select
    range("n" & i).Select
    ActiveSheet.Paste
     
    Sheets("sauvegarde").Select
    range("o" & x).Select
    Selection.Copy
    Sheets("p11").Select
    range("o" & i).Select
    ActiveSheet.Paste
     
    Sheets("sauvegarde").Select
    range("p" & x).Select
    Selection.Copy
    Sheets("p11").Select
    range("p" & i).Select
    ActiveSheet.Paste
     
    Sheets("sauvegarde").Select
    range("q" & x).Select
    Selection.Copy
    Sheets("p11").Select
    range("q" & i).Select
    ActiveSheet.Paste
     
    Sheets("sauvegarde").Select
    range("r" & x).Select
    Selection.Copy
    Sheets("p11").Select
    range("r" & i).Select
    ActiveSheet.Paste
     
    Sheets("sauvegarde").Select
    range("s" & x).Select
    Selection.Copy
    Sheets("p11").Select
    range("s" & i).Select
    ActiveSheet.Paste
     
    End If
     
    'on incremente i de 1'
    l49:
    i = i + 1
     
    'on continue les fonction d'avant jusqu'a ce que i=5000'
    Loop
     
    End Sub

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 92
    Points : 58
    Points
    58
    Par défaut
    Ton code me parait bien complexe.

    Tout d'abord, pour copier une cellule dans une autre il suffit d'une ligne de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(i, j) = Worksheets("Onglet_01").Cells(x, y)
    Ensuite, comme indiqué au-dessus, il est facile de se déplacer d'onglet à onglet, en rejoutant juste la commande Worksheets(). devant la commande Cells() Il suffit d'indiquer le nom de l'onglet entre les parenthèses, et tout en restant sur l'onglet actif (Sauvegarde dans ton cas), le logiciel va chercher les éléments dans l'autre onglet.

    Par ailleurs, je pense qu'il est préférable d'utiliser la fonction For au lieu de While, le résultat et le même, mais For est plus propre à utiliser.

    Phil.

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    bonjour,
    merci pour ta réponse.
    Tu veux donc dire que je peux resumer ce bloc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sheets("sauvegarde").Select
    range("k" & x).Select
    Selection.Copy
    Sheets("p11").Select
    range("k" & i).Select
    ActiveSheet.Paste
    en ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("sauvegarde").Cells(k, x) = Worksheets("p11").Cells(k,i)
    ??

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 92
    Points : 58
    Points
    58
    Par défaut
    Tout à fait, mais même encore plus simple, si ton onglet "Sauvegarde" est l'onglet actif, tu n'as même pas besoin de le préciser dans ton code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("sauvegarde").Cells(k, x) = Worksheets("p11").Cells(k,i)
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(k, x) = Worksheets("p11").Cells(k,i)
    Ensuite, tu crées les lignes nécessaire à la comparaison de chaque onglet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Cells(k, x) = Worksheets("p11").Cells(k,i)
    Cells(k, x) = Worksheets("p12").Cells(k,i)
    Cells(k, x) = Worksheets("p13").Cells(k,i)
    Phil....

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    ca ne marche pas...je pense qu'il y a un probleme dans la declaration de variable.

  6. #6
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Regarde ce que tu écris (ou plutôt regardez ce que vous écrivez)
    range("k" & x) dans le code initial devient Cells(k, x) et la même chose pour range("k" & i) --> Cells(k, i).

    Vous trouvez que range("k" & x) est la même chose que Cells(k, x) ?
    Pour obtenir le même résultat avec Cells, il faudrait écrire Cells(x, 11)

    Ceci n'est pas correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("sauvegarde").Cells(k, x) = Worksheets("p11").Cells(k,i)
    D'autant plus qu'initialement tu copies de la feuille "sauvegarde" vers la feuille "p11", ceci devrait mieux fonctionner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("p11").Range("K" & i) = Sheets("sauvegarde").Range("K" & x)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 92
    Points : 58
    Points
    58
    Par défaut
    Toutes mes confuses. Le code suivant est plus exact :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("sauvegarde").Cells(i, j) = Worksheets("p11").Cells(x, y)
    Et il me semble bien que c'est l'onglet Sauvegarde qui doit recevoir une valeur, et non l'inverse.

    Quant à la déclaration des variables, il faut bien penser à les définir à l'avance. Mais ce code marche parfaitement avec les bonnes variables. (Bien entendu, si les lignes (ou les colonnes) sont les mêmes d'un onglet à l'autre, il est inutile de définir 2 variables différentes i et x (ou j et y), i (ou j) suffiront)

    Phil....

  8. #8
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Citation Envoyé par TaleMaker Voir le message
    Toutes mes confuses. Le code suivant est plus exact :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("sauvegarde").Cells(i, j) = Worksheets("p11").Cells(x, y)
    Non cela ne fonctionnera pas ! Tel que tu l'écris, i, j, x et y sont 4 variables. Où sont initialisées tes variables j et y ?

    Citation Envoyé par TaleMaker Voir le message
    Et il me semble bien que c'est l'onglet Sauvegarde qui doit recevoir une valeur, et non l'inverse.
    Sur quoi tu te bases pour affirmer cela ? Si tu regardes bien le code initial, on copie les valeurs de la feuille "sauvegarde" vers la feuille "p11"

    Citation Envoyé par TaleMaker Voir le message
    si les lignes (ou les colonnes) sont les mêmes d'un onglet à l'autre, il est inutile de définir 2 variables différentes
    Elles ne sont pas forcément les mêmes d'un onglet à l'autre

    Bon...si j'ai bien compris le code initial, voici comment procéder avec une seule boucle au lieu de 2 boucles imbriquées
    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
    Sub COMPAR()
        'declaration des variables'
        Dim Cel As Range, WSHsauv As Worksheet, WSHp11 As Worksheet
        Dim i As Integer, x As Integer
     
        Set WSHsauv = Worksheets("sauvegarde")
        Set WSHp11 = Worksheets("p11")
     
        For i = 3 To WSHp11.Range("C65535").End(xlUp).Row '<-- de la ligne 3 à la dernière ligne de la colonne C de la feuille "p11"
            Set Cel = WSHsauv.Range("C:C").Find(what:=WSHp11.Range("C" & i), lookat:=xlWhole) '<-- recherche des valeurs dans la colonne C de la feuille "sauvegarde"
            If Not Cel Is Nothing Then '<-- si la valeur est trouvée
                x = Cel.Row
                WSHsauv.Range("J" & x & ":S" & x).Copy WSHp11.Range("J" & i) '<-- alors on copie les cellules des colonnes J à S
            End If
        Next
     
        'libération de la mémoire
        Set Cel = Nothing
        Set WSHsauv = Nothing
        Set WSHp11 = Nothing
    End Sub

  9. #9
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    merci beaucoup à vous deux pour vos interventions , ton code marche fring, cependant je sais que c'etait déla le cas avant mais in ne me recopie que la colonne k et pas la ligne entière. savez vous vous comment je peux faire pour qu'il me recopie de la colonne k à s . en vous remerciant par avance.

  10. #10
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    nos réponses se sont croisées

  11. #11
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    merci pour ton code fring mais comment je fais pour y integrer mes autres onglets à comparer à l'onglet sauvegarde. P12 P13, P14 P15 et P45..

  12. #12
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Essaie ceci :
    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
    Sub COMPAR()
        'declaration des variables'
        Dim Cel As Range, WSHsauv As Worksheet, WSHp As Worksheet
        Dim i As Integer, x As Integer, k As Integer, FL As Variant
     
        Set WSHsauv = Worksheets("sauvegarde")
        FL = Array("p11", "p12", "p13", "p14", "p15", "p45")
     
        For k = 0 To UBound(FL)
            Set WSHp = Sheets(FL(k))
            For i = 3 To WSHp.Range("C65535").End(xlUp).Row '<-- de la ligne 3 à la dernière ligne de la colonne C de la feuille "p..."
                Set Cel = WSHsauv.Range("C:C").Find(what:=WSHp.Range("C" & i), lookat:=xlWhole) '<-- recherche des valeurs dans la colonne C de la feuille "sauvegarde"
                If Not Cel Is Nothing Then '<-- si la valeur est trouvée
                    x = Cel.Row
                    WSHsauv.Range("J" & x & ":S" & x).Copy WSHp.Range("J" & i) '<-- alors on copie les cellules des colonnes J à S
                End If
            Next i
        Next k
     
        'libération de la mémoire
        Set Cel = Nothing
        Set WSHsauv = Nothing
        Set WSHp = Nothing
    End Sub

  13. #13
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    merci infiniment FRING, tout fonctionne...!!
    cordialement,

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/05/2014, 10h47
  2. [Toutes versions] Somme dans plusieurs onglet
    Par eric.leduc dans le forum Excel
    Réponses: 1
    Dernier message: 18/08/2009, 23h12
  3. trier dans plusieurs onglets
    Par bibvba dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/03/2008, 11h10
  4. Réponses: 2
    Dernier message: 23/08/2007, 20h45
  5. Comparaison de code dans plusieurs modules
    Par jbaudin dans le forum Access
    Réponses: 2
    Dernier message: 03/10/2005, 11h47

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