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 :

comparer deux feuilles du même classeur


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 211
    Par défaut comparer deux feuilles du même classeur
    Bonjour tout le monde,

    J'essaie de comparer en VBA deux feuilles d'un même classeur mais j'arrive pas, la solution banale que je peux faire pour l'instant c'est de faire un petit programme permettant de mettre chaque feuille dans un classeur afin de les séparer et puis faire la comparaison ce qui nous ramène à faire une comparaison de deux classeurs différents, ça marche super bien pour les classeurs contenant 3, 4 feuilles mais ça devient compliquer quand il s'agit d'un classeur qui contient 30, 40 feuilles surtout que j'aimerais le faire d'une manière "user-friendly" . Est ce qu'il y a quelqu'un qui pourra m'aider???


    Merci d'avance

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Peux-tu nous mettre ton code qu'on n'aille pas te proposer ce que tu fais déjà ?
    Précise-nous aussi le pb que tu rencontres quand tu as plus de 3 feuilles
    A+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 211
    Par défaut
    Bonjour tout le monde,

    Pour transformer un classeur en plusieurs voila le code que j'utilise:

    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 ClasseurEnClasseurs()
     
    'copier toutes les feuilles d'un classeur
     
        Dim ceFichier As Workbook
     
        'Activer le fichier en cours
        Set ceFichier = ActiveWorkbook
     
        Dim nouveauFichier As Workbook
     
        'Pour chaque feuille du classeur
        For Each fSheet In ceFichier.Worksheets
     
            Workbooks.Add
            DoEvents
            Set nouveauFichier = ActiveWorkbook
            fSheet.Copy before:=nouveauFichier.Sheets(1)
            'fSheet.Copy after:=nouveauFichier.Sheets(1)
            DoEvents
            nouveauFichier.SaveAs Filename:="\" & fSheet.Name, FileFormat:=xlNormal
            DoEvents
        Next
     
        ceFichier.Activate
     
    End Sub
    Ce code me permet effectivement de transformer un seul classeur en plusieurs, il donne à chaque nouveau classeur le nom de la feuille ou se situer les données copiées et ça fonctionne pour n'importe quel classeur même ceux ayant des 100ène de feuilles sauf que c'est pas pratique dans mon cas puisque j'ai besoin de comparer que 2 feuilles .

    Merci d'avance pour votre aide

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Dans ton code, tu copies les feuilles, tu ne les compares pas. Si tu n'as que deux feuilles à copier, tu n'es pas obligé de passer par la collection (For each...) Si tu connais le nom des feuilles à copier, ne copies que ces feuilles là.
    Explique ce que tu veux faire et éventuellement, donne le nom des feuilles à copier.
    A+

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 211
    Par défaut
    Bonjour

    Peut être que j'étais pas trop claire et je tiens à m'excuser. En fait, ce que je veux faire c'est d'un classeur comportant 30 feuilles comparer deux entre elles, les nom des classeurs ne sont pas vraiment intéressant ça doit se faire le plus génériquement possible, j'ai opté pour la solution de copier les feuilles parce que je sais pas comment je pourrais le faire autremant si t'as une solution pour moi je suis preneuse

    Merci d'avance

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Toujours pas compris. Donne un exemple. Tu veux comparer quelle(s) feuille(s) avec quelle(s) feuille(s) ?
    Mets en français (pas en code) ce que tu veux faire. Dans ton code je ne vois pas de comparaison.
    Pour comparer deux feuilles, il faut... deux feuilles. L'original et la feuille à comparer.
    - Les feuilles à comparer portent-elles toujours le même nom ? Lequel ?
    - Où se trouve l'original ? Dans le classeur contenant la macro ?

    Ce que fait ton code (pour autant qu'il fonctionne) c'est créer un nouveau classeur pour chaque feuille du classeur actif au lancement de ta macro, classeurs que tu ne fermes pas après enregistrement. C'est tout ce que je peux en déduire
    Si tu peux répondre à mes questions, j'y verrai sans doute plus clair

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 211
    Par défaut
    bon OK revenant a notre point de départ.

    j'ai un classeur de 30 feuilles que je te mets en pièce jointe, ce qu'on me demande de faire et de comparer les feuilles '2' et '3' avec la feuille 'balance', en fait concrètement, les deux feuilles '2' et '3' sont prise de plusieurs fonction venant de la feuille principale "balance".

    Ce que je dois faire est de comparer deux fonctions que je vais créer, soient f et g avec:
    f une fonction numérique que je vais créer à partir de ma feuille '2' et g une fonction numérique créée à partir de la feuille 'balance' si les calculs sont bon et que la feuille '2' a bien été remplie je dois avoir f = g sinon un message d'erreur doit apparaitre annonçant qu'il y a une erreur lors du remplissage de la feuille '2' (idem pour la feuille '3') pour le choix des fonctions je suis en manque d'idée mais si j'arrive au mois à comparer deux feuille d'un même classeur (n'importe lequel) c'est déjà pas mal. c'est un peu chaud j'espère au mois que j'étais un petit peu claire , je voulais pas vraiment entrer dans les détailles mais bon ... si t'as une idée sur la manière dont je dois procéder je te serais vraiment reconnaissante toute ma vie

    Merci d'avance

    PS: c'est tjrs vague ce qu'on me demande de faire c'est pourquoi j'ai du mal à m'exprimer

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 211
    Par défaut
    le fichier est si grand que je pouvais pas le mettre en pièce jointe je t'envoie la juste la feuille 2 mais je sais pas si ça va trop d'aider

    @+
    Fichiers attachés Fichiers attachés
    • Type de fichier : xls 2.xls (38,5 Ko, 91 affichages)

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Pour comparer deux cellules, c'est facile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test1()
    Dim ok as boolean
        ok = Worksheets("Feuil1").range("A1") = Worksheets("Feuil2").range("A1")
        If ok then
            Msgbox "C'est bon !"
            else
            Msgbox "C'est pas bon !"
        endif
    end sub
    Maintenant, s'il s'agit de comparer une plage de cellules, c'est "presque" pareil : Ici je compare la colonne A de feuil1 avec la colonne A de feuil2
    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
    Sub test2()
    Dim Plage2 As Range, Plage1 As Variant
    Dim ok As Boolean
        Plage1 = Worksheets("feuil1").Range("A1:A" & Range("A65536").End(xlUp).Row).Value
        Set Plage2 = Worksheets("feuil2").Range("A1:A" & Range("A65536").End(xlUp).Row)
        With Plage2
            Set c = .Find(Plage1)
            ok = Not c Is Nothing
        End With
        If ok Then
            MsgBox "C'est bon !"
            Else
            MsgBox "C'est pas bon !"
        End If
    End Sub
    Pour comparer la feuille "Balance" avec une "autre" feuille quelqu'elle soit, tu dois déterminer les plages à comparer et adapter le code ci-dessus.
    Si tu as besoin d'explication(s)...
    Bon courage.

    Edit
    Si tu es certain que la cellule A1 est renseignée, tu peux faire ça
    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
    Sub test3()
    Dim Plage2 As Range, Plage1 As Variant
    Dim ok As Boolean
        Plage1 = Worksheets("feuil1").Range("A1").CurrentRegion.Value
        Set Plage2 = Worksheets("feuil2").Range("A1").CurrentRegion
        With Plage2
            Set c = .Find(Plage1)
            ok = Not c Is Nothing
        End With
        If ok Then
            MsgBox "C'est bon !"
            Else
            MsgBox "C'est pas bon !"
        End If
    End Sub
    Sinon tu remplaces A1 par la première cellule renseignée de chaque feuille.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 211
    Par défaut
    Merci pour tes réponses. Mais franchement c'est encore vague pour moi et je sais pas si ca va coller avec ce que je veux exactement, je vais voir ça plus tard, par contre j'aimerais bien te poser une question de passage: supposant qu'on a 3 numéro de compte 1311, 1312 et 1313 parmi d'autres et que je veux avoir la somme d'une colonne chaque fois qu'on trouve un numéro de compte qui commence par 131... Plus concrètement: soit sous Ecxel

    ...
    1234 4
    1311 2
    1312 7
    1313 10
    ...

    et ce que je cherche c'est avoir la valeur 19 pour tous les comptes qui commence par 131

    Tu pourras m'écrire le code en VBA qui permet de trouver cette somme STP

    Sinon merci pour ton aide

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ta colonne N° est-elle triée par valeur ? Si oui, c'est assez rapide. Si non tu dois faire une boucle.
    Tu dis
    A+

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 211
    Par défaut
    Oui oui elle est triée par valeur croissante

    En fait pour te mettre dans le bain afin de faire la comparaison je viens de me rends compte (parce que je travaille sur des données de comptable la chose que j'ai jamais faite de ma vie) que si j'arrive à faire des sommes pareilles ca va me facilité la tache pour la comparaison parce que à la fin j'aurais qu'à comparer la somme donnée avec une seule cellule de la ligne "Total Actif" (si tu vois ce que je veux dire) s'ils sont égaux c'est gagné

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ok. Alors pour ça je propose une recherche de la première valeur 131 (ou autre) de la colonne. Deux conditions sont à remplir, la cellule doit contenir 131 et la valeur de la cellule doit commencer par 131.
    Exemple
    1319 => Ok
    9131 => Ko
    1 - Déterminer la plage de cellules renseigner
    2 - Vers le bas de la plage, rechercher 131 (avec Find)
    3 - Vérifier si 131 est le début de la valeur
    4 - Si oui, tu cumules la valeur de la ligne colonne 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function Result(No as string) as double
    Dim c as range, Ad as long
        With Worksheets("feuil1").range("A1:A" & range("A65536").end(xlup).row)
            set c = Find(No, LookIn:=xlvalues, LookAt:=xlpart)
            If Not c Is Nothing Then
                Ad = c.Address
                Do
                    if left(c, 3) = No then Result = Result + C.Offset(0,1)
                    Set c = .FindNext(c)
                Loop While Not c Is Nothing And c.Address <> Ad
            End If
        End With
    End function
    Pour l'appel, tu listes les valeurs des trois premiers chiffres que tu auras à cumuler, ex 125, 131, 235, 097... et tu pourras récupérer les valeurs dans un tableau par exemple.
    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
    Sub appel()
    Dim Tablo as variant, Totaux() as double
        Tablo = Array(125, 131, 235, 097)
        For i = 0 to Ubound(Tablo) -1
             Redim Totaux(i)
             Totaux(i) = Result(cstr(Tablo(i))
        Next
    'et là, tu sauras que Totaux(0) sera la somme de N° commençant par 125,
    'Totaux(1) la somme des N° commençant par 131, etc.
    '... et tu pourras en faire ce que tu voudras
    'Pour voir les résultats :
    For i = 0 to Ubound(Totaux) -1
         Msgbox Totaux(i)
    Next
    End sub
    Selon tes besoins, sache que tu as un moyen très simple de récupérer la liste des N° et de les placer dans un tableau (ce que j'ai fait avec Tablo = Array(125, 131, 235, 097))
    Je n'ai pas testé. Tu peux faire ça pour moi ?
    A+

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 211
    Par défaut
    je pense que je vais jamais finir avec ça tu seras me dire pourquoi on me donne une erreur de compilation a ce niveau????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
    For i = 0 To UBound(Tablo) - 1
             ReDim Totaux(i)
             Totaux(i) = Result(cstr(Tablo(i))
        Next

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Comme ça, je ne vois pas. Envoie un bout de fichier que je puisse tester. Une seule feuille et une vingtaine de lignes, je pense que ça suffira.
    A+

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 211
    Par défaut
    viola je t'envoie un bout du fichier sur lequel je travaille en fait je cherche la somme des chiffres figurant dans la colonne J

    merci bcp pour ton aide
    Fichiers attachés Fichiers attachés

  17. #17
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    M'aurait bien étonné de ne rien avoir oublié. Testé sur ton fichier ce coup-ci, avec les bons N° de colonnes et Redim Preserve (sinon t'as rien dans le tableau toto)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function Result(No) As Double
    Dim c As Range, Ad As String
        With Worksheets("feuil1").Range("B1:B" & Range("B65536").End(xlUp).Row)
            Set c = .Find(What:=No, LookIn:=xlValues, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)
            If Not c Is Nothing Then
                Ad = c.Address
                Do
                    If Left(c, 3) = No Then Result = Result + c.Offset(0, 2)
                    Set c = .FindNext(c)
                Loop While Not c Is Nothing And c.Address <> Ad
            End If
        End With
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub appel()
    Dim Tablo As Variant, Totaux() As Double
        Tablo = Array(106, 151, 168, 171)
        For i = 0 To UBound(Tablo)
             ReDim Preserve Totaux(i)
             Totaux(i) = Result(CStr(Tablo(i)))
        Next
        'Pour voir les résultats :
        For i = 0 To UBound(Totaux)
             MsgBox Totaux(i)
        Next
    End Sub

  18. #18
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Edit
    J'ai fait la somme des nombres de la colonne D, tu corriges

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 211
    Par défaut
    Bonjour

    Merci ca marche super nikel. j'ai un peu modifié le code pour avoir la somme entière mais j'arrive pas a voir ou j'ai une erreur parce qu'il me donne une somme égale à 0 avec ce code la

    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
     
     
    Sub appel()
    Dim Tablo As Variant, Totaux() As Double
        Tablo = Array(106, 151, 168, 171)
        For i = 0 To UBound(Tablo)
             ReDim Preserve Totaux(i)
             Totaux(i) = Result(CStr(Tablo(i)))
        Next
        'Pour voir les résultats :
        somme = 0
        While i <= UBound(Totaux)
             somme = "=Sum(Totaux(i))"
             i = i + 1
        Wend
     
        MsgBox somme
     
    End Sub

  20. #20
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Normal ! ton utilisation de "=Sum(Totaux(i))" ne me paraît pas normale, l'est même complètement anormale ! Pour tout dire, je ne comprends pas ce que tu veux obtenir en mettant ça. Si mon code te donne le résultat escompté, pourquoi le changer ? Pas que j'y tienne vraiment mais quel est le but recherché ?
    A+

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Supprimer une ligne sur deux feuilles du même classeur
    Par apdf1 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 12/03/2011, 13h28
  2. Comparer deux fichiers de même nom ?
    Par mostafajob dans le forum AS/400
    Réponses: 17
    Dernier message: 05/12/2010, 00h44
  3. Comparer deux feuilles et supprimer les doublons
    Par Lison Lisette dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 13/10/2010, 23h35
  4. [Débutant]Appeler une feuille du même classeur ?
    Par Kyti dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 29/09/2008, 15h22
  5. comparer deux feuilles excel ss VBA
    Par washh dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/08/2008, 17h14

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