Rechercher et copier la dernière valeur numérique d'une colonne
Bonjour,
Je suis un noob en VBA.
Je voudrais savoir si c'est possible de pouvoir récupérer par une macro la dernière valeur numérique d'une colonne et le copier ailleurs avec sa date associée.
En effet je récupère un fichier qui s'incrémente chaque jour (donc le jean change de ligne chaque jour vers le bas), qui sur une colonne a un titre en texte et fini par une ligne de texte. Il y a également des cellules vides.
J'ai mis un fichier exemple pour être plus clair.
La je voudrais récupérer le "3" et le copier ailleurs.
J'ai essayé en faisant une plage excluant la ligne contenant "jean" mais ça ne fonctionne pas. Peut être une fonction If mais je n'y arrive pas. Je sollicite donc votre aide.
Merci d'avance.
Bonjour,
Le résultat est bon
En gros j'ai plein de fichiers de ce type qui sont générés et j'ai besoin d'avoir dans un fichier de synthèse les derniers résultats disponibles, d'où la volonté d'avoir une macro à lancer qui viendrait chercher la dernière valeur numérique.
Bonjour,
Une piste :
Sub Test()
Dim Col As Long
Dim Lig As Long
Dim Valeur
Col = 2
With Worksheets("Feuil1")
Lig = .Rows.Count
Do
Lig = .Cells(Lig, Col).End(xlUp).Row 'sur colonne B
Valeur = .Cells(Lig, Col).Value
Loop Until IsNumeric(Valeur) Or Lig = 1
End With
If IsNumeric(Valeur) Then MsgBox "Valeur numérique la plus basse : " & Valeur Else MsgBox "Aucune valeur numérique dans la colonne !"
End Sub
La boucle permet d'éviter les valeurs textes.
La voici sous forme de fonction pour pouvoir l'utiliser directement dans Excel :
Function ValeurNum(Col As Long)
Dim Lig As Long
Dim Valeur
With Worksheets("Feuil1")
Lig = .Rows.Count
Do
Lig = .Cells(Lig, Col).End(xlUp).Row 'sur colonne B
Valeur = .Cells(Lig, Col).Value
Loop Until IsNumeric(Valeur) Or Lig = 1
End With
If IsNumeric(Valeur) Then ValeurNum = Valeur Else ValeurNum = "#N/A"
End Function
que tu utilises de cette façon :
=ValeurNum(2)
ou 2 est le numéro de la colonne !
si pas trouvé de valeur numérique, la fonction retourne #N/A
Bonjour,
Un exemple.
Cdlt.
Public Sub CopyValues()
Dim rng As Range, lastRow As Long, Lrow As Long
Const LMAX As Double = 9.99999999999999E+307
With ActiveSheet
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
Set rng = .Cells(1).Resize(lastRow, 2)
Lrow = Application.Match(LMAX, rng.Columns(2), 1)
.Cells(4).Value = Application.Index(rng.Columns(1), Lrow)
.Cells(5).Value = Application.Index(rng.Columns(2), Lrow)
End With
End Sub
Bonjour à tous,
Sub Recup()
MsgBox Evaluate("=LOOKUP(9.99999999999999E+307,B1:B20)")
End Sub
Bonjour,
Un exemple.
Cdlt.
Classeur1.xlsm
Public Sub CopyValues() Dim rng As Range, lastRow As Long, Lrow As Long Const LMAX As Double = 9.99999999999999E+307 With ActiveSheet lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row Set rng = .Cells(1).Resize(lastRow, 2) Lrow = Application.Match(LMAX, rng.Columns(2), 1) .Cells(4).Value = Application.Index(rng.Columns(1), Lrow) .Cells(5).Value = Application.Index(rng.Columns(2), Lrow) End With End Sub
Tous d'abord merci à tous pour les réponses et les pistes, et la réactivité.
Je vais partir sur la solution de Jean-Eric en essayant de la comprendre (éviter de recopier bêtement).
Les 2 dernières lignes de codes renvoient les résultats.
Du coup ma question va être la suivante: J'ajoute une 2ème variable en C, et si je veux l'appliquer sur cette colonne et plus sur la B, je dois changer le range je pense ou le lrow.
Re,
Une mise à jour de ce que je comprends ?
Tu préciseras !...
Cdlt.
Public Sub CopyValues()
'Déclaration des variables
Dim rng As Range, lastRow As Long, Lrow As Long, lRow2 As Long
Const LMAX As Double = 9.99999999999999E+307
With ActiveSheet
'Dernière ligne non vide colonne 1 (A)
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
'Plage de cellules variable (x lignes et 3 colonnes)
Set rng = .Cells(1).Resize(lastRow, 3)
'Position de la dernière valeur numérique colonne 2 (B)
Lrow = Application.Match(LMAX, rng.Columns(2), 1)
'Position de la dernière valeur numérique colonne 3 (C)
lRow2 = Application.Match(LMAX, rng.Columns(3), 1)
'Restitution des valeurs suivant position
'Colonne 2 (B)
.Cells(1, 6).Value = Application.Index(rng.Columns(1), Lrow)
.Cells(1, 7).Value = Application.Index(rng.Columns(2), Lrow)
'Colonne 3 (C)
.Cells(2, 6).Value = Application.Index(rng.Columns(1), lRow2)
.Cells(2, 7).Value = Application.Index(rng.Columns(3), lRow2)
End With
End Sub
Avec les explications c'est génial merci.
Juste pour parfaitement comprendre.
Set rng = .Cells(1).Resize(lastRow, 3)
Le .cells(1) renvoie à quoi? Le lastRow, 3 je comprends mais pas le .cells(1).
Rebonjour,
Je reviens vers vous car j'ai une question.
Je voudrais exporter les résultats vers un autre classeur.
[code][/Public Sub CopyValues()
'Déclaration des variables
'Ma feuille de départ
Dim sh As Worksheet
Set bilan = ActiveSheet
Dim rng As Range, lastRow As Long, Lrow As Long, lRow2 As Long
Const LMAX As Double = 9.99999999999999E+307
'j'ouvre le classeur qui contient les données à rapatrier
Workbooks.Open Filename:= _
"Bob.xlsm"
With ActiveSheet
'Dernière ligne non vide colonne 1 (A)
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
'Plage de cellules variable (x lignes et 3 colonnes)
Set rng = .Cells(1).Resize(lastRow, 3)
'Position de la dernière valeur numérique colonne 2 (B)
Lrow = Application.Match(LMAX, rng.Columns(2), 1)
'Position de la dernière valeur numérique colonne 3 (C)
lRow2 = Application.Match(LMAX, rng.Columns(3), 1)
End With
bilan.activate
With ActiveSheet
'Restitution des valeurs suivant position
'Colonne 2 (B)
.Cells(1, 6).Value = Application.Index(rng.Columns(1), Lrow)
.Cells(1, 7).Value = Application.Index(rng.Columns(2), Lrow)
'Colonne 3 (C)
.Cells(2, 6).Value = Application.Index(rng.Columns(1), lRow2)
.Cells(2, 7).Value = Application.Index(rng.Columns(3), lRow2)
End With
End Subcode]
Ca n'a pas l'air de fonctionner. Si quelqu'un peut m'aider.
Bonjour,
Essaie ceci (sans grande conviction).
Sinon Cells(1)=Cells(1,1) soit A1
A te relire.
Cdlt.
Sub CopyValues()
'Déclaration des variables
Dim sh As Worksheet
Dim rng As Range, lastRow As Long, Lrow As Long, lRow2 As Long
Const LMAX As Double = 9.99999999999999E+307
'Ma feuille de départ
Set bilan = ActiveSheet
'j'ouvre le classeur qui contient les données à rapatrier
Workbooks.Open Filename:="Bob.xlsm"
With ActiveWorkbook.Worksheets("xxx") 'xxx nom de la feuille (à définir)
'Dernière ligne non vide colonne 1 (A)
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
'Plage de cellules variable (x lignes et 3 colonnes)
Set rng = .Cells(1).Resize(lastRow, 3)
'Position de la dernière valeur numérique colonne 2 (B)
Lrow = Application.Match(LMAX, rng.Columns(2), 1)
'Position de la dernière valeur numérique colonne 3 (C)
lRow2 = Application.Match(LMAX, rng.Columns(3), 1)
End With
With bilan
'Restitution des valeurs suivant position
'Colonne 2 (B)
.Cells(1, 6).Value = Application.Index(rng.Columns(1), Lrow)
.Cells(1, 7).Value = Application.Index(rng.Columns(2), Lrow)
'Colonne 3 (C)
.Cells(2, 6).Value = Application.Index(rng.Columns(1), lRow2)
.Cells(2, 7).Value = Application.Index(rng.Columns(3), lRow2)
End With
End Sub
Bonsoir Jean-Eric,
Sur mon fichier test, le code fonctionne. Je vais le tester sur des vrais données durant le week-end ou début de semaine prochaine.
Merci pour ta pédagogie.
Cordialement