Recopie de formule jusqu'à la dernière ligne non vide

Bonjour,

J'aimerai solliciter vos conseils pour mon fichier actuel.

Sur ma feuille "calcul notes", il des formules automatisées via VBA, ma problématique se situe au niveau de la recopie des formules sur les lignes en dessous. Je voudrai que la recopie s'arrête à la dernière ligne non vide en fonction des références de la 1ère colonne.

Aussi, mes formules s'activent pour la feuille active, et pour cause, si je ne suis pas positionné sur la bonne feuille, ma formule s'exécute et fausse les résultat.

Si mon descriptif n'est pas assez clair, je me ferai un plaisir de plus le détailler.

Dans l'attente de vous lire,

Cordiales salutations,

Bonjour,

En modifiant cette macro :

Sub quantité_sortie()
'
' Macro8 Macro
'
Dim L As Long
L = Cells(Rows.Count, 1).End(xlUp).Row
Range("F3").Select
    ActiveCell.FormulaR1C1 = _
        "=SUMIFS(Sortie_qté,Date_Sortie,"">=""&'Référence pour le calcul'!R4C38,Sortie_qté,""<=""&'Référence pour le calcul'!R3C38,Référence_Article,'calcul notes'!RC[-5])"
    Range("F3").Select
    Selection.AutoFill Destination:=Range("F3:F" & L)
    Range("F3:F200").Select
End Sub

Daniel

Bonjour,

Avez-vous pensé à convertir votre tableau en tableau structuré?

Lorsque vous ajoutez une nouvelle référence en colonne A, les formules s'ajoutent automatiquement, pas besoin de VBA.

Votre fichier avec le tableau de la feuille "calcul notes" converti en tableau structuré.

Cdlt

Je vous remercie pour vos retours (très rapides), ça m'a beaucoup aidé.

Une dernière requête, comment faire pour contourner la commande "activecell" car si je ne suis pas sur la bonne feuille lors de l'exécution de la commande, elle écrase les données de la feuille active.

Cordiales salutaions

Il suffit simplement de mettre le nom de la feuille en question devant la plage de cellules, ce qui donne, par exemple pour la macro suivante:

Sub quantité_entrée()
Range("E3").Select
    ActiveCell.FormulaR1C1 = _
        "=SUMIFS(Entrée_qté,Date_entrée,""<=""&'Référence pour le calcul'!R[1]C[32],Date_entrée,""<=""&'Référence pour le calcul'!RC[32],Référence_Article,'calcul notes'!RC[-4])"
    Range("E3").Select
    Selection.AutoFill Destination:=Range("E3:E200")

End Sub

pourrait s'écrire:

Sub quantité_entrée()
    Sheets("calcul notes").Range("E3:E200").FormulaR1C1 = "=SUMIFS(Entrée_qté,Date_entrée,""<=""&'Référence pour le calcul'!R[1]C[32],Date_entrée,""<=""&'Référence pour le calcul'!RC[32],Référence_Article,'calcul notes'!RC[-4])"
End Sub

On ne sélectionne jamais directement la feuille, ni la cellule ou plage de cellules.

A adopter le même principe pour les autres macros.

CDlt

Je vous remercie pour votre retour et vos conseils.

Le code est bien opérationnel dans ma base.

Cordiales salutations

Bonjour,

Sur la feuil3 "Résultat", j'ai inséré un code qui reprend les 20 meilleures références en fonction de la note. Cependant, le code s'enclenche automatiquement dès qu'on clique sur cette dernière. Je voudrai bien insérer un bouton mais toutes mes tentatives tombent à l'eau.

En outre, sur la feuil6 "Historique" j'ai inséré un code qui va reprendre à chaque l'historique des références affichées sur la feuil3 "résultat" et l'incrémenter sur la dernière ligne vide à chaque fois. Une fois de plus, ce code ne s'exécute pas (il ne copie que les entêtes)

Je vous remercie fortement pour votre altruisme et votre aide,

Cordiales salutations

Moussa

Bonjour,

Tout d'abord, je reviens sur mon dernier post, la formule que j'ai proposé, prend en compte le nom de la feuille ainsi que la plage complète de destination, donc partant de là, il est inutile de la reproduire la formule jusqu'à la dernière ligne. Votre macro doit s'écrire comme ceci:

Sub quantité_entrée()
    Dim L As Long
    L = Cells(Rows.Count, 1).End(xlUp).Row
    Sheets("calcul notes").Range("E3:E" & L).FormulaR1C1 = _
        "=SUMIFS(Entrée_qté,Date_entrée,""<=""&'Référence pour le calcul'!R[1]C[32],Date_entrée,""<=""&'Référence pour le calcul'!RC[32],Référence_Article,'calcul notes'!RC[-4])"
End Sub

Sheets("calcul notes").Range("E3:E" & L) remplace tout cela: Sheets("calcul notes").Range("E3").AutoFill Destination:=Range("E3:E" & L)

**************************************************************************************************************************************************

Pour toutes les macros qui ne sont pas des macros évènementielles (telles que "Worksheet_SelectionChange", "Worksheet_SelectionChange", et autres, ...) il faut les mettre dans un module standard et non pas dans le module de la feuille et, les attribuer à un bouton.

Je vous laisse le soin d'appliquer ces principes, et si malgré cela vous n'arrivez toujours pas à faire fonctionner les macros, je regarderai, mais essayez de vous en sortir tout seul et dites-moi si vous y êtes arrivé.

Cdlt

Bonjour,

Effectivement, le second code pour les formules est plus adéquat. Je l'ai bien renseigné et il fonctionne.

Pour le macro évènementiel, je l'ai recopié dans mon module 1 et il fonctionne en temps normal.

Le seul Hic c'est que si la cellule active se trouve dans une autre feuille que "résultat", il écrase les données de celles-ci, pourtant il n'y a pas de "Activecell ou Activesheets" dans mon code.

Dans ma feuille "historique d'inventaire", j'ai inséré un code pour incrémenter à chaque fois le résultat obtenu dans la feuille "résultat", celui plante également.

Cordialement

Pour info,

J'arrive finalement à faire la recopie pour ma feuille "historique d'inventaire"

grâce au code :

Sub copier_debutfin_coller_variable()

Dim ws_résultat As Worksheet

Dim ws_historique As Worksheet

Set ws_résultat = Worksheets(5)

Set ws_historique = Worksheets(6)

der_ligne_1 = ws_résultat.Cells(Rows.Count, 1).End(xlUp).Row
der_ligne_2 = ws_historique.Cells(Rows.Count, 1).End(xlUp).Row

ws_résultat.Range(ws_résultat.Cells(2, 1), ws_résultat.Cells(der_ligne_1, 6)).Copy ws_historique.Cells(der_ligne_2 + 1, 1)

ws_historique.Cells.Columns.AutoFit

End Sub

Fais attention. Si la feuille ws_résultat n'est pas la feuille active, la macro devrait planter. Il faut mettre :

With ws_résultat
  der_ligne_1 = .Cells(.Rows.Count, 1).End(xlUp).Row
End With

"ws_résultat.Cells" fait référence à la feuille ws_résultat et "Rows" fait référence à la feuille active.

Daniel

Daniel,

Merci, pour ceci.

J'avais assigné un bouton au code en question et j'imagine que c'est pour cela que ça n'avait pas planté.

Mais j'ai intégré votre solution au cas où.

Avez-vous une idée de comment je pourrais exécuter ce code sans forcément être sur la feuille "résultat" ?

Auquel cas, la formule écrase les données de la feuille active autre que "résultat".

code :

Sub résultat_top20_ref()
    Application.ScreenUpdating = False
    Cells.Clear
            With Sheets("Calcul note")
                 DL = .[A65500].End(xlUp).Row
                 Range("A1:S" & DL - 1) = .Range("A2:S" & DL).Value
            End With

                    [A:S].Resize(DL - 1).Sort key1:=[S1], order1:=xlDescending, Header:=xlYes

                        Rows("22:10000").Delete Shift:=xlUp
                        Range("E:F,I:Q").Delete Shift:=xlToLeft

                    Columns("A:S").EntireColumn.AutoFit

            With [A1:I21].Borders
                .LineStyle = xlContinuous: .Weight = xlThin: .Color = vbBlue
            End With

    [A1:I1].Interior.Color = RGB(220, 230, 240)

End Sub

Cordialement,

Là où tu écris Range sans un nom de feuille devant, ou un point si tu es à l'intérieur d' un With/End With, tu écris sur la feuille active, quelle qu'elle soit.

Daniel

Rechercher des sujets similaires à "recopie formule derniere ligne vide"