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 :

Macro lente VBA [XL-2010]


Sujet :

Macros et VBA Excel

  1. #21
    Candidat au Club
    Homme Profil pro
    Responsable d'opérations réseaux
    Inscrit en
    Juin 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Responsable d'opérations réseaux

    Informations forums :
    Inscription : Juin 2019
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    désolé de revenir vers vous, je vais essayer d'exprimer mon besoin le plus clairement possible :
    Pour une même valeur trouvée en colonne 1, si je trouve en colonne 2 des valeurs identiques alors j'affiche "NON" en colonne 3 sinon j'affiche "OUI"
    Il n'y a pas de notion de lignes successives.
    J'ai refait un exemple de résultat attendu.

    Nom : exemple résultat.png
Affichages : 128
Taille : 5,3 Ko

    Par exemple : j'affiche un NON en face de la Valeur 1 car en colonne 2 je n'ai que "Valeur A"
    Pour la Valeur 2, J'affiche OUI car en colonne 2 j'ai "Valeur A" et "Valeur B"
    Pour la Valeur 3, j'aimerais afficher OUI sur toutes les lignes car on trouve "Valeur C" et "Valeur D"
    Pour la Valeur 4, j'affiche OUI car J'ai Valeur E et Valeur F

    Pour résumer, je veux afficher "NON" sur l'ensemble des lignes correspondantes à une valeur uniquement quand je trouve, les mêmes valeurs en colonne 2.

    Est-ce que c'est plus clair ?

  2. #22
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Ok...

    On va donc compter le nombre de lignes du tableau qui correspondent à la ligne sur laquelle la formule se trouve, et comparer ce nombre à celui des lignes qui ont la même valeur en col1 que celle de la ligne de la formule. Si égalité, NON, sinon, OUI

    Nom : 2019-06-26_163714.png
Affichages : 133
Taille : 10,9 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #23
    Candidat au Club
    Homme Profil pro
    Responsable d'opérations réseaux
    Inscrit en
    Juin 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Responsable d'opérations réseaux

    Informations forums :
    Inscription : Juin 2019
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Bonjour Pierre,

    Après beaucoup de tests, ta formule convient parfaitement mais j'aimerais diminuer le temps d'exécution et l'incrémenter en VBA.
    Pour le temps d'exécution j'utilise " Application.ScreenUpdating = False " qui fonctionne parfaitement.
    Le problème est l'incrémentation en VBA, j'arrive à afficher la formule mais le résultat est sous la forme "#NOM?", elle ne s'exécute pas.

    voici mon code :

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Range("T2").Select
    ActiveCell.FormulaR1C1 = _
            "=SI(NB.SI.ENS([Nomproduittechnique],[@[Nomproduittechnique]],[cable],[@cable])=NB.SI.ENS([Nomproduittechnique],[@[Nomproduittechnique]]),""NON"",""OUI"")"
        Range("T2").Select

    As-tu une idée ?

  4. #24
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut

    Tu devrais utiliser Formula à la place de FormulaR1C1. Formula et FormulaR1C1 requièrent que la formule soit en anglais. En plus, R1C1 impose un adressage des formules R1C1 que perso je n'aime pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ActiveCell.Formula = _
    "=If(Countifs([Nomproduittechnique],[@[Nomproduittechnique]],[cable],[@cable])=countifs([Nomproduittechnique],[@[Nomproduittechnique]]),""NON"",""OUI"")"
    Il n'est pas nécessaire d'activer la cellule pour utiliser la formule. Tu gagneras beaucoup de temps à ne pas activer tes cellules. Tu peux de suite utiliser range("t2").formula="...". Tu peux même placer la formule en une seule passe sur la plage voulue: range("t2:t1000").formula="..."En plus du screenupdating, tu pourrais désactiver le calcul pour accélérer le traitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
      Dim CalculationMode As XlCalculation
     
      On Error GoTo Catch
      CalculationMode = Application.Calculation
      Application.Calculation = xlCalculationManual
      Application.ScreenUpdating = False
      Range("t2:t1000").Formula = "..."
     
    Catch:
      Application.Calculation = CalculationMode
      Application.ScreenUpdating = True
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #25
    Candidat au Club
    Homme Profil pro
    Responsable d'opérations réseaux
    Inscrit en
    Juin 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Responsable d'opérations réseaux

    Informations forums :
    Inscription : Juin 2019
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Merci pour les infos, j'avais vu de mon côté que le R1C1 imposait un changement des ";" en "," car c'est en anglais.

    J'ai essayé avec ton code mais pas moyen de le faire marcher, il s'exécute mais rien ne s'affiche.

    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
    Private Sub Filtre_Occupation()
        Dim CalculationMode As XlCalculation
     
        On Error GoTo Catch
        CalculationMode = Application.Calculation
        Application.Calculation = xlCalculationManual
        Application.ScreenUpdating = False
        Range("T2").Formula = _
        "=If(Countifs([Nomproduittechnique],[@[Nomproduittechnique]],[cable],[@cable])=countifs([Nomproduittechnique],[@[Nomproduittechnique]]),""NON"",""OUI"")"
     
    Catch:
      Application.Calculation = CalculationMode
      Application.ScreenUpdating = True
     
    End Sub
    Quand je commente la partie du calcul, je trouve une erreur d'exécution '1004' définie par l'application ou par l'objet

    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
    Private Sub Filtre_Occupation()
    '    Dim CalculationMode As XlCalculation
    '
    '    On Error GoTo Catch
    '    CalculationMode = Application.Calculation
    '    Application.Calculation = xlCalculationManual
        Application.ScreenUpdating = False
        Range("T2").Formula = _
        "=If(Countifs([Nomproduittechnique],[@[Nomproduittechnique]],[cable],[@cable])=countifs([Nomproduittechnique],[@[Nomproduittechnique]]),""NON"",""OUI"")"
     
    'Catch:
    '  Application.Calculation = CalculationMode
      Application.ScreenUpdating = True
     
    End Sub
    Une idée ?

  6. #26
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Je n'ai pas ton fichier, donc je ne sais pas reproduire ce que tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("tableau1[colonne1]").Formula = "=IF(COUNTIFS([NomProduitTechnique],[@NomProduitTechnique],[Cable],[@Cable])=COUNTIFS([NomProduitTechnique],[@NomProduitTechnique]),""OUI"",""NON"")"
    Nom : 2019-07-02_164626.png
Affichages : 107
Taille : 13,0 Ko

    Cela dit, je vois que tu mets cela en T2. Si T2 fait partie de ta table de données, ok. Sinon, ça ne saurait pas fonctionner tel quel. La formule que je t'ai donnée a été rédigée pour être utilisée dans une colonne formulée du tableau.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #27
    Candidat au Club
    Homme Profil pro
    Responsable d'opérations réseaux
    Inscrit en
    Juin 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Responsable d'opérations réseaux

    Informations forums :
    Inscription : Juin 2019
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    bonjour Pierre et merci pour tout, ça marche parfaitement et le traitement et bien moins long.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. macro excel vba
    Par fildupa dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/12/2006, 21h29
  2. Demarrer une Macro/Appli VBA sans paser par les feruilles Excel
    Par size_one_1 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 08/12/2006, 21h23
  3. [VBA-E]macro lente. étrange. étrange.
    Par zenix dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/04/2006, 11h59
  4. execute une macro via vba sous access
    Par nes dans le forum Access
    Réponses: 4
    Dernier message: 28/03/2006, 23h15
  5. Réaliser une macro en VBA pour excel afin de créer un graphe
    Par xavier le breuil dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/12/2005, 14h41

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