Détecter la dernière ligne remplie

Bonjour à toutes et à tous.

Encore merci pour l'aide apportée lors de la dernière réponse.

Je vais être assez explicatif. Mon but est de détecter la dernière ligne remplie pour pouvoir mettre une ligne Total après celle-ci.

1 / J'ai un fichier avec une macro que j'ai faite qui va chercher les données d'un autre fichier (Cmde, cmde terminées, cmd en cours....)

2 / Une autre macro créé une nouvelle feuille dans mon fichier, copie les colones des données importées à l'étape 1 que dont j'ai besoin, les met en forme.

3 / Il faudrait que je puisse détecter la dernière ligne remplie, pour pouvoir faire un total sur la ligne d'après.

P.S : étant donné que je dois faire des formules, j'ai tiré ma formule jusqu'à la ligne 5000 pour être sûr d'avoir de la marge (la formule est dans la macro de mise en page). Si vous savez comment m'arrêter lorsqu'il n'y a plus de données (que ça se fasse automatiquement,si 50 lignes elle se tire jusqu'à N50, si 143 lignes elle se tire jusqu'à N143)

Merci d'avance. Steev.

Bonjour,

Tu pourrais faire cela par fomule plutôt que par macro.

Par macro voici le code qui te permet de connaitre la dernière ligne

Dim dlg as integer
dlg = Range("A65536").End(xlUp).Row

La dernière est donné par rapport à la colonne A. Donc à adapter en fonction de la colonne qui contient la somme.

L'instruction Dim peut être mise en début de macro avant le SUB...() ou avant l'instruction

Ensuite tu devras utiliser la variable "dlg" dans la formule reprise dans ta macro

Amicalement

Bonjour,

Encore merci pour l'aide apportée lors de la dernière réponse.

toi seul sait de quoi tu parles !

ou alors, continue sur le fil en question.

Sans fichier ni macro, difficile de répondre

Amicalement

Claude

édit: salut Dan, avec ta solution, sa ligne total risque de gêner, faut voir !

dubois a écrit :

Bonjour,

Encore merci pour l'aide apportée lors de la dernière réponse.

toi seul sait de quoi tu parles !

ou alors, continue sur le fil en question.Sans fichier ni macro, difficile de répondre

Amicalement

Claude

édit: salut Dan, avec ta solution, sa ligne total risque de gêner, faut voir !

Salut,

Non car c'est tout autre chose, je remercie juste pour l'aide précédente...

re,

Où sont les macros et le fichiers ?

tu as oublier de les joindre

Claude

Désolé les données sont confidentielles :s je peux en faire un de simulation si vous voulez..

re,

Effectivement ce seraiot plus simple. De plus si ton total est figée dans ta feuille, ma proposition ne fonctionnera pas (dixit Claude)

Si elle est juste en dessous du dernier chiffre de ta colonne, tu peux faire ceci :

Dim dlg as integer
dlg = Range("A65536").End(xlUp).Row-1

Mais bon rien ne vaut un fichier avec explications...

Amicalement

re,

J'ajouterais que mettre 5000 lignes de formules (en prévision) n'est surement pas la solution,

il vaudra mieux écrire ces formules uniquement sur les lignes non vides,

la macro saura faire, mais pour çà il faut un fichier.

Bonne journée

Claude

Bonjour,

Ce que tu souhaites resselble beaucoup à ce que je fais. Voici ma démarche :

  • dans une feuille je recopie des valeurs existant dans une autre, les lignes sont variables en nombre,
  • dans cette même feuille, je vais à la dernière cellule vide et place divers événements par rapport à cette cellule : écriture d'un texte, calculs de somme, dessin de bordures (pour faire joli !)...
  • j'ai pour cela deux macros qui interviennent que j'ai appelées l'une aaarange et pour l'autre bordure.
  • Voici ces macros avec des annotations (pour moi, c'est la colonne D dans laquelle j'ai la dernière cellule à prndre en compte, les valeurs de offset sont là pour se déplacer dans une autre cellule). Si tu ne veux pas de bordure, il faut supprimer les fonctions Application.run "bordures". :
Sub aaarange()
'Pour faire la somme en fin de page : 

