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 :

Transformer formule matricielle en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Par défaut Transformer formule matricielle en VBA
    Bonjour à tous,

    J'ai la formule matricielle suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =INDEX(LIBS;MIN(SI((MATS=B2)*(DEBS<=A2)*(FINS>=A2);LIGNE(MATS))))
    Que je dois appliquer sur plus de 500 000 lignes. Autant dire qu'en terme de performance ça n'y est pas du tout, et que Excel a du mal à aller au bout du calcul.

    Je ne m'y connais pas beaucoup en VBA, mais je sais que pour ce genre de calcul ça pourrait améliorer la vitesse du calcul, d'où ma question : Est-il possible de transformer cette formule en VBA, et si oui de quelle manière ? Un simple FORMULA peut suffire ou bien il faut carrément adapter le code ?

    Bien à vous,

    Sardaucar

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    la propriété formula permet de manipuler ... une formule

    la propriété formulaArray devrait t'intéresser, pour des formules matricielles

    n'hésite pas à regarder l'aide en ligne


    je suis sur un fichier où justement j'écris des formules matricielles avec INDEX réalisé sur un tableau structuré (ListObject dont le nom est contenant dans la variable RefTableau), si ça peut te donner un objectif à atteindre et comprendre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cell.FormulaArray = "=INDEX(" & RefTableau & "[ID],MATCH(CONCATENATE(RC[13],RC[14],RC[11]),CONCATENATE(" & RefTableau & "[MEDIA]," & RefTableau & "[MASTER_ITEM]," & RefTableau & "[ITEM]),0))"
    La formule est en référence relative R1C1
    Attention : pas plus de 255 caractères ... sinon il faut ruser et découper sa formule en plusieurs portions pour ensuite la reconstituer

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Par défaut
    Donc, avec tes explications, j'ai tenté la sub suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub test()
     
    Dim i As Integer
     
    For i = 2 To 10
     
     
               Cells(i, 7).FormulaArray = "=INDEX(" & LIBS & ";MIN(IF((" & MATS & "=B2)*(" & DEBS & "<=A2)*(" & FINS & ">=A2);ROW(" & MATS & "))))"
     
    Next
     
    End Sub
    Mais j'ai une erreur sur la classe range de la propriété formula Array :/.

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    MATS, LIBS et compagnie, sont des "mots" écrit dans ta formule (des plages nommées ?), et pas des variables
    elles doivent donc être incluses à l'intérieur des guillemets

    là, VBA te dis en gros "moi je connais pas les plages qui s'appelles MATS, LIBS etc..."

    de plus, comme on le voit dans mon exemple, il faut écrire "à l'anglaise" :

    - le nom des formules
    - les séparateurs (en anglais, c'est la virugle qui sépare, et pas le point virgule)

    donc, grosso modo, tu t'es compliqué la vie pour rien
    à main levé, ça devrait ressembler à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(i, 7).FormulaArray = "=INDEX(LIBS,MIN(IF((MATS=B2)*(DEBS<=A2)*(FINS>=A2),ROW(MATS))))"

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,

    Ecrire la formule matricielle avec du VBA ne va pas améliorer la vitesse d'exécution.

    Boisgontier

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Par défaut
    Ha bon ? Quelle serait la méthode alors ?

    PS: Effectivement la correction fonctionne mais pas vraiment de gain de performance, j'ai bien conscience que le fichier est mal fichu, mais malheureusement je n'ai pas la main sur la manière dont m'arrivent les données, je dois donc faire avec

  7. #7
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    C'est clair que ça ne changera pas grand chose ! A la rigueur, on peut injecter toutes les formules et les évaluer en une fois plutôt que de faire de l'évaluation à chaque ajout d'une formule.

    500 000 formules matricielles, c'est de toute façon constater que la conception du fichier est à revoir, mais ce n'était pas la question de cette discussion

  8. #8
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Il y en a qui vont dire que le vieux radote, mais, Excel a constamment besoin de tous ses classeurs ouverts en mémoire vive en tout temps. Et les formules matricielles sont ce qui bouffe le plus de mémoire. Et Excel se bat contre un paquet de services et autres conneries qui se prétendent tous indispensables, comme la recherche quotidienne de mises à jour pour des programmes qui sont mis à jour une fois par année.

    Et puis Excel n'est pas Access junior. Tant que ton employeur sera trop stupide pour s'équiper comme du monde, laisse courir. Quand le classeur va être corrompu après un plantage magistral, il y a peut-être quelqu'un qui va penser avec sa tête au Service de Dictature informatique.

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Par défaut
    Donc tu préconise de passer par Access pour traiter ces données ? Avec deux tables distinctes et une requête de jointure ?

  10. #10
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Je ne suis pas devin. Mais je reste convaincu qu'Excel est probablement la pire solution. À moins que de refaire le fichier Excel autrement corrige le problème.

    Mais, mon opinion personnelle, c'est que c'est un problème de mémoire et tant que tu auras à zigonner avec 600 000 lignes, tu seras dans le trouble.

    Access a au moins l'avantage de pouvoir travailler avec seulement des portions de fichiers en mémoire, au lieu de fichiers complets.

  11. #11
    Membre confirmé
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Par défaut
    Après avoir écouté le vieux sage, j'ai importé mes feuilles dans Access, et un traitement par requête en jointure gauche + critère m'a permis de faire ce que je voulais, un grand merci !

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

Discussions similaires

  1. [XL-2010] Transformation formule en code vba
    Par r.morel dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 04/09/2014, 18h06
  2. [XL-2010] Formule matricielle et VBA
    Par zaza45 dans le forum Excel
    Réponses: 2
    Dernier message: 24/09/2013, 17h38
  3. vba - problème enregistrement de formule matricielle
    Par philppe27 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/02/2012, 18h41
  4. [XL-2003] Formule matricielle en VBA
    Par jackall dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/06/2009, 12h24
  5. [VBA-E] - formule matricielle
    Par jimbololo dans le forum Macros et VBA Excel
    Réponses: 37
    Dernier message: 09/06/2006, 15h27

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