Autres Dernière ligne d'une plage comportant au moins 1 valeur supérieure à zéro

AlainProviste

XLDnaute Nouveau
Bonjour,

malgré toutes les formules que j'ai passées en revue et testées, je n'en ai trouvées aucune qui répond à mon attente particulière : je m'explique,

Je souhaite extraire la dernière ligne d'une plage de 6 colonnes sur 2500 Lignes qui contient au minimum une valeur supérieure à zéro.

A B C D E F G H I J K L
0 0 1 4 3 0 0 0 1 3 4 6
1 0 7 0 1 0
0 0 0 0 1 3
0 0 0 1 0 0
0 0 0 0 0 0
3 1 0 0 0 5
0 0 1 3 4 6
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0 etc c'est à dire 000000 jusqu'à 2500 ème ligne...
Donc ici en colonnes G1 H1 I1 J1 K1 L1 il faudrait que la valeur 0 0 1 3 4 6 soit affichée ?
Toutes les formules qui se rapprochent de mon problème me donnent : 3 1 1 3 4 6 , ce n'est pas ce que je recherche.

En espérant avoir été clair et qu'une formule "magique" puisse m'être proposée.
Par avance merci.
 
Solution
Re, Bonjour Eriiic,
Si une petite fonction perso ne vous rebute pas, c'est quand même plus simple :
VB:
Function LastValue(Pos)
Dim T, DerLig As Integer, i As Integer
LastValue = ""
DerLig = Range("A65500").End(xlUp).Row
T = Range("A2:F" & DerLig)
For i = DerLig - 1 To 1 Step -1
    If T(i, 1) > 0 Or T(i, 2) > 0 Or T(i, 3) > 0 Or T(i, 4) > 0 Or T(i, 5) > 0 Or T(i, 6) > 0 Then
        LastValue = T(i, Pos)
        Exit Function
    End If
Next i
End Function

AlainProviste

XLDnaute Nouveau
bonsoir a tous
et ben dit donc
vous en faite tout un ramdam pour un max row
restons simple ( a valider par CTRL+MAJ+ENTER)


le vba vous y tenez ??!!??
ok
VB:
MsgBox Evaluate("MAX(ROW(A1:E2500)*(A1:E2500>0))")

vous voulez le concact des 5 colonne le ligne !!?
ben c'est simple
VB:
MsgBox Join(Application.Index(Feuil1.[A1:E2500].Value, Evaluate("MAX(ROW(feuil1!A1:E30)*(feuil1!A1:E30>0))"), Array(1, 2, 3, 4, 5)))

ou même écrite comme çà pour l'array
VB:
MsgBox Join(Application.Index(Feuil1.[A1:E2500].Value, Evaluate("MAX(ROW(feuil1!A1:E2500)*(feuil1!A1:E2500>0))"), [{1, 2, 3, 4, 5}]))

Bonsoir patricktoulon,

il n'est pas question ici de faire une "fixette" sur le VBA mais d'adapter une macro ou autre au problème posé. Or ton premier cas donne "12" , ce n'est pas le but recherché,
S'agissant des autres cas, le résultat affiche une msgbox qui n'est d'aucune utilité dans le cas présent car inexploitable pour la suite du programme.
Mais "MAX Row" est à retenir, peut-être, pour un autre problème ?
Merci pour ton intervention...
Cordialement
Alain
 

AlainProviste

XLDnaute Nouveau
re
bonsoir
le msgbox n'est qu'un exemple de ce que l'on peut faire avec la formule
tu voulais le concat A:E de la dernière ligne avec au moins 1?
ben tu l'a en une seule ligne ;)

re,
j'ai supprimé msgbox pour ne conserver que :
(Application.Index(Feuil1.[A1:E2500].Value, Evaluate("MAX(ROW(feuil1!A1:E2500)*(feuil1!A1:E2500>0))"), [{1, 2, 3, 4, 5}]))

