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 :

Formulations comparées VBA [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut Formulations comparées VBA
    bonjour à tous,

    je progresse très difficilement en VBA et souvent il m'arrive de penser que les concepteurs de VBA ont complexifiés les choses pour le seul plaisir d'empoisonner la vie du développeur.

    je donne ci dessous un exemple des différentes écritures de la fonction countif telles qu'il m'a été donné de les trouver dans divers codes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub Macro2()
        Range("C2").Select
        ActiveCell.FormulaR1C1 = "=countif(RC[-2]:R[8]C[-2],R[-1]C[-1])"
        'peut être également écrite avec ActiveCell.Formula et autres dérivées
     
        [c3] = Evaluate("countif(a2:a10,b1)")
        [c4] = [countif(a2:a10,b1)]  'autre écriture d'evaluate
     
        [c5] = WorksheetFunction.CountIf([a2:a10], [b1])
     
        [c6] = Application.CountIf([a2:a10], [b1])
    End Sub
    quelqu'un peut-il m'expliquer la raison de ces différentes écritures et ce qui fait qu'on privilégiera l'une plutôt que l'autre ?
    evaluate (seconde écriture) est la plus proche de la formulation sur feuille Excel et donc moins perturbante.
    Mais est-elle applicable à toutes les formules logées directement sur la feuille Excel ?

    Pour ce qui me concerne, la première formulation est la plus indigeste.

    Cordialement.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonjour,

    2 types d'instructions sont à distinguer, car elles ne produisent pas le même résultat
    (même si la valeur affichée dans la cellule est la même)
    - L'instruction ActiveCell.FormulaR1C1 = "=countif(RC[-2]:R[8]C[-2],R[-1]C[-1])" ajoute une formule dans la cellule.
    Donc si les cellules dont la formule dépend changent, le résultat de la formule changera, et la valeur affichée dans la cellule aussi.

    - Les instructions suivantes, calcule le résultat, et stocke le résultat (pas la formule) dans la cellule.
    Donc si la valeur des cellules utilisées changes, le résultat affiché dans la cellule ne se mettra PAS à jour.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       Evaluate("countif(a2:a10,b1)")
       WorksheetFunction.CountIf([a2:a10], [b1])
       Application.CountIf([a2:a10], [b1])
    L'instruction [countif(a2:a10,b1)] ne fonctionne pas chez moi. (XLS2010 français).

    Pour ce qui est de =Evaluate(<formule>) elle permet de calculer le résultat d'une formule Excel, où les formules sont en langue anglaise.
    ex : Il faut écrire =Evaluate("SUM(A1:A10)") pas =Evaluate("SOMME(A1:A10)") .
    Plus d'infos sur : MSDN Evaluate

    Quand à la multiplicité des possibilités d'écriture, il faut le voir comme une souplesse, plutôt qu'une complication.
    En effet, suivant que les formules doivent être exprimée :
    - en cellule absolue, ou relative,
    - en notation L1C1 ou A1
    - par insertion de formule dans la cellule, ou du résultat directement
    on écrira pas la même chose.

    A+

  3. #3
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut formulations comparées VBA
    Bonsoir BlueMonkey,

    merci pour tes précisions.

    j'avais en effet remarqué que formula.... écrivait la formule dans la feuille Excel. En ceci, elle se distingue des autres formulations.
    Toutefois, en dehors du cas ou la formule doit figurer dans une colonne lambda d'une feuille Excel au nombre de lignes évolutif (introduction de données), je ne vois pas qu'elle ait un avantage déterminant sur les autres formulations.
    la somme d'une colonne, par exemple, s’accommodera très bien d'un 'evaluate' ou 'application' à la dernière ligne offset+1 de la colonne à additionner.
    dans mon exemple countif cela implique que l'emplacement de la formule est déterminé par rapport à ses antécédents. Par conséquent, autant l'écrire directement dans la feuille Excel et ne pas encombrer le code.
    mais sans doute existe-t-il des cas que je n'imagine pas présentement et que l'usage me fera découvrir.

    je suis étonné que la formulation countif entre crochet ne fonctionne pas sur votre version 2010 (même version que moi). Dans le doute, j'ai refait plusieurs tests, tous probants.
    j'ai même remplacé à titre d'essai countif par [sum(A1:A10)] ou [sum(nom de plage)] en gardant bien uniquement les crochets et les parenthèses nécessaires (ni accolades ni guillemets) avec le résultat attendu.

    Sauf erreur de ma part la formulation en langue anglaise est vrai pour tous les types de formulations. Et c'est plutôt un avantage si l'on considère que le risque serait grand de se retrouver avec une variable portant le même non qu'un fonction française.

    J'ai bien regardé le site que vous m'avez indiqué.

    il ne me reste plus qu'à réfléchir à la formulation la plus appropriée à chaque fois que j'aurai à utiliser une fonction de feuille Excel.

    pour l'heure, je m'arrache les cheveux avec les variables tableaux et la fonction transpose nécessaires dans certain cas. et ce, même après la lecture attentive de l'excellent tutoriel de Didier Gonard. On a beau dire mais mais l'age est un poison pour les neurones.

    cordialement.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut Correction sur [countif(a2:a10,b1)]
    Bonsoir,

    J'ai refais un essais avec [countif(a2:a10,b1)] et j'ai eu un résultat correct.
    Je devais avoir un problème de format dans mes cellule de test.

    A vérifier, mais je pense que l'appel à la fonction directement est plus rapide qu'un Evalute de la même fonction.
    Ca se verra surtout si la fonction est appelé en boucle.

    Bonne soirée.

  5. #5
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut formulations comparées VBA
    re....,

    je viens de découvrir que certaines fonctions de la feuille Excel n’étaient pas compatibles avec worksheetfunction.
    Par exemple, alors que worksheetfunction gère countif il ne gère pas if. ce qui est pour le moins étonnant et tend à confirmer mon propos de départ sur les complications inutiles. Pourquoi ne pas gérer avec worksheetfunction toutes les fonctions de la feuille excel ?
    Cela oblige à en passer par une autre formulation telle que formula.. beaucoup moins intuitives avec ces double guillemets et autres complexités. il reste à espérer qu'elle au moins accepte toutes les fonctions de la feuille Excel car la mémoire (la mienne en tout cas) ne permet pas de retenir que telle ou telle fonction n'est pas prise en compte par telle ou telle formulation.

    Est-ce formula.... que tu évoques par "à vérifier mais je pense ......". Si c'est le cas, je suis mal car c'est précisément fonction dont la syntaxe me pose problème et je n'ai pour l'heure trouvé aucun document explicatif.
    J'ai même insisté sur ce site pour obtenir ces explications mais sans résultat. Peut-être les autres membres sont-ils comme moi un peu perdu avec cette formulation!

    cordialement.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Re,

    Certaines fonctions ne font pas partie de l'ensemble WorksheetFunction.
    Le cas du IF ne présente pas beaucoup d'intérêts. En effet si le but est de faire un test, pourquoi vouloir écrire
    WorksheetFunction.If(<condition>,<si vrai>,<si faux),
    alors que les expressions prévues dans le langage fond le travail plus rapidement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If <condition> Then  
       <si vrai>
    Else
       <si faux>
    End IF
    ou bien IIF <condition>,<si vrai>,<si faux> pour une écriture compacte.

    Ce que je n'ai pas vérifié c'est la comparaison du temps de calcul d'un
    Evaluate("=SUM(A1:A100)") par rapport à un WorksheetFunction.Sum(Range("A1:A100")).

    Pour la doc sur Formula, il suffit de surligner la fonction dans le code VBA puis d'appuyer sur <F1> pour avoir l'aide sur la fonction.
    ou bien voir l'aide en ligne MSDN Formula

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

Discussions similaires

  1. [VBA-E]Formules en VBA?
    Par dev81 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/06/2007, 20h55
  2. [VBA-E] ecrire une formule en vba
    Par Huubb dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 25/01/2007, 14h15
  3. tirage formules en VBA avec excel
    Par melodyyy dans le forum Macros et VBA Excel
    Réponses: 46
    Dernier message: 23/11/2006, 18h33
  4. Paramétrer une formule en vba
    Par arnogef dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/08/2006, 11h48
  5. Copier une formule avec vba
    Par NAMORJOSE dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/05/2006, 00h12

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