Formule de propagation dans une colonne entière

Bonjour à tous,

Je ne sais pas si je procède la bonne manière, donc mes excuses si c'est pas le cas.

J'avais demandé dans mon topic ( https://forum.excel-pratique.com/excel/repetition-formule-pour-tableau-avec-nombre-de-lignes-aleatoi... )précédent comment je pouvais faire qu'une formule se répète dans une colonne entière.

L'aide qui m'a été apportée a été très pertinente, et j'ai pu m'en servir, cependant, mon responsable est un peu gourmand, et voudrait que cela soit fait en VBA.

En creusant, j'ai trouvé sur le forum un topic (https://forum.excel-pratique.com/excel/macro-appliquer-une-formule-dans-une-colonne-95822) qui m'a aiguillé, cependant, je rencontre un problème que je n'arrive pas à solutionner.

Quelqu'un pourrait-il éclairer ma lanterne sur pourquoi mon code bute à ce moment là?

'Affichage onglet de comparaison avec formules

    Dim DL As Integer

    Sheets("Comparatif").Activate

    DL = Cells(Application.Rows.Count, "A").End(xlUp).Row

    Sheets("Comparatif").Range("A4").Select
    Range("A4").FormulaR1C1 = "=IF(ISERROR(VLOOKUP(OBJET_N!R[-2]C,'OBJET_N-1'!C1,1,0)),""NOUVEAU OBJET"",""OBJET EXISTANT EN ANNEE N-1"")"
    Range("A4").AutoFill Destination:=Range("A4:A" & DL), Type:=xlFillDefault

Ce bout de code s'exécute à la suite d'autres opération, et bloque à cet endroit là:

Range("A4").AutoFill Destination:=Range("A4:A" & DL), Type:=xlFillDefault

J'ai bien essayé différente méthode, mais je sèche.

Comment pourrais-je réussir pour que ma formule se propage dans toute la colonne (et ensuite appliquer cela à toutes les autres colonnes nécessitant une formule)?

J'attache à nouveau le fichier que j'avais transmis dans le topic précédent

Il est déjà prérempli avec des données, mais il y'a le vba que j'ai indiqué dans mon message.

Merci pour votre aide

bonjour,

voici une proposition de correction de ton code (année au lieu de objet dans le nom de la feuille)

    Dim DL As Long

    With Sheets("Comparatif")

        DL = .Cells(Rows.Count, 2).End(xlUp).Row

        .Range("A4").FormulaR1C1 = "=IF(ISERROR(VLOOKUP(Année_N!R[-2]C,'Année_N-1'!C1,1,0)),""NOUVEAU OBJET"",""OBJET EXISTANT EN ANNEE N-1"")"
        .Range("A4").AutoFill Destination:=.Range("A4:A" & DL), Type:=xlFillDefault
    End With

Un petit problème cependant, le code a pour objectif de copier en colonne A une formule dans un nombre de cellules (DL) qui est déterminé par le nombre de cellules non-vides en colonne A. Cela ne me semble pas correct. A toi de voir si le problème que tu mentionnes, dont on doit deviner la nature, est résolu.

Hello,

Merci @h2so4, et désolé pour le manque d'informations.

Ma problématique est que je dois comparer des données (celles présentes dans les deux onglets du fichier (année N et année N-1)) or, le nombre de lignes à comparer n'est pas fixe et je ne sais pas par avance combien de lignes je vais avoir, je voulais donc propager une formule (une formule par colonne) dans chaque colonne respective afin de couvrir l'intégralité des lignes présentes dans les onglets.

Je ne sais pas si ça permet d'éclairer ta lanterne, mais je vais tester la correction que tu m'as proposé.

Merci

@h2so4 Merci encore pour ton aide. La correction que tu as proposé recopie effectivement ma formule, cependant, elle ne la recopie que sur 3 lignes en écrasant la mise en forme du tableau car je ne comprends pas pourquoi, elle attaque à la ligne 2 alors que d'après la formule, elle devrait commencer à la ligne 4