et là ...que du rouge ? Comment écrire stp cette formule sans msgbox ?
 

AlainProviste

XLDnaute Nouveau
oulah !! comme tu écris, il y a du boulot !...
. Mais si j'étais bon en informatique, le débutant que je suis ne demanderait pas de l'aide.

j'avais écrit avant ton post ceci et cela m'affichait , oups ! : (j'ai en fait 6 colonnes dans l'énoncé)
0 1 2 2 0 00 1 2 2 0 00 1 2 2 0 00 1 2 2 0 00 1 2 2 0 00 1 2 2 0 0
Sheets("feuil1").Range("S13:X13").Value = Join(Application.Index(Feuil1.[I1:N2500].Value, Evaluate("MAX(ROW(feuil1!I1:N2500)*(feuil1!I1:N2500>0))"), [{1,2,3,4,5,6 }]))

Le[B1] que tu me proposes m'affiche 0 ! ??
 

patricktoulon

XLDnaute Barbatruc
d'accord tu ne le veux pas dans une mais chaque chiffre dans une colonne a partir de X 13
donc on concat pas
Sheets("feuil1").Range("S13:X13").Value = Application.Index(Feuil1.[I1:N2500].Value, Evaluate("MAX(ROW(feuil1!I1:N2500)*(feuil1!I1:N2500>0))"), [{1,2,3,4,5,6 }])
 

patricktoulon

XLDnaute Barbatruc
comme tu vois ma formule fonctionne très bien
elle donne bien la dernière ligne ayant au moins + de 1
le résultat tu le met ou tu veux après
VB:
Sub test()
Sheets("feuil1").Range("S1:X1").Value = Application.Index(Feuil1.[I1:N2500].Value, Evaluate("MAX(ROW(feuil1!I1:N2500)*(feuil1!I1:N2500>0))"), [{1,2,3,4,5,6 }])
End Sub

demo6.gif
 

AlainProviste

XLDnaute Nouveau
Bonjour patricktoulon,

merci de t'être creusé les méninges pour moi !
Afin que tu comprennes pourquoi ton code ne fonctionne qu'en parties je te joins un fichier qui je l'espère sera plus explicatif.

Ce qui me parait bizarre c'est que les précédents intervenants (Silvanu, eriic et job75 ) n'avaient pas non plus ce fichier et ça fonctionnait correctement ? Mystère pour moi..?

Bonne journée surtout qu'à Toulon il y a du soleil...
 

Pièces jointes

  • ECARTS.xlsm
    146.5 KB · Affichages: 22

patricktoulon

XLDnaute Barbatruc
RE
c'est quoi ce fichier :eek:
visiblement le travail que tu fais dessus ne correspond pas a la demande initiale
c'est donc par chance que les autres t'on compris
pour rappel je te cite(post#1)
Je souhaite extraire la dernière ligne d'une plage de 6 colonnes sur 2500 Lignes qui contient au minimum une valeur supérieure à zéro.
et ce que je t'ai donné fait exactement et uniquement çà( j'ai testé avant de te la donner)
bref si tu a ce qu'il te faut tant mieux
perso a la vue de ton fichier qui pique les yeux je vais même pas chercher a comprendre ce que tu cherche a faire
bon courage ;)
 

patricktoulon

XLDnaute Barbatruc
re
ben quoi
tu a posé une question claire
je t'ai répondu clairement (macro clé en main travail tout mâché)
et tu me montre un fichier dont le travail fait dessus n'a rien a voir avec la demande
on en est au post 28 et ton truc n'est toujours pas résolu
pose toi les bonnes questions ;)
je rappelle pour info qu'une démo animée te montre que ca fonctionne en post 25 ;)
bref OK;)
 

Discussions similaires

Réponses
7
Affichages
322

Statistiques des forums

Discussions
312 100
Messages
2 085 294
Membres
102 854
dernier inscrit
ADRIENVR