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 la valeur de deux cellules sur 2 classeurs différents


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Points : 16
    Points
    16
    Par défaut comparaison de la valeur de deux cellules sur 2 classeurs différents
    Bonjour,

    Je souhaite comparer les montants de deux cellules de deux classeurs différents afin de vérifier que la totalité des données a bien été traitée.

    Le premier classeur est généré par une précédente macro sous cette forme :
    "classeur1 " & Format(Date, "yyyymmdd") & "_" & Format(Time, "hhmm") & ".xlsx"

    Le deuxième classeur est celui sur lequel la macro travaille :
    son nom est toujours le même car il n'est pas encore enregistré au format du classeur 1 avec la date et l'heure donc : "classeur2".

    le classeur1 sera toujours ouvert lors de la macro 2 car elle importe les données du classeur 1 pour les retraiter



    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
    'définition d'un nom pour classeur1 au début de la macro
        Dim GLfile As String
        GLfile = ActiveWorkbook.Name
     
    'calcul du nombre de lignes pour autofill
        Dim LR2 As Integer
        LR2 = Range("C" & Rows.Count).End(xlUp).row
     
    'calcul du montant total en D1 classeur2
        Range("D1").Select
        ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R3C4:R" & LR2 & "C4)"
        Dim Cell1 As Range
        Dim Cell2 As Range
        Cell1 = ActiveCell  'soit D1 du workbooks("classeur2").sheets(1)
        Workbooks(GLfile).Sheets(1).Range("AG1").activate
        Cell2 = Workbooks(GLfile).Sheets(1).Range("AG1")
     
    'test
        If Cell1 = Cell2 Then
        MsgBox "Toutes les données ont bien été traitées."    
    Else
        MsgBox "Certaines données n'ont pas été traitées. Fin de la macro."
        Exit Sub
        End If
    Voilà, ça me parait assez simple à réaliser mais je bloque bêtement dessus... Je ne comprends pas ce qui cloche dans mon code :
    je définis les variables, les noms des classeurs et ça me bloque au niveau "Cell1 = ActiveCell" (quand je vais dessus j'ai bien la valeur qui s'affiche donc je sais que cette variable est bonne)

    Merci à ceux qui prendront le temps de répondre.

    Bonne journée!

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 69
    Points : 134
    Points
    134
    Par défaut
    Bonjour, il vous suffit de rajouter un Set car on travaille ici avec un objet.

  3. #3
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    En fait si les deux classeurs sont ouverts, en respectant la hiérarchie d'Excel,
    c'est à dire classeur, feuille, cellule, propriété … une seule ligne suffit pour effectuer la comparaison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Workbooks("nom classeur1").Worksheets("nom").Range("nom").Value = Workbooks("nom classeur2").Worksheets("nom").Range("nom").Value Then
    Si une des cellules est située dans la feuille active :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If ActiveSheet.Range("nom").Value = Workbooks("nom classeur2").Worksheets("nom").Range("nom").Value Then
    Et si l'autre est située dans le classeur contenant le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If ActiveSheet.Range("nom").Value = ThisWorkbook.Worksheets("nom").Range("nom").Value Then
    Et si l'autre est située dans la feuille active du classeur contenant le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If ActiveSheet.Range("nom").Value = ThisWorkbook.ActiveSheet.Range("nom").Value Then
    Bref, suffit d'être carré en indiquant juste où se trouve ce qui doit être comparé !
    Ce qui n'a pas l'air d'être le cas dans le code présenté entre les lignes n°3, 10 & 14 : c'est toujours dans le même classeur !
    La ligne n°15 ne sert à rien …

    A lire puis à appliquer aux lignes n°10 & 11 …

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Merci beaucoup! Cela fonctionne parfaitement et j'ai appris quelque chose.

    Merci de votre réactivité.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Bon cela fonctionnait et ne fonctionne plus. Je me permet de réouvrir le thread.


    Il ne trouve aucune valeur pour aucune des deux cellules (quand je mets le résultat en msgbox j'obtient un 0).

    @Marc-L

    Ce n'est pas toujours le même classeur, je n'ai surement pas été très clair. La première macro va généré le classeur1 avec la date et l'heure. Le fichier est enregistré dans un répertoire aléatoire. Ensuite la macro2 (celle sur laquelle on travaille actuellement) va récupérer les données du classeur1. Le classeur1 sera toujours ouvert puisqu'il faut être dessus pour lancer la macro2. La macro2 va ensuite ouvrir un fichier vierge sur lequel elle va importer les données du classeur2 (c/c à partir d'un TCD du classeur1). Ensuite il va y avoir d'autres traitements que je n'ai pas mis mais qui n'ont pas d'importance sur ce que je obtenir.
    Je souhaite faire un contrôle sur les données entre le classeur1 et 2.

    - la ligne 3 permet de définir un nom pour le classeur1 qui a un nom variable (date & heure), ça me permet de l'appeler justement pour la suite (dans la macro2). Je comprends pas trop ce qu'il faut changer sur cette ligne.
    - la ligne 10 : j'imagine qu'il faut se débarrasser du select. La formule se situe dans cette cellule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Range("D1").FormulaR1C1 = "=SUBTOTAL(9,R3C4:R" & LR2 & "C4)"
    comme ceci ??

    - j'ai supprimé la ligne 15.

    Voici le code actuel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    'calcul du montant total en D1
        Range("D1").Select
        ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R3C4:R" & LR2 & "C4)"
     
        If Workbooks("classeur2").Worksheets("sheet1") .Range("D1").Value = Workbooks(GLfile).Worksheets("sheet1").Range("AG1").Value Then
     
        MsgBox ("Toutes les données ont bien été traitées.")
        Else
        MsgBox ("ERROR") vbCritical
        Exit Sub
        End If
    J'espère avoir été plus clair. Si ce n'est pas le cas, dites le moi.
    Merci d'avance.

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Tout dépend du classeur actif et de l'autre qui ne l'est pas …

    Si le code est dans un module normal, pour la feuille active c'est Activesheet.Range("cellule").Value
    tandis que pour l'autre il faut respecter la hiérarchie Workbooks.Worksheets.Range.Value

    Dans le doute, respecter la hiérarchie pour les deux !

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Effectivement ça me parait plus prudent de respecter la hiérarchie. Malheureusement même en respectant cette hiérarchie, le problème persiste et les montants ne sont pas égaux. En affichant les deux montants en MsgBox à la suite, j'ai trouvé l'erreur.

    Le montant du classeur1 (GLfile) est égal à xxxxx.00000000020 et le montant du classeur 2 (donc après le traitement des données) est de xxxxx.00.

    Ma nouvelle question : comment peut-on prendre en compte que deux décimales sur VBA soit au niveau du code :
    - de la formule c'est à dire en formatant le résultat obtenu
    - de la comparaison des deux valeurs

    Cette différence de montant étant tellement infime et surement supprimée lors de la copie des données dans le classeur2, j'aimerais ne pas la prendre en compte.

    Merci encore du temps accordé.


    Je n'ai pas créé de nouveau poste pour éviter de polluer...

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Peut-être en utilisant la fonction CCur convertissant sur quatre décimales …

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Merci, je ne connaissais même pas la fonction sur VBA donc je ne sais pas forcémenet bien l'utiliser. J'ai checké sur google pour voir comment l'utiliser et j'en suis arrivé à ça:

    j'ai testé :

    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
    'calcul du montant total en D1 
        Range("D1").Select
        ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R3C4:R" & LR2 & "C4)"
    
     Dim value As Currency    
    
    MsgBox ActiveSheet.Range("D1").value
    MsgBox Workbooks(GLfile).Worksheets("Data hors (Franfinance)").Range("AG1").value
            
    '(sécurité)vérification du traitement de l'intégralité des données
        If ActiveSheet.Range("D1").value = Workbooks(GLfile).Worksheets("sheet1").Range("AG1").value Then
        MsgBox ("Toutes les données ont bien été traitées.")
        Else
        MsgBox ("blabla"), vbCritical
        Exit Sub
        End If
    Ben ça ne change rien
    Je suis pas sûr que value soit une bonne variable...

    Cordialement,


    Problème résolu avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    '(sécurité)vérification du traitement de l'intégralité des données
        Dim value1 As Currency, value2 As Currency
        value1 = ActiveSheet.Range("D1").value
        value2 = Workbooks(GLfile).Worksheets("sheet1)").Range("AG1")
     
        If value1 = value2 Then
        MsgBox ("Toutes les données ont bien été traitées.")
        Else
        MsgBox ("Certaines données n'ont pas été traitées, fin de la refacturation."), vbCritical
        Exit Sub
        End If
    Merci encore pour tes réponses Marc-L!

  10. #10
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Ou bien

    If CCur(ActiveSheet.[D1].Value) = CCur(Workbooks(GLfile).Worksheets("sheet1").[AG1].Value) Then


    Et :
    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé …

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

Discussions similaires

  1. [XL-2003] Faire une liaison entre deux tableaux sur 2 classeurs différents
    Par Katell dans le forum Conception
    Réponses: 1
    Dernier message: 22/01/2015, 18h04
  2. [XL-2003] Lier deux cellules sur des feuilles différentes
    Par Olivier.p dans le forum Excel
    Réponses: 6
    Dernier message: 21/07/2009, 14h03
  3. Réponses: 2
    Dernier message: 10/10/2008, 20h35
  4. Changement reciproque de la valeur de deux cellules
    Par florent149 dans le forum Excel
    Réponses: 2
    Dernier message: 26/06/2007, 05h06
  5. [VBA - Excel] Problème de deux cellules sur l'evenement OnChange
    Par champmart dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/01/2007, 17h06

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