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 :

Etirer une formule sur la droite Macro [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    contrôleur gestion
    Inscrit en
    Septembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : contrôleur gestion

    Informations forums :
    Inscription : Septembre 2014
    Messages : 55
    Points : 29
    Points
    29
    Par défaut Etirer une formule sur la droite Macro
    Bonjour,

    Je reviens vers vous pour adapter une ligne de code formidable qui permet d'intégrer dans une colonne n'importe quelle formule (ici, recherche V sur colonne B) jusqu'à la dernière cellule de la colonne d'une base de données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B5:B" & Range("A" & Cells.Rows.Count).End(xlUp).Row).FormulaR1C1 = "=VLOOKUP(RC[-1],STRUCT,6,FALSE)"
    Mon problème est que je voudrais faire la même chose mais sur la 1ere ligne de ma base de donnée. l'objectif étant d'étirer ma formule de la cellule B1 à la dernière cellule de la ligne 1 de la base de données. Je tente d'adapter le code mais ça bug systématiquement (remplacement de: End(x1up) par End(x1to left), de Row par Column, de "B5:B" par "B1:1"..........

    Si quelqu'un avait une idée pour adapter ce code ?...

    M75

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par morgan75 Voir le message
    Mon problème est que je voudrais faire la même chose mais sur la 1ere ligne de ma base de donnée. l'objectif étant d'étirer ma formule de la cellule B1 à la dernière cellule de la ligne 1 de la base de données.
    Ce sera relativement facile à faire lorsque tu auras répondu à la question suivante :
    Qu'est-ce qui indique la limite à droite de ta base de données ?

    Par exemple, pour ta première macro, la limite de ta base de données vers le bas était la dernière cellule non vide de la colonne A.
    Il faudrait une balise équivalente pour la limite à droite.

  3. #3
    Membre émérite Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Points : 2 439
    Points
    2 439
    Par défaut
    A la main c'est tout aussi rapide.

    Je sélectionne de la cellule A1 à Z1 par exemple. Ensuite Ctrl + d et la formule en A1 est copiée jusque Z1 (attention aux $ dans la formule)
    Ça marche aussi avec plusieurs lignes. Exemple avec A1:Z10 la formule en A1 est copiée de A1 à Z1, celle en A2 l'est de A2 à Z2, ect.

    PS : le raccourcis Ctrl + b est identique mais vers le bas

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    contrôleur gestion
    Inscrit en
    Septembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : contrôleur gestion

    Informations forums :
    Inscription : Septembre 2014
    Messages : 55
    Points : 29
    Points
    29
    Par défaut
    Bonjour Menhir,

    Le problème est donc le bornage de la BD. Je dirais que la limite de la base de données correspond à la dernière cellule non vide des lignes qui sont en dessous de la 1ère ligne. J'accompagne mon explication nébuleuse d'une impression d'ecran de mon état, surligné en vert la zone ou le script macro doit copier la formule. Dans le cas présent, la dernière valeur de la base de données s'observe sur la cellule K19 donc la macro doit générer des formules jusqu'à K1. Sachant que cette base est variable ( 365 valeurs max par ligne).

    formule ligne.docx

  5. #5
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Je n'ouvre pas les pièces jointes.
    En supposant que la ligne de référence pour la limite des colonnes soit la ligne 19 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B1", Cells(19, Columns.Count).End(xlToLeft).Row).FormulaR1C1 = ... formule ...

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    contrôleur gestion
    Inscrit en
    Septembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : contrôleur gestion

    Informations forums :
    Inscription : Septembre 2014
    Messages : 55
    Points : 29
    Points
    29
    Par défaut
    J'ai rencontré un problème avec la formule que tu m'as envoyé Menhir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B1", Cells(19, Columns.Count).End(xlToLeft).Row).FormulaR1C1 = "=R[1]C"
    il s'agit de l'erreur d'execution 1004 ...la méthode Range de l'objet-Global a échoué

    D'autre part en indiquant que la formule doit s'arrêter à la ligne 19, ca rend le script trop peu flexible vu que la base de donnée chargée est de taille variable.

  7. #7
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par morgan75 Voir le message
    J'ai rencontré un problème avec la formule que tu m'as envoyé Menhir
    Range("B1", Cells(19, Columns.Count).End(xlToLeft).Row).FormulaR1C1 = "=R[1]C"
    il s'agit de l'erreur d'execution 1004 ...la méthode Range de l'objet-Global a échoué
    J'avais oublié un niveau de Cells
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B1", Cells(1, Cells(19, Columns.Count).End(xlToLeft).Row)).FormulaR1C1 = "=R[1]C"
    D'autre part en indiquant que la formule doit s'arrêter à la ligne 19, ca rend le script trop peu flexible vu que la base de donnée chargée est de taille variable.
    Je n'ai pas dit que ça s'arrêtait à la ligne 19 mais que ça ne recherchait la limite que sur le ligne 19.
    Si ce n'est pas ce que tu souhaites, écris une règle plus claire que celle de ton message #4.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    contrôleur gestion
    Inscrit en
    Septembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : contrôleur gestion

    Informations forums :
    Inscription : Septembre 2014
    Messages : 55
    Points : 29
    Points
    29
    Par défaut
    Merci Menhir, la formule marche parfaitement dans le cas particulier ou la base de données enregistre ça dernière valeur dans la colonne S (19 ème colonne), mais l'utilisateur peut charger une nouvelle base de données pour laquelle la dernière valeur peut être enregistrée sur une cellule de n'importe quelle colonne.

    Cette plasticité existait (mais verticalement) avec le script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B5:B" & Range("A" & Cells.Rows.Count).End(xlUp).Row).FormulaR1C1 = "=VLOOKUP(RC[-1],STRUCT,6,FALSE)"
    J'espère avoir pu clarifier ma recherche.

  9. #9
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par morgan75 Voir le message
    Merci Menhir, la formule marche parfaitement dans le cas particulier ou la base de données enregistre ça dernière valeur dans la colonne S (19 ème colonne),
    Dans la formule que j'ai donnée, c'est la 19è LIGNE qui est scrutée pour établir la colonne limite et non pas la 19è LIGNE.

    mais l'utilisateur peut charger une nouvelle base de données pour laquelle la dernière valeur peut être enregistrée sur une cellule de n'importe quelle colonne.
    Dans ce cas, au lieux d'utiliser la propriété End (qui ne s'applique qu'à une ligne ou une colonne), il faut que tu utilises UsedRange.Rows.Count.
    https://msdn.microsoft.com/fr-fr/lib.../ff840732.aspx

    Cette plasticité existait (mais verticalement) avec le script: Range("B5:B" & Range("A" & Cells.Rows.Count).End(xlUp).Row).FormulaR1C1 = "=VLOOKUP(RC[-1],STRUCT,6,FALSE)"
    Non, il n'y a pas plus de "plasticité" dans cette formule que dans la mienne.
    La limite est fixée par la colonne A et elle seule.
    Si, par exemple, tu effaces les dernières valeurs de la colonne A (d'où le Range("A"...) ou que tu ralonges la colonne C, tu verras que ta formule de s'adaptera pas à la colonne C (ou autre), elle continuera de prendre A en référence.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    contrôleur gestion
    Inscrit en
    Septembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : contrôleur gestion

    Informations forums :
    Inscription : Septembre 2014
    Messages : 55
    Points : 29
    Points
    29
    Par défaut
    Merci Menhir pour l'adaptation du code. J'ai intégré un test logique dans la formule pour déterminer si la colonne contenait ou non des valeurs ce qui conditionne la valeur des cellules de la ligne 1 après il suffit juste d'utiliser la fonction remplacer pour redimensionner le tableau "current région".

    Encore merci

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

Discussions similaires

  1. [XL-2007] Création macro pour répéter une formule sur plusieurs lignes
    Par maxpj dans le forum Excel
    Réponses: 1
    Dernier message: 11/12/2015, 19h45
  2. [LibreOffice][Tableur] [Macro] Implémenter une formule sur un zone
    Par madvic dans le forum OpenOffice & LibreOffice
    Réponses: 1
    Dernier message: 04/12/2014, 10h47
  3. [XL-2010] Création macro pour répéter une formule sur plusieurs lignes
    Par JoOz-ZeP43 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/10/2014, 18h06
  4. Réponses: 4
    Dernier message: 10/07/2007, 11h24
  5. Réponses: 3
    Dernier message: 05/10/2005, 18h02

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