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 Couleur/Format avec Variant [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Finance

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Par défaut Comparaison Couleur/Format avec Variant
    Bonjour à tous,

    J'essaye de faire une macro pour identifier les différences entre 2 gros fichiers (équivalent de Spreadsheet Compare, qui n'existe pas sur Excel 2010).
    Cette dernière doit comparer le format, la couleur et la formule de chaque cellule.

    J'ai créé une première macro qui fait une comparaison cellule par cellule, mais elle prend 5h à tourner.

    Pour accélérer le temps de traitement, j'ai essayé d'enregistrer les feuilles dans des variants. Cela fonctionne mais seulement pour les valeurs ( Montab est le variant, Montab = range("A1:B3").Interior.IndexColor ne fonctionne pas (aucun problème pour FormulaR1C1 en revanche)).

    Ps:
    Partie du code qui marche, à laquelle j'aimerais ajouter la comparaison de la couleur et du format:

    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
    For colonne = 1 To dercolonne
        For ligne = 1 To derligne
     
        Windows(WB_1).Activate
    Sheets(wsname).Activate
    MontabA = Range(Cells(1, 1), Cells(derligne, dercolonne)).FormulaR1C1Local
     
        ' On Error Resume Next
        contenue1 = MontabA(ligne, colonne)
        If Err > 0 Then
        erreur = erreur & sh.Name & "  " & Cells(ligne, colonne).Address & ": erreur cellule" & vbCrLf
        End If
     
      Windows(WB_2).Activate
    Sheets(wsname).Activate
    MontabB = Range(Cells(1, 1), Cells(derligne, dercolonne)).FormulaR1C1Local
     
     
        contenue2 = MontabB(ligne, colonne)
       ' On Error GoTo -1
     
    If contenue1 <> contenue2 Then
     
    erreur = erreur & sh.Name & ": " & Cells(derligne, dercolonne).Address & vbCrLf
    Else
    End If
     
     
        Next ligne
        Next colonne
    Auriez-vous une solution?


    Merci

    Quentin

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    a mon avis tu es loin du compte
    ca ca ne peut pas marcher
    tout simplement parce que tu demande une formule sur X cellule et formulaRC en lecture ne peut te lire qu'une cellule j'ai pas tester mais je pense que si il n'y a pas d'erreur déclenchée la valeur retournée doit etre "Null"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MontabA = Range(Cells(1, 1), Cells(derligne, dercolonne)).FormulaR1C1Local
    et puis ces activate ne sont pas necessaire
    du devrait concevoir ton exament de la plage un peu comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    set WB1=thisworkbook.sheets(x)
    set WB2=nomduworkbook2.sheets(x)' a condition qu'il soit ouvert sinon c'est "=workbooks.open("nom du workbook a ouvrir")puis .sheets(x)
    for each cel in wb1.range("A1:B3")
    if wb2.range(cel.address).formula=cell.formula then
     
    'reste du code
     
    end if 
    next
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Finance

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Par défaut
    Merci patricktoulon pour ta réponse,

    Je pense qu'avec ton code je vais retomber sur mon problème initial qui est la lenteur de vérification si l'on procède cellule par cellule (la macro que j'ai créé à l'originie enregistre dans un string les informations (Formule,format, code couleur)).

    C'est pour celà que je voudrais déclarer une range comme une variable et demander à VBA de comparer à partir de ces variants (j'ai lu sur un poste qu'il était beaucoup plus rapide de fonctionner comme cela que de passer de workbook en workbook).

    ps: le bout de macro dans mon premier post fonctionne bien, mais elle ne prend pas en compte le format(%, Général etc) et la couleur de la cellule.

    cdlt

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    re

    ps: le bout de macro dans mon premier post fonctionne bien, mais elle ne prend pas en compte le format(%, Général etc) et la couleur de la cellule.
    alors je repete doucement ,lentement

    EN LECTURE!!!! avec ta methode ca n'est pas possible !!!!!!!!!!!!!!!!!!!
    tu est obligé de faire cellule par cellule

    si tu a par exemple en A1 une formule ,un format,une couleur puis en b1 une autre formule ,un autre format,une autre couleur
    et que tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    msgbox range("A1:B1").formula , tu aura "Null"
    msgbox range("A1:B1").numberformat, tu aura "Null"
    msgbox range("A1:B1").interior.color, tu aura "Null"
    bref tu aura pour seul retour "Null"
    est ce suffisement clair pour toi ?
    conclusion cellule par cellule "you ave not choice!!"
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Finance

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Par défaut
    J'ai appris VBA sur le tas donc j'imagine qu'en "LECTURE" signifie que VBA regarde les spécifications de la cellule.

    msgbox range("A1:B1").formula , tu aura "Null"

    je suis d'accord mais si ma range est un Variant, alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MontabA = Range("A1:B1").formula
     
    for x = 1 to 2
     
    msgbox MontabA (1 , x)
     
    Next
    je vais bien avoir un messagebox avec la formule en A1, puis un autre avec la formule en B1.

    Ce que je ne comprends pas c'est pourquoi je ne peux pas récupérer le format en remplaçant .formula par .Format

    Je sais que la comparaison doit forcement être faite cellule par cellule, mais j'aimerai qu'elle se fasse entre les cellules du Variant plutot qu'entre celles des workbooks

    Merci

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    je pense que u devrais regarder le tutoriel sur les varianbles ton code n'a aucun sens

    je sais pas si je parle pas francais correctement ou quoi mais pour la derniere fois je te dis que ca n'est pas possible
    une formule en lecture ne peut etre lu que d'une cellule a la fois
    que ta variable soit variant ou range au depart c'est pareil

    tu ne peux pas!!!!!!!!!!!!!!!

    est ce que c'est clair cette fois ci ????

    tu veux les propriété d'une plage il te faut boucler sur les cellules meme en variant (plage en variant ,ce qui entre parentheses n'a aucun sens mais bon si tu y tiens )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    dim plage as variant 
    set plage=range("A1:B3")
    for each cel in plage.cells
    debug.print "address " & cel.address
    debug.print "formule " & cel.formula
    debug.print "format " & cel.numberformat
    debug.print "interior.color " & cel.interior.color
    debug.print "font.color " & cel.font.color'attention ici null si plusieur couleur dans le texte de la cellule
    debug.print "italic " & cel.font.italic
    'etc....
    debug.print "....................."
    next
    revois les bases pour les variables ca t'aidera beaucoup
    dans l'exemple ci dessus il sufit que une des propriété soit differentes dans 2 cellule de cette plage et bien je te le donne dans le mille range("A1:B3").propriété donnera "NULL"!!!!!!
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    re
    Citation Envoyé par pandard2 Voir le message
    J'ai appris VBA sur le tas donc j'imagine qu'en "LECTURE" signifie que VBA regarde les spécifications de la cellule.

    msgbox range("A1:B1").formula , tu aura "Null"

    je suis d'accord mais si ma range est un Variant, alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MontabA = Range("A1:B1").formula
     
    for x = 1 to 2
     
    msgbox MontabA (1 , x)
     
    Next
    je vais bien avoir un messagebox avec la formule en A1, puis un autre avec la formule en B1.

    Ce que je ne comprends pas c'est pourquoi je ne peux pas récupérer le format en remplaçant .formula par .Format

    Je sais que la comparaison doit forcement être faite cellule par cellule, mais j'aimerai qu'elle se fasse entre les cellules du Variant plutot qu'entre celles des workbooks

    Merci
    @pandard2 pour reprendre ton exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MontabA = Range("A1:B1").formula   'pas bon!!!! tu tente de lire la formule de deux cellules en meme temps
    c'est comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set MontabA = Range("A1:B1")      ' remarque le "set" qui instancie montabA en tant qu'object range
    ensuite ta boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for x = 1 to 2
     msgbox MontabA ( x)'c'est quoi ce (1,x)
     Next
    attention ici((1,X) fonctionnera mais sur une plage de plus de 2 ligne et /ou colonne ca ne fonctionnera pas du moins comme tu le crois
    ne pas confondre coordonnées cellule exemple( cells(1,2))pour B1 et l'index de cellule d'une plage qui pour le coup dans ton exemple pour la meme chose se sera MontabA.cells(x) QUI DONNE B1 AUSSI
    donc ta boucle se sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for x = 1 to 2
     debug.print  MontabA .cells( x).address  'adresse de la cellule
    debug.print  MontabA .cells( x).value ' valeur cellule
    debug.print  MontabA .cells( x).numberformat' format de la cellule( DU TEXTE BIEN ENTENDU) 
    debug.print  MontabA .cells( x).formula  'formule de la cellule 
    etc......
    debug.print  "---------------------"
    Next
    bref voila quoi
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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

Discussions similaires

  1. Copier deux worksheets interreliées dans un nouveau Workbook
    Par martincactus dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/06/2008, 13h52
  2. Réponses: 6
    Dernier message: 03/05/2007, 13h42
  3. Réponses: 10
    Dernier message: 05/02/2007, 11h21
  4. Copier un String dans un variant
    Par foued_scorpion dans le forum Visual C++
    Réponses: 2
    Dernier message: 03/11/2006, 23h35
  5. Réponses: 6
    Dernier message: 14/10/2005, 20h53

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