Range("D65536").End(xlUp).Offset(1, -3).Formula = "PREVISION :"Range("D65536").End(xlUp).Offset(1, -3).Select
Selection.Font.Bold = True 'Par rapport à la dernière dellule non vide de la colonne D, la fonction Formula écrit "PREVISION" dans la colonne -3 à la cellule+1
Application.Run "bordures" 'appel de la macro bordures 
Range("D65536").End(xlUp).Offset(1, -2).Formula = "REALISATION :"Range("D65536").End(xlUp).Offset(1, -2).Select
Selection.Font.Bold = True
Application.Run "bordures"
Range("D65536").End(xlUp).Offset(1, -1).Formula = "RESTE À REALISER :"Range("D65536").End(xlUp).Offset(1, -1).Select
Selection.Font.Bold = True
Application.Run "bordures"
Range("D65536").End(xlUp).Offset(2, -3).Formula = "=SUM(D$2:D300)"Range("D65536").End(xlUp).Offset(2, -3).Select Selection.Font.Bold = True 'Idem ci-dessus mais fait la somme des valeurs de D2 à D300
Application.Run "bordures"
Range("D65536").End(xlUp).Offset(2, -2).Formula = "=SUM(E$2:E300)"Range("D65536").End(xlUp).Offset(2, -2).Select
Selection.Font.Bold = True
Application.Run "bordures"
Range("D65536").End(xlUp).Offset(2, -1).Formula = "=SUM(E$2:E300)-SUM(D$2:D300)"Range("D65536").End(xlUp).Offset(2, -1).Select
Selection.Font.Bold = True
Application.Run "bordures"
Range("D65536").End(xlUp).Offset(2, -1).Select

End Sub
'----------------------------------
Sub bordures()
'
' bordures Macro
'
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlHairline
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlThin
    End With
   Selection.Borders(xlInsideVertical).LineStyle = xlNone
   Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
End Sub
'-------------------------------------

En espérant t'avoir été utile...

re,

En attendant Steve,...

Pour Cebe, ton code pourrait être celui-ci plutôt

Sub arange()
'Pour faire la somme en fin de page :
With Range("D65536").End(xlUp)
    .Offset(1, -3).Formula = "PREVISION :"
    .Offset(1, -2).Formula = "REALISATION :"
    .Offset(1, -1).Formula = "RESTE À REALISER :"
    With Range(.Offset(1, -3), .Offset(1, -1))
        .Font.Bold = True
        .Select
        Call bordures
    End With
    .Offset(2, -3).Formula = "=SUM(D$2:D300)"
    .Offset(2, -2).Formula = "=SUM(E$2:E300)"
    .Offset(2, -1).Formula = "=SUM(E$2:E300)-SUM(D$2:D300)"
    With Range(.Offset(2, -3), .Offset(2, -1))
        .Font.Bold = True
        .Select
        Call bordures
    End With
End With

On peut encore faire mieux mais bon, là déjà ce sera plus rapide

Amicalement

Re-

Merci Dan, pour ta simplification. J'en prends bonne note, en espérant que notre camarade y trouve son bonheur...

PS : dans ta présentation il faut tout de même ajouter un End Sub, et ça fonctionne parfaitement. grand merci.

Bonne journée,

Bonjour, je reviens de vacances, désolé pour l'attente. Merci pour la solution proposée c'est nickel, seulement elle ne fonctionne pas pour un tri, quand on ne sait pas le nombre de lignes et qu'il faut trouver la fin .... il prend un chiffre .. Comment pourrais-je faire ? Merci.

Range("A1:AH" & Range("AH65536").End(xlUp).Row).Select 'Là il me trovue la dernière ligne et me sélectionne, ça c'est bon

ActiveWorkbook.Worksheets("Sort by Out of Stock Today").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sort by Out of Stock Today").Sort.SortFields.Add _
Key:=Range("A1:AH" & Range("AH65536").End(xlUp).Row), SortOn:=xlSortOnValues, Order:=xlDescending, _
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sort by Out of Stock Today").Sort
.SetRange Range("A1:AH" & Range("AH65536").End(xlUp).Row)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Il plante au .Apply, ma première ligne de code trouve bien la fin, mais pour le tri, j'ai l'impression qu'il "reselectionne". Merci.

