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 :

Appliquer une formule dynamique dans une boucle [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Electro02
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2018
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Avril 2018
    Messages : 36
    Par défaut Appliquer une formule dynamique dans une boucle
    Bonjour,

    Je débute en VBA Excel et suis autodidacte (pour le moment).
    J'ai beau lire des dizaines de sujets, je n'arrive pas créer une macro parfaitement fonctionnelle... Ce qui je pense sera simple compte-tenu de votre expertise.
    Je m'y perds avec les i, les For, les Next, les While, etc.

    Je dois créer un fichier exploitant une liste de communes.

    Sur une feuille "ETAPE 2," en colonne B (à partir de B3), j'ai une liste des communes.
    La colonne C contient d'autres données, donc la suite se passe en D3.

    Au départ, je veux obtenir en colonne D, la formule suivante, qui fait appel à des données d'autres feuilles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =RECHERCHEV(RECHERCHEV('ETAPE 2'!$B3;'ETAPE 1'!$A$3:$D$1000;4;FAUX);'COMMUNES DE FRANCE'!$E$2:$F$40000;2;FAUX))
    (c'est la formule en D3.)

    Je ne veux pas laisser la formule comme ça, ce qui alourdi fortement le fichier Excel.
    En plus, pour travailler avec, je ne veux pas la formule, mais directement son résultat.

    J'applique donc ce bout de VBA, dans une macro, que j'applique en D3 et en E3, tout simplement car je n'ai pas réussi à convertir cette formule avec deux RECHERCHEV en une seule, en VBA (je ne sais si c'est possible. Si ça l'est, n'hésitez pas à me donner la solution ^^)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Sheets("ETAPE 2")
    .Range("D3").Value = WorksheetFunction.VLookup(.Range("B3").Value, Sheets("ETAPE 1").Range("A3:D1000"), 4, False)
    .Range("E3").Value = WorksheetFunction.VLookup(.Range("D3").Value, Sheets("COMMUNES DE FRANCE").Range("E2:F40000"), 2, False)
    End With
    Ce que je veux :
    Par le biais de la macro, descendre automatiquement la/les formules VLookup (en boucle donc), tant qu'il y a des communes d'indiquées en colonne B, à partir de B3, et en rendant la formule dynamique, c'est à dire en adaptant le début des deux formules (ou de la formule qui vous savez comment la réduire à une seule opération), du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .Range("Dx").Value = WorksheetFunction.VLookup(.Range("Bx")
    .Range("Ex").Value = WorksheetFunction.VLookup(.Range("Dx")
    J'espère que vous aurez compris ma demande, et que vous pourrez rapidement m'aider.

    Merci par avance !

    Philippe

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Bonjour,

    Si tu as bien géré les $ dans ta formule, une fois les première initialisées il te suffit de faire un copier / coller.
    Tu peux récupérer la dernière ligne non vide de la colonne B via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dl=sheets("etape 2").range("B"&rows.count).end(xlup).row
    Et faire ton copier coller:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("D3:E3").copy range("D4:D"&dl)
    Sinon pour ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .Range("Dx").Value = WorksheetFunction.VLookup(.Range("Bx")
    .Range("Ex").Value = WorksheetFunction.VLookup(.Range("Dx")
    tu peux l'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .Range("D"& x).Value = WorksheetFunction.VLookup(.Range("B"& x)
    .Range("E"& x).Value = WorksheetFunction.VLookup(.Range("D"& x)
    avec x ta variable de boucle par exemple, mais attention au recalcul automatique à chaque changement de cellule, il vaut mieux le désactiver sinon ta macro risque d'être longue (ou utiliser le copier coller).

  3. #3
    Membre averti Avatar de Electro02
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2018
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Avril 2018
    Messages : 36
    Par défaut
    Bonjour halaster08,

    Merci pour la première partie de ton message. Ca m'aide un peu mais pas complètement.
    Je ne vois pas l'intérêt d'un copier-coller alors que je veux faire une boucle en fonction du nombre de lignes contenant des données en B.

    Et pour la seconde partie de ton message je n'ai rien compris
    Pourrais-tu stp m'écrire le code complet à mettre dans ma macro, histoire que la comprenne, et que je gagne du temps précieux sur ce projet "urgent" ?

    Car les boucles, et les variables en fonction de la ligne où s'applique la formule à plus ou moins répéter (si on tient compte de l'idée de variables), je n'y comprends pas grand chose encore

    Mais merci en tout cas à toi, qui est le premier à me répondre.

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Citation Envoyé par Electro02 Voir le message
    Je ne vois pas l'intérêt d'un copier-coller alors que je veux faire une boucle en fonction du nombre de lignes contenant des données en B.
    UN copié collé, ou N (N représentant le nombre de lignes) formules a inscrire une par une, a ton avis lequel est le plus rapide ?
    Autant profité des avantages d'Excel, non ?

    Et pour la seconde partie de ton message je n'ai rien compris
    Pourrais-tu stp m'écrire le code complet à mettre dans ma macro, histoire que la comprenne, et que je gagne du temps précieux sur ce projet "urgent" ?

    Car les boucles, et les variables en fonction de la ligne où s'applique la formule à plus ou moins répéter (si on tient compte de l'idée de variables), je n'y comprends pas grand chose encore
    Non je ne ferais pas le travail a ta place.
    Tu souhaite boucler sur tes cellules et modifier la formule suivant le numéro de la ligne, je t'ai montré comment le faire. Ci-dessous un autre exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for x = 1 to 10
    Range("G"& x)= x
    cells(9,x)= x
    next x

  5. #5
    Membre averti Avatar de Electro02
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2018
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Avril 2018
    Messages : 36
    Par défaut
    Je sais très bien pourquoi tu ne veux pas m'écrire le code complet : pour que j'apprenne !
    Et tu as parfaitement raison ! j'ai la même optique.

    Mais en l'état actuel de mes connaissances sur les boucles et les variables, je ne sais pas si je saurai faire ça tout seul.
    Comme je l'indiquai, je débute et j'attends encore une vraie formation (que j'aurai j'espère cette année grâce au patron et au service formation...)

    En général, pour apprendre je récupère des codes déjà écrits, que j'essaie de comprendre avant toute chose.
    Et quand c'est fait, je les adaptent à mes besoins précis.
    J'y arrive le plus souvent, même si parfois je butte des heures jusque parce que j'ai oublié des guillemets, un signe égal ou même juste une fonction.

    On m'a demandé un projet bouclé pour dans quelques jours. J'ai encore pas mal d'étapes à réaliser après celle-ci, et je bloque depuis vendredi sur celle-ci.
    J'ai donc peu de temps et pas forcément les connaissances adéquates...
    J'essaie quand même quelque chose, voir si j'ai compris ce que tu m'as expliqué :

    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
    Sub essai()
     
    Range("D3").Select
    y = Windows(ThisWorkbook.Name).ActiveCell.Row
    Z = Sheets("ETAPE 2").Range("B" & Rows.Count).End(xlUp).Row
     
    With Sheets("ETAPE 2")
    .Range("D" & y).Value = WorksheetFunction.VLookup(.Range("B" & y).Value, Sheets("ETAPE 1").Range("A3:D1000"), 4, False)
    .Range("E" & y).Value = WorksheetFunction.VLookup(.Range("D" & y).Value, Sheets("COMMUNES DE FRANCE").Range("E2:F40000"), 2, False)
    End With
     
    Range("D3").Copy Range("D4:D" & Z)
    Range("E3").Copy Range("E4:E" & Z)
     
    End Sub
    Suis-je sur la bonne voie ?

    Et question importante, puis-je faire en sorte de regrouper les deux formules en une seule (et ainsi éviter une colonne intermédiaire), à partir ce ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =RECHERCHEV(RECHERCHEV(B3;'ETAPE 1'!A3:D1000;4;FAUX);'COMMUNES DE FRANCE'!E2:F40000;2;FAUX))
    Merci à toi (et/ou aux autres membres ^^)

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Un peu d'aide sur les boucles: https://silkyroad.developpez.com/vba/boucles/

    Un exemple de copier coller ou boucle pour mettre une formule, en supposant que tu as des données de A1 à B11:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Macro1()
    'par copier coller
    Range("C1").FormulaR1C1 = "=MAX(RC[-2],RC[-1])"
    Range("C1").Formula = "=MAX(A1,B1)"
    'seule une des deux formules ci dessus est utile a toi de voir celle que tu préfère
    Range("C1").Copy Range("C2:C11")
     
    'par boucle
    For i = 1 To 11
      Range("D" & i).Formula = "=MAX(A" & i & ",B" & i & ")"
    Next i
    End Sub
    Je l'ai fait avec une formule max mais tu peux très bien faire un vlookup.

    edit suite a l'ajout de ton code

    Suis-je sur la bonne voie ?
    A tu testé ton code ? tu obtient quel résultat ? une erreur de compilation ?
    Je ne vois pas d'erreur flagrante même si il y a des amélioration possibles
    Et question importante, puis-je faire en sorte de regrouper les deux formules en une seule (et ainsi éviter une colonne intermédiaire), à partir ce ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =RECHERCHEV(RECHERCHEV(B3;'ETAPE 1'!A31000;4;FAUX);'COMMUNES DE FRANCE'!E2:F40000;2;FAUX))Merci à toi (et/ou aux autres membres ^^)
    Si ta formule fonctionne en excel tu peux demander a l'enregistreur de macro de te la traduire en vba.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("E3:E" & Z).value=Range("F3:F" & Z).value
    Interesses toi à la fonction evaluate.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("F3:F" & Z).value=evaluate("VLOOKUP")
    Dernière modification par Invité ; 05/06/2018 à 18h31.

  8. #8
    Membre averti Avatar de Electro02
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2018
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Avril 2018
    Messages : 36
    Par défaut
    Merci dysorthographie.

    Je ne connais pas la fonction evaluate.
    Je vais regarder à ça.

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

Discussions similaires

  1. Liste dynamique dans une formule
    Par dawaman dans le forum Excel
    Réponses: 3
    Dernier message: 30/10/2014, 16h49
  2. [AC-2010] Déclaration d'une variable "dynamique" dans une boucle
    Par docjo dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/11/2013, 23h08
  3. [Toutes versions] Utilisation formules dynamiques dans une boucle
    Par diby88 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 04/04/2013, 16h34
  4. Réponses: 8
    Dernier message: 26/03/2010, 08h16
  5. Réponses: 6
    Dernier message: 13/11/2009, 16h06

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