bonjour,

le nombre de lignes à comparer n'est pas fixe et je ne sais pas par avance combien de lignes je vais avoir

tu ne sais pas à l'avance sur combien de lignes tu devras copier la formule, mais tu détermines la dernière ligne sur laquelle copier ta formule sur base du tableau contenant les formules à copier (cela ressemble à une autoréférence). De plus si la dernière ligne est 1 la formule sera copiée de la ligne 4 à la ligne 1, écrasant tes mises en forme de titre. ton code donne toujours 1 comme valeur à DL, d'où le problème que tu rencontres. Ma correction évite au moins ce problème.

@h2so4 j'ai mis un peu de temps à comprendre ton post, mais je pense avoir saisi ce que tu souhaitais m'expliquer, mais merci pour le temps que tu as pris

Si j'ai bien compris, tu me dis qu'en précisant que la dernière ligne est à 1, forcément, il va partir de ma cellule active et remonter, c'est bien cela?

Je suis novice en vba, donc je récupère ce que je peux ici et là, et je tatone, ce qui peux expliquer pourquoi j'ai des bouts de code qui ne sont pas forcément au top

bonjour,

je vais essayer d'être plus clair.

dans ton code, il y a une instruction qui détermine le numéro de la dernière ligne (DL), dans ton code cette instruction donne toujours 1 comme valeur pour DL.

ensuite tu as une instruction pour recopier une formule dans la plage A4:A & dl , donc dans la plage A4:A1 qu'excel comprend comme étant la plage A1:A4, raison pour laquelle les cellules en A1:A3 sont écrasées.

En principe, le bout de code que j'ai mis corrige la valeur incorrecte pour DL, ainsi que le problème de référence aux feuilles Année.

Si ton code qui se trouve dans le module d'une feuille active d'autres feuilles, cela pose potentiellement des problèmes. DL reçoit toujours la valeur 1 car ton code est dans le module de la feuille accueil dont la dernière cellule active en colonne A est 1.

Pour pallier ce problème, soit on utilise un module distinct des feuilles (un module de code), soit on ajoute la référence à la feuille qui nous intéresse lorsqu'on mentionne une cellule.

exemple sheets("Comparatif").cells(rows.count,"A").end(xlup).row au lieu de cells(rows.count,"A").end(xlup).row

Hello,

Merci pour le temps que tu as pris pour les explications @h2so4.

Mes connaissances et compétences en Visual Basic sont basiques et ultra rudimentaires, du coup je tâtonne jusqu'à ce que ça fonctionne, et des fois ça fonctionne, et des fois, pas du tout (comme sur ce cas là en l'occurrence).

Je comprends mieux maintenant, pourquoi, ça ne fonctionnait pas.

En me servant de ton code, de tes explications, et de quelques recherches supplémentaires, j'ai corrigé ma fonction et j'en suis arrivé à cela:

 With Worksheets("Comparatif")

    .Range("A4").Formula = "=IF(ISERROR(VLOOKUP(ANNEE_N!R[-2]C,'ANNEE_N-1'!C1,1,0)),""NOUVEAU OBJET"",""OBJET EXISTANT EN ANNEE N-1"")"

    .Range("A4:K4").Select
    Selection.AutoFill Destination:=.Range("A4:K" + derniereLigne), Type:=xlFillDefault

End With

Le range de l'AutoFill va jusqu'à la colonne "K", mais parce que j'ai des formules dans toutes les colonnes jusqu'à la colonne "K".

Quoiqu'il en soit, maintenant ça fonctionne parfaitement, mes formules apparaissent bien dans leur colonne respectives et sont ensuite propagées dans l'intégralité de la colonne à partir du moment où il y'a du contenu.

Merci encore pour le temps que tu as pris pour les réponses.

Hellspawn

Rechercher des sujets similaires à "formule propagation colonne entiere"