Voici le code de base :

Range("A1:AH1276").Select
ActiveWorkbook.Worksheets("Sort by Out of Stock Today").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sort by Out of Stock Today").Sort.SortFields.Add _
Key:=Range("O2:O1276"), SortOn:=xlSortOnValues, Order:=xlDescending, _
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sort by Out of Stock Today").Sort
.SetRange Range("A1:AH1276")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Voici le code que j'ai essayé de modifier en sorte qu'il trouve la fin tout seul... sans succès... Ce code fonctionne que si j'ai 1276 lignes...

Bonjour,

Il m'arrive également de faire un tri en faisant une sélection dont le nombre de lignes varie.

J'utilise une macro dans laquelle se trouve ceci :

valtest = Range("H1")'En H1 se trouve le nombre de lignes à prendre en compte selon la formule matricielle suivante :{=MAX(SI(A1:A65528<>"";LIGNE(A1:A65528)))} 
Range("a1:d" & valtest).Select 'sélection des cellules à trier

MsgBox "Le classement va se faire... Cliquez sur Ok !" ' juste pour faire joli
ActiveWindow.SmallScroll Down:=0 'à partir de là il y a un tri qui s'effectue selon trois critères, mets ceux qui te conviennent...
Selection.Sort Key1:=Range("B1"), Order1:=xlDescending, Key2:=Range("C1") _
        , Order2:=xlDescending, Key3:=Range("D1"), Order3:=xlAscending, Header _
        :=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom _
       , DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
        xlSortNormal

Bon courage...

Salut, merci pour ta réponse.

Penses-tu que tu arrives à adapter pour mon code ? Car j'avoue que je comprends pas trop ...

Merci par avance.

P.S : SI les infos que j'ai donné ci-dessus ne sont pas assez complètes n'hésites pas à me dire.

Bonjour,

Voilà, j'essaie d'adapter ma façon de faire pour tes besoins, au cas où tu ny serais pas encore arrivé.

Analysons ton code :

Ta macro va directement à la cellule 1276 puisque tu as noté cela dans ta formule. Il faut donc remplacer ce nombre par une variable, variable dont il faut donner un nom...

Donc :

