VBA Excel: Etendre une formule jusqu'à la dernière ligne [Résolu/Fermé]

Signaler
-
Messages postés
20
Date d'inscription
mardi 26 août 2008
Statut
Membre
Dernière intervention
18 août 2014
-
Bonjour,

Je cherche tout simplement un code VBA pour étendre une formule automatiquement de la cellule C6 à la dernière de la ligne sans la citer.
Actuellement, le code suivant fonctionne très bien:

Range("C6").Select

Selection.Autofill Destination:=Range("C6:C450")

Mais comme la dernière cellule n'est pas tjr la 450ème, j'aimerais qu'il la définisse automatiquement et au coup par coup.

Merci à vous!


4 réponses

Messages postés
12182
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2020
2 457
Bon.
Il nous suffit donc maintenant, de remplacer dans
Destination:=Range("C6:C450")
, 450 par la variable DernLigne.
Profitons en pour supprimer ces .Select et autres Selection inutiles...
Exemple :
Dim DernLigne As Long

DernLigne = Range("C" & Rows.Count).End(xlUp).Row
Range("C6").AutoFill Destination:=Range("C6:C" & DernLigne)


Auparavant, cependant, on cherche depuis tout à l'heure la dernière ligne non vide de la colonne C. Or, dans la colonne C, on cherche à remplir de formule... Donc, pour l'instant, la colonne C ne contient rien, si je ne m'abuse... Donc, cela n'a pas de sens de chercher la dernière ligne non vide de la colonne C.
10
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 57476 internautes nous ont dit merci ce mois-ci

Bonjour,

Je vous remercie pour votre retour.

Je viens de teste le nouveau code et... ça fonctionne!!! Ce qui me semblait être une formalité s'est avéré un peu plus complexe au vu du nombre d'échanges postés.
A présent, je ne parviens pas à l'intégrer dans mon code général, mais cela est une autre histoire. A moins que ça vous tente??

Je vous en remercie encore !
Je développe au cas où: il s'agit en fait d'insérer le code d'extension de formule trouvé ci-dessus dans le code suivant, en remplacement de la fameuse ligne Selection.AutoFill Destination:=Range("C6:C450"):

Sub Sans_score11()
'
Application.ScreenUpdating = False
Sheets(4).Select
For i = 4 To Sheets.Count
Sheets(i).Select (False)
Next
Columns("C:C").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("C5").Select
ActiveCell.FormulaR1C1 = "Sans score"
Range("C6").Select
ActiveCell.FormulaR1C1 = "=(COUNTIF(RC[9],""*score*"")"
Range("C6").Select
Selection.AutoFill Destination:=Range("C6:C450")
Range("C6").Select
Sheets(1).Select
Application.ScreenUpdating = True

End Sub

Concrètement, lorsque je la remplace par les lignes 4 et 5 du code proposé en solution, la formule s'étend sur la feuille Excel active mais pas sur les autres, alors que le reste du code est bien appliqué. Peut-être l'ai-je placé au mauvais endroit??

Merci
Messages postés
12182
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2020
2 457
Nous allons donc reprendre tout ça.

1-
Application.ScreenUpdating = False
Tu ne touches pas, c'est bien. Cela permet de ne pas rafraichir l'écran pendant la macro.

2-
Sheets(4).Select
Sélectionne la feuille 4. Utilité???? Je ne vois pas

3-
For i = 4 To Sheets.Count
Sheets(i).Select (False)
Next
Boucle sur toutes les feuilles du classeur, à partir de la feuille 4, sans les sélectionner. Utilité? Aucune je pense.

4-
Columns("C:C").Select    
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

Peut être remplacé par :
Columns("C:C").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove


5-
Range("C5").Select
    ActiveCell.FormulaR1C1 = "Sans score"

Peut être remplacé par :
Range("C5").FormulaR1C1 = "Sans score"


6-
Range("C6").Select
    ActiveCell.FormulaR1C1 = "=(COUNTIF(RC[9],""*score*"")"