1-dans une cellule que tu ne risques pas d'effacer, je te propose de placer cette formule :{=MAX(SI(A1:A65528<>"";LIGNE(A1:A65528)))} . Dans cette cellule tu notes depuis le signe = jusqu'à la dernière parenthèse, ensuite, pour valider il faut tenir les touches CTRL et MAJ et cliquer sur ENTREE (C'est une formule dite "matricielle").

2-dans ta macro, ajoute une variable que tu appelleras... valtest (par exemple !), donne à cette variable la valeur de la cellule dans laquelle il y a la formule matricielle, puis il n'y a plus qu'à utiliser cette valeur en lieu et place de 1276, en utilisant les normes d'écriture...

Voilà, je place dans ta macro les transformations que je te propose (ce caractère "&" est l'esperluette) :

D'abord dans ta feuille (je suppose qu'elle se nomme Feuil1) dans la cellule Z1 (il te suffite de prendre une autre cellule si celle-ci est occupée) :

{=MAX(SI(A1:A65528<>"";LIGNE(A1:A65528)))}

Ensuite dans la macro :

sheets ("Feuil1").select ' [color=#FF0000]C'est pour aller dans la feuille Feuil1 au cas où l'appel de la macro à partir d'une autre feuille.[/color]
Dim valtest as Integer ' [color=#FF0000]Là c'est pour déclarer la variable[/color]
Range ("Z1").select '[color=#FF0000]La cellule Z1 est sélectionnée[/color]
valtest= Range("Z1") '[color=#FF0000]La variable valtest prend la valeur de la cellule Z1[/color]

' [color=#00BF00]Range("A1:AH1276").Select 'Je remplace cette ligne par celle qui est là-dessous :[/color]
Range ("A1:A" & valtest).select '[color=#FF0000]Le nombre a disparu au profit de valtest, attention à la place des " ".[/color]
ActiveWorkbook.Worksheets("Sort by Out of Stock Today").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sort by Out of Stock Today").Sort.SortFields.Add _
Key:=Range("O2:O1276"), SortOn:=xlSortOnValues, Order:=xlDescending, _
DataOption:=xlSortNormal '[color=#FF0000]Remplace (O2:O1276") ci-dessus par ("O2:O" & valtest)[/color]
With ActiveWorkbook.Worksheets("Sort by Out of Stock Today").Sort
.SetRange Range("A1:AH1276") '[color=#FF0000]Remplace ("A1:AH1276")  par ("A1:A" & valtest) [/color]
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Et là ça devrait fonctionner...

Bonne journée

Salut, c'est pas mal merci, seulement il fait une erreur d'exécuion 1004 "Erreur définie par l'application ou l'objet" sur la ligne :

.Apply

P.S : Voilà mon code :

    Sheets(TabName).Select  ' <span style="color: #FF0000">C'est pour aller dans la feuille Feuil1 au cas où l'appel de la macro à partir d'une autre feuille.</span>
    Dim valtest As Integer ' <span style="color: #FF0000">Là c'est pour déclarer la variable</span>
    Range("A100000").Select  '<span style="color: #FF0000">La cellule Z1 est sélectionnée</span>
    valtest = Range("A100000") '<span style="color: #FF0000">La variable valtest prend la valeur de la cellule Z1</span>

    ' <span style="color: #00BF00">Range("A1:AH1276").Select 'Je remplace cette ligne par celle qui est là-dessous :</span>
    Range("A1:A" & valtest).Select  '<span style="color: #FF0000">Le nombre a disparu au profit de valtest, attention à la place des " ".</span>
    ActiveWorkbook.Worksheets(TabName).Sort.SortFields.Clear
    ActiveWorkbook.Worksheets(TabName).Sort.SortFields.Add _
    Key:=Range("O2:O" & valtest), SortOn:=xlSortOnValues, Order:=xlDescending, _
    DataOption:=xlSortNormal '<span style="color: #FF0000">Remplace (O2:O1276") ci-dessus par ("O2:O" & valtest)</span>
    With ActiveWorkbook.Worksheets(TabName).Sort
    .SetRange Range("A1:A" & valtest)  '<span style="color: #FF0000">Remplace ("A1:AH1276")  par ("A1:A" & valtest) </span>
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
    End With

Merci.

Bonjour,

C'est difficile de savoir ce que doit être le résultat !

Je pense que ce qui se trouve entre guillemets dans la phrase incriminée peut être le nom de la feuille.

J'ai testé en plaçant les changements tels que je te les ai écrits (Key:=Range("O2:O" & valtest),... ) et le nom de la feuille au lieu de ("Sort by Out of Stock Today").

Il y a arrêt à Apply. Là je ne peux t'aider, je ne vois pas ce qui doit se placer.

Pour ma part, mon intention est seulement de t'indiquer comment demander dans la macro le fait de sélectionner autant de cellules qu'il y en a , quel que soit le nombre...

Ensuite, mes compétences abdiquent ! J'en suis bien désolé !

Bon courage pour la suite,

Ok , merci, le nom de la feuille était faux ça c'est corrigé, je dois trier sur la colonne O et ça s'appelle Out of Stock Today si ça peut t'aider

Edit : Il passe le .Apply j'ai corrigé mais il ne trie pas^^

Re-

Pourquoi ne pas utiliser cette astuce pour construire ta macro, et le tri :

Crée une macro en mode manuel que tu appelleras xxx ou ce que tu veux : enregistrer une macro, puis dans ta feuille tu fais agir les tris que tu souhaites (sélectionne une plage, puis fais faire le tri de ton choix), quand c'est fait, tu fais arrêter l'enregistrement. Ensuite dans le corps de cette macro tu reprends les parties qui correspondent au tri, et tu les places dans ta macro... Il n'y a qu'à vérifier que la plage de sélection est la bonne...

Connaissais-tu ce truc ?

Re,

J'ai réussi adapter ton code à ma sauce pour mon fichier et maintenant ça fonctionne nickel, je te remercie 1000x ça m'a beaucoup aider !

Rechercher des sujets similaires à "detecter derniere ligne remplie"