Cette formule coince à cause du R dans RC[9].
Qu'elle est ta formule exacte, telle qu'elle serait si tu la mettais directement dans une cellule excel, sans passer par VBA. (ex : = NB.SI(L:L;"score")
Merci pour les suggestions.
Afin de mieux vous faire comprendre le code, je vous en donne l'objectif: insérer, dans chaque onglet à partir du 4ème, une colonne dans laquelle on appliquera la formule qui comptera les cellules dans lesquelles se trouvera la mention "score" (=nb.si(L:L;"*score*") qui n'a pas fonctionné lors de votre test car j'ai mis une parenthèse en trop avant COUNTIF), que l'on étendra aux cellules suivantes de la colonne C du tableau.
Jusqu'ici, tout a fonctionné correctement avec le code présenté.
Il me faut à présent y intégrer le code que vous m'avez proposé afin qu'il entre dans la boucle.

Merci!
Messages postés
20
Date d'inscription
mardi 26 août 2008
Statut
Membre
Dernière intervention
18 août 2014

Bonjour, cette formule correspond à mes attentes au seul détail prêt, que je voudrais que le collage se fasse une ligne sur deux.
Cdlt
Messages postés
12182
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2020
2 457
Voici un code, qui devrait fonctionner, A ADAPTER, lis bien les commentaires...

Sub Sans_score11()
Dim i As Integer, drLig As Long

Application.ScreenUpdating = False
  
  'boucle de 4 au nombre de feuilles du classeur
  For i = 4 To Sheets.Count
    'dans la feuille numéro i
    With Sheets(i)
      'on insère une colonne entre B et C
      .Columns("C:C").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
      'on y inscrit "Sans score" en C5
      .Range("C5").Value = "Sans score"
      'On inscrit la formule en C6
      .Range("C6").FormulaR1C1 = "=COUNTIF(C[9],""*score*"")"
      
      '*******************************************************************************************
      'Ici, tu dois déterminer qu'elle est la colonne te permettant de trouver
      'la dernière ligne.
      'La colonne C, nouvellement créée, se termine en C6. Donc pas valable
      'La colonne B? L?, à toi de voir et de remplacer dans la ligne suivante :
      '*******************************************************************************************
      drLig = .Range("B" & Rows.Count).End(xlUp).Row
      
      
      'si drLig est inférieure ou égale à 6 la méthode autofill va planter
      'donc on teste drLig
      If drLig <= 6 Then
        'si drLig est inférieur ou égal à 6, message à l'utilisateur :
        MsgBox "La dernière ligne non vide de cette colonne (feuille " & i & ") est inférieure ou égale à 6. Merci de vérifier"
        'on sélectionne la feuille incriminée
        Sheets(i).Select
        'on stoppe et sort de la procédure
        Exit Sub
      Else 'SINON on applique l'autofill
        .Range("C6").AutoFill Destination:=.Range("C6:C" & drLig)
      End If
    End With
  Next i
Application.ScreenUpdating = True
End Sub
Merci pour le code, qui fonctionne à merveille!

Et si tu souhaites relever de nouveaux défis de ce type, j'en ai quelques autres (du même niveau je pense)!

Merci encore!
Messages postés
12182
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2020
2 457
Et si tu souhaites relever de nouveaux défis de ce type, j'en ai quelques autres (du même niveau je pense)!

ça dépends. C'est pour l'école?
Non, je ne suis pas étudiante, et encore moins en informatique, sinon je n'aurais pas de telles difficultés.
C'est simplement pour m'épargner des tâches fastidieuses en utilisant à bon escient les outils créés à cette fin. Mais pour cela, il faut des connaissances que j'essaye d'acquérir, en attendant, je viens sur ce forum.
Messages postés
12182
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2020
2 457
Il faut des connaissances que j'essaye d'acquérir,
C'est tout à ton honneur...
en attendant, je viens sur ce forum.
Et bien continue, tu es la bienvenue!

A+ n'hésite surtout pas...
Messages postés
481
Date d'inscription
jeudi 17 mai 2007
Statut
Membre
Dernière intervention
23 décembre 2014
54
bonjour
essaie :
Range("C6").Select
nbligne = Range("C65500").End(xlUp).Row
Selection.Autofill Destination:=Range(cells(6,3),cells(nbligne,3))
Bonjour,

Merci pour la réponse.
Mais lorsque je saisis le code, le message d'erreur 1004 suivant apparaît: "erreur définie par l'application ou par l'objet". Une idée?
Puis le message suivant: "la méthode Autofill de la classe range a échoué"
Messages postés
12182
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2020
2 457
Bonjour,

Pour trouver, par VBA, la dernière ligne non vide d'une colonne, vous pouvez jeter un oeil à cette astuce CCM...
Bonjour,

Merci pour le lien mais c'est un peu du chinois pour moi.
Je veux juste étendre ma formule de la cellule C6 à la dernière de mon tableau située tjr en colonne C.

Merci
Messages postés
12182
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2020
2 457
Avez vous au moins pris le temps de :
- lire l'astuce?
- la tester?
.........
Testez déjà ceci dans votre classeur :
Sub Test()
Dim DernLigne As Long 
DernLigne = Range("C" & Rows.Count).End(xlUp).Row
MsgBox DernLigne
End Sub
J'ai bel et bien pris le temps de la lire et de la tester mais étant novice en VBA, je ne suis pas parvenue à l'adapter à mon cas.
Je vous remercie pour votre réponse, mais je ne vois pas où figure la cellule C6 à partir de laquelle je souhaite étendre ma formule; avez-vous pris le temps de lire la question?

Merci
Messages postés
12182
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2020
2 457
Bien sur que j'ai lu votre question, sinon je n'y répondrais pas.
Je ne veux pas vous donner la solution "toute cuite" car cela ne vous servirait à rien...
C6 n'est pas importante dans l'histoire car c'est une cellule que l'on connait.
Ce que l'on veux connaitre c'est le numéro de la dernière ligne non vide de la colonne C; pour pouvoir étendre notre formule jusqu'à elle.
Non?
Donc, essayez la macro de test que je vous ai donné ci-dessus, elle devrait vous donner ce qu'il vous faut.
On l'adaptera à autofill après vos tests.
La macro m'affiche le numéro de la dernière ligne, autrement dit le 450 sus-menstionné que j'aimerai, si possible, ne pas avoir saisir à chaque fois que je lance la macro.